"use strict"; /* tslint:disable */ /* eslint-disable */ /** * The Plaid API * The Plaid REST API. Please see https://plaid.com/docs/api for more details. * * The version of the OpenAPI document: 2020-09-14_1.617.1 * * * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech). * https://openapi-generator.tech * Do not edit the class manually. */ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CraBankIncomeCompleteResult = exports.CraBankIncomeBonusType = exports.CountryCode = exports.CounterpartyType = exports.ConsumerReportPermissiblePurpose = exports.ConsumerDisputeCategory = exports.ConsentEventType = exports.ConsentEventInitiator = exports.ConsentEventCode = exports.CashflowAttributesVersion = exports.BeaconUserStatus = exports.BeaconReportType = exports.BeaconReportCreateType = exports.BeaconMatchSummaryCode = exports.BeaconAuditTrailSource = exports.BeaconAccountRiskEvaluateEvaluationReason = exports.BaseReportWarningCode = exports.BaseReportTransactionType = exports.BankTransferType = exports.BankTransferStatus = exports.BankTransferNetwork = exports.BankTransferEventType = exports.BankTransferEventListDirection = exports.BankTransferEventListBankTransferType = exports.BankTransferDirection = exports.BankIncomeRefreshCompleteResult = exports.BankIncomeCompleteResult = exports.BalancePlusRiskLevel = exports.AuthUpdateTypes = exports.AssetType = exports.AssetTransactionType = exports.AssetTransactionCategoryType = exports.AssetReportType = exports.AssetReportTransactionType = exports.AssetReportAddOns = exports.AddressPurposeLabel = exports.ActivityType = exports.ActionState = exports.AccountVerificationInsightsAccountNumberFormat = exports.AccountType = exports.AccountSubtype = exports.AccountSelectionCardinality = exports.AccountIdentityMatchScoreVerificationStatusEnum = exports.AccountIdentityDocumentUploadVerificationStatusEnum = exports.AccountIdentityVerificationStatusEnum = exports.AccountHolderCategory = exports.AccountBaseVerificationStatusEnum = exports.AccountAssetsVerificationStatusEnum = exports.APRAprTypeEnum = exports.ACHClass = void 0; exports.FraudCheckOutcome = exports.Form1099Type = exports.FDXPartyType = exports.FDXPartyRegistry = exports.FDXNotificationType = exports.FDXNotificationSeverity = exports.FDXNotificationPriority = exports.FDXNotificationPayloadIdType = exports.FDXNotificationCategory = exports.FDXHateoasLinkAction = exports.FDXContentTypes = exports.ExpirationDate = exports.EntityWatchlistCode = exports.EntityDocumentType = exports.EnrichTransactionDirection = exports.EmploymentVerificationStatus = exports.EmploymentSourceType = exports.EmailTypeEnum = exports.EarningsBreakdownCanonicalDescription = exports.DocumentStatus = exports.DocumentNameMatchCode = exports.DocumentDateOfBirthMatchCode = exports.DocumentAuthenticityMatchCode = exports.DocType = exports.DepositoryAccountSubtype = exports.DepositSwitchTargetAccountAccountSubtypeEnum = exports.DepositSwitchGetResponseSwitchMethodEnum = exports.DepositSwitchGetResponseStateEnum = exports.DepositSwitchCreateRequestCountryCodeEnum = exports.DepositSwitchAltCreateRequestCountryCodeEnum = exports.DataSources = exports.DashboardUserStatus = exports.CreditSessionBankIncomeStatus = exports.CreditSessionBankEmploymentStatus = exports.CreditPayStubPayBasisType = exports.CreditBankIncomeWarningType = exports.CreditBankIncomeWarningCode = exports.CreditBankIncomePayFrequency = exports.CreditBankIncomeErrorType = exports.CreditBankIncomeCategory = exports.CreditBankIncomeAccountType = exports.CreditBankEmploymentWarningType = exports.CreditAccountSubtype = exports.CreditACHClass = exports.CraPDFAddOns = exports.CraLoanType = exports.CraLoanStatus = exports.CraLoanPaymentSchedule = exports.CraLoanApplicationDecision = exports.CraBankIncomeWarningCode = void 0; exports.OwnershipType = exports.OverrideAccountType = exports.OtherAccountSubtype = exports.OriginatorExpectedTransferFrequency = exports.OmittableTransferType = exports.NetworkStatusGetResponseNetworkStatus = exports.MonitoringItemStatusCode = exports.MonitoringInsightsStatus = exports.MonitoringConsumerReportPermissiblePurpose = exports.MatchSummaryCode = exports.LoanIdentifierType = exports.LoanAccountSubtype = exports.LinkTokenCreateRequestAuthFlowTypeEnum = exports.LinkTokenCreateRequestAuthRerouteToCredentialsEnum = exports.LinkSessionSuccessMetadataTransferStatus = exports.LinkEventName = exports.LinkDeliveryWebhookDeliveryStatus = exports.LinkDeliveryWebhookCommunicationMethod = exports.LinkDeliveryWebhookCallbackType = exports.LinkDeliveryVerificationStatus = exports.LinkDeliverySessionStatus = exports.LinkDeliveryDeliveryMethod = exports.ItemWithConsentFieldsUpdateTypeEnum = exports.ItemCreateAuthentication = exports.ItemConsentedDataScope = exports.ItemAuthMethod = exports.ItemUpdateTypeEnum = exports.IssuingCountry = exports.IssuesStatus = exports.InvestmentTransactionType = exports.InvestmentTransactionSubtype = exports.InvestmentAccountSubtype = exports.IndividualWatchlistCode = exports.IncomeVerificationSourceType = exports.IncomeVerificationPrecheckConfidence = exports.IncomeVerificationPayrollFlowType = exports.IncomeVerificationDocParsingConfig = exports.IncomeBreakdownType = exports.IncidentUpdateStatusEnum = exports.ImageQualityOutcome = exports.ImageQuality = exports.IdentityVerificationStepStatus = exports.IdentityVerificationStatus = exports.IdentityVerificationAutofillStatus = exports.IdentityUpdateTypes = exports.ISOCurrencyCode = exports.IDNumberType = exports.HostedLinkDeliveryMethod = exports.HiddenMatchSummaryCode = exports.FraudCheckOutcomeWithNoData = void 0; exports.RiskCheckEmailTopLevelDomainIsSuspicious = exports.RiskCheckEmailIsDeliverableStatus = exports.RiskCheckEmailDomainIsFreeProvider = exports.RiskCheckEmailDomainIsDisposable = exports.RiskCheckEmailDomainIsCustom = exports.RiskCheckBehaviorUserInteractionsLabel = exports.RiskCheckBehaviorFraudRingDetectedLabel = exports.RiskCheckBehaviorBotDetectedLabel = exports.ReportType = exports.RecurringTransactionFrequency = exports.RecurringFrequency = exports.RecommendationString = exports.ProxyType = exports.ProgramNameSensitivity = exports.Products = exports.ProductStatusBreakdownRefreshIntervalEnum = exports.ProductStatusStatusEnum = exports.ProcessorTokenCreateRequestProcessorEnum = exports.PrismProduct = exports.PrismInsightsVersion = exports.PrismFirstDetectVersion = exports.PrismCashScoreVersion = exports.PlaidErrorType = exports.PhysicalDocumentCategory = exports.PhoneType = exports.PhoneNumberTypeEnum = exports.PendingDisconnectWebhookReason = exports.PaystubPayFrequency = exports.PaymentScheme = exports.PaymentScheduleInterval = exports.PaymentProfileStatus = exports.PaymentInitiationPaymentStatus = exports.PaymentInitiationPaymentCreateStatus = exports.PaymentInitiationConsentType = exports.PaymentInitiationConsentStatus = exports.PaymentInitiationConsentScope = exports.PaymentInitiationConsentProcessingMode = exports.PaymentConsentPeriodicInterval = exports.PaymentConsentPeriodicAlignment = exports.PaymentChannel = exports.PaymentAmountCurrency = exports.PayPeriodDetailsPayFrequency = exports.PayFrequencyValue = exports.PartyRoleType = exports.PartnerEndCustomerStatus = exports.PartnerEndCustomerQuestionnaireStatus = exports.PartnerEndCustomerOAuthStatusUpdatedValues = exports.PartnerEndCustomerOAuthInstitutionApplicationStatus = exports.PartnerEndCustomerFlowdownStatus = exports.POBoxStatus = void 0; exports.TransferDocumentPurpose = exports.TransferDiligenceStatus = exports.TransferCreditFundsSource = exports.TransferBalanceType = exports.TransferAuthorizationRiskLevel = exports.TransferAuthorizationGuaranteeDecisionRationaleCode = exports.TransferAuthorizationGuaranteeDecision = exports.TransferAuthorizationDecisionRationaleCode = exports.TransferAuthorizationDecision = exports.TransferACHNetwork = exports.TransactionsUpdateStatus = exports.TransactionsRuleType = exports.TransactionsRuleField = exports.TransactionStreamStatus = exports.TransactionCode = exports.TransactionBaseTransactionTypeEnum = exports.TransactionAllOfPaymentChannelEnum = exports.TransactionPaymentChannelEnum = exports.TransactionTransactionTypeEnum = exports.TotalCanonicalDescription = exports.TaxpayerIdentifierType = exports.SweepTrigger = exports.SweepStatus = exports.StudentRepaymentPlanTypeEnum = exports.StudentLoanStatusTypeEnum = exports.Strategy = exports.StatementsRefreshCompleteResult = exports.Source = exports.SignalScheduleDefaultPaymentMethod = exports.SignalPaymentMethod = exports.SignalDecisionOutcome = exports.ServiceProductFulfillmentIdentifier = exports.SelfieStatus = exports.SelfieCheckStatus = exports.SelfieAnalysisLivenessCheck = exports.SelfieAnalysisFacialAnalysisOutcome = exports.SelfieAnalysisDocumentComparison = exports.ScopesContext = exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum = exports.SandboxItemFireWebhookRequestWebhookCodeEnum = exports.SandboxIncomeWebhookFireRequestWebhookCode = exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum = exports.SandboxBankIncomeWebhookFireRequestWebhookCode = exports.SMSVerificationStatus = exports.RiskSignalFileType = exports.RiskSignalDocumentType = exports.RiskSignalDocumentStatus = exports.RiskLevelWithNoData = exports.RiskLevel = exports.RiskCheckLinkedService = void 0; exports.PlaidApi = exports.PlaidApiFactory = exports.PlaidApiFp = exports.PlaidApiAxiosParamCreator = exports.YieldRateType = exports.WebhookType = exports.WebhookEnvironmentValues = exports.WeakAliasDetermination = exports.WatchlistScreeningStatus = exports.WatchlistScreeningIndividualUpdateRequestResettableField = exports.WatchlistScreeningHitStatus = exports.WatchlistScreeningEntityUpdateRequestResettableField = exports.WatchlistScreeningDocumentType = exports.WarningWarningCodeEnum = exports.WalletTransactionStatus = exports.WalletTransactionRelationTypeEnum = exports.WalletTransactionGetResponseTypeEnum = exports.WalletTransactionFailureReason = exports.WalletTransactionTypeEnum = exports.WalletStatus = exports.WalletPaymentScheme = exports.WalletISOCurrencyCode = exports.VerifySMSDetailsStatus = exports.VerificationStatus = exports.VerificationRefreshStatus = exports.UserStatedIncomeSourcePayType = exports.UserStatedIncomeSourceFrequency = exports.UserStatedIncomeSourceCategory = exports.TransferType = exports.TransferSweepStatus = exports.TransferStatus = exports.TransferScheduleIntervalUnit = exports.TransferRefundStatus = exports.TransferRecurringStatus = exports.TransferRecurringNetwork = exports.TransferNetwork = exports.TransferLedgerSweepSimulateEventType = exports.TransferIntentStatus = exports.TransferIntentCreateNetwork = exports.TransferIntentCreateMode = exports.TransferIntentAuthorizationDecision = exports.TransferEventType = exports.TransferEventListTransferType = void 0; const axios_1 = __importDefault(require("axios")); // Some imports not used depending on template conditions // @ts-ignore const common_1 = require("./common"); // @ts-ignore const base_1 = require("./base"); /** * Specifies the use case of the transfer. Required for transfers on an ACH network. For more details, see [ACH SEC codes](https://plaid.com/docs/transfer/creating-transfers/#ach-sec-codes). Codes supported for credits: `ccd`, `ppd` Codes supported for debits: `ccd`, `tel`, `web` `\"ccd\"` - Corporate Credit or Debit - fund transfer between two corporate bank accounts `\"ppd\"` - Prearranged Payment or Deposit - the transfer is part of a pre-existing relationship with a consumer, e.g. bill payment `\"tel\"` - Telephone-Initiated Entry `\"web\"` - Internet-Initiated Entry - debits from a consumer’s account where their authorization is obtained over the Internet * @export * @enum {string} */ var ACHClass; (function (ACHClass) { ACHClass["Ccd"] = "ccd"; ACHClass["Ppd"] = "ppd"; ACHClass["Tel"] = "tel"; ACHClass["Web"] = "web"; })(ACHClass = exports.ACHClass || (exports.ACHClass = {})); /** * @export * @enum {string} */ var APRAprTypeEnum; (function (APRAprTypeEnum) { APRAprTypeEnum["BalanceTransferApr"] = "balance_transfer_apr"; APRAprTypeEnum["CashApr"] = "cash_apr"; APRAprTypeEnum["PurchaseApr"] = "purchase_apr"; APRAprTypeEnum["Special"] = "special"; })(APRAprTypeEnum = exports.APRAprTypeEnum || (exports.APRAprTypeEnum = {})); /** * @export * @enum {string} */ var AccountAssetsVerificationStatusEnum; (function (AccountAssetsVerificationStatusEnum) { AccountAssetsVerificationStatusEnum["AutomaticallyVerified"] = "automatically_verified"; AccountAssetsVerificationStatusEnum["PendingAutomaticVerification"] = "pending_automatic_verification"; AccountAssetsVerificationStatusEnum["PendingManualVerification"] = "pending_manual_verification"; AccountAssetsVerificationStatusEnum["ManuallyVerified"] = "manually_verified"; AccountAssetsVerificationStatusEnum["VerificationExpired"] = "verification_expired"; AccountAssetsVerificationStatusEnum["VerificationFailed"] = "verification_failed"; AccountAssetsVerificationStatusEnum["DatabaseMatched"] = "database_matched"; })(AccountAssetsVerificationStatusEnum = exports.AccountAssetsVerificationStatusEnum || (exports.AccountAssetsVerificationStatusEnum = {})); /** * @export * @enum {string} */ var AccountBaseVerificationStatusEnum; (function (AccountBaseVerificationStatusEnum) { AccountBaseVerificationStatusEnum["AutomaticallyVerified"] = "automatically_verified"; AccountBaseVerificationStatusEnum["PendingAutomaticVerification"] = "pending_automatic_verification"; AccountBaseVerificationStatusEnum["PendingManualVerification"] = "pending_manual_verification"; AccountBaseVerificationStatusEnum["ManuallyVerified"] = "manually_verified"; AccountBaseVerificationStatusEnum["VerificationExpired"] = "verification_expired"; AccountBaseVerificationStatusEnum["VerificationFailed"] = "verification_failed"; AccountBaseVerificationStatusEnum["DatabaseMatched"] = "database_matched"; AccountBaseVerificationStatusEnum["DatabaseInsightsPass"] = "database_insights_pass"; AccountBaseVerificationStatusEnum["DatabaseInsightsPassWithCaution"] = "database_insights_pass_with_caution"; AccountBaseVerificationStatusEnum["DatabaseInsightsFail"] = "database_insights_fail"; })(AccountBaseVerificationStatusEnum = exports.AccountBaseVerificationStatusEnum || (exports.AccountBaseVerificationStatusEnum = {})); /** * Indicates the account\'s categorization as either a personal or a business account. This field is currently in beta; to request access, contact your account manager. * @export * @enum {string} */ var AccountHolderCategory; (function (AccountHolderCategory) { AccountHolderCategory["Business"] = "business"; AccountHolderCategory["Personal"] = "personal"; AccountHolderCategory["Unrecognized"] = "unrecognized"; })(AccountHolderCategory = exports.AccountHolderCategory || (exports.AccountHolderCategory = {})); /** * @export * @enum {string} */ var AccountIdentityVerificationStatusEnum; (function (AccountIdentityVerificationStatusEnum) { AccountIdentityVerificationStatusEnum["AutomaticallyVerified"] = "automatically_verified"; AccountIdentityVerificationStatusEnum["PendingAutomaticVerification"] = "pending_automatic_verification"; AccountIdentityVerificationStatusEnum["PendingManualVerification"] = "pending_manual_verification"; AccountIdentityVerificationStatusEnum["ManuallyVerified"] = "manually_verified"; AccountIdentityVerificationStatusEnum["VerificationExpired"] = "verification_expired"; AccountIdentityVerificationStatusEnum["VerificationFailed"] = "verification_failed"; AccountIdentityVerificationStatusEnum["DatabaseMatched"] = "database_matched"; AccountIdentityVerificationStatusEnum["DatabaseInsightsPass"] = "database_insights_pass"; AccountIdentityVerificationStatusEnum["DatabaseInsightsPassWithCaution"] = "database_insights_pass_with_caution"; AccountIdentityVerificationStatusEnum["DatabaseInsightsFail"] = "database_insights_fail"; })(AccountIdentityVerificationStatusEnum = exports.AccountIdentityVerificationStatusEnum || (exports.AccountIdentityVerificationStatusEnum = {})); /** * @export * @enum {string} */ var AccountIdentityDocumentUploadVerificationStatusEnum; (function (AccountIdentityDocumentUploadVerificationStatusEnum) { AccountIdentityDocumentUploadVerificationStatusEnum["AutomaticallyVerified"] = "automatically_verified"; AccountIdentityDocumentUploadVerificationStatusEnum["PendingAutomaticVerification"] = "pending_automatic_verification"; AccountIdentityDocumentUploadVerificationStatusEnum["PendingManualVerification"] = "pending_manual_verification"; AccountIdentityDocumentUploadVerificationStatusEnum["ManuallyVerified"] = "manually_verified"; AccountIdentityDocumentUploadVerificationStatusEnum["VerificationExpired"] = "verification_expired"; AccountIdentityDocumentUploadVerificationStatusEnum["VerificationFailed"] = "verification_failed"; AccountIdentityDocumentUploadVerificationStatusEnum["DatabaseMatched"] = "database_matched"; AccountIdentityDocumentUploadVerificationStatusEnum["DatabaseInsightsPass"] = "database_insights_pass"; AccountIdentityDocumentUploadVerificationStatusEnum["DatabaseInsightsPassWithCaution"] = "database_insights_pass_with_caution"; AccountIdentityDocumentUploadVerificationStatusEnum["DatabaseInsightsFail"] = "database_insights_fail"; })(AccountIdentityDocumentUploadVerificationStatusEnum = exports.AccountIdentityDocumentUploadVerificationStatusEnum || (exports.AccountIdentityDocumentUploadVerificationStatusEnum = {})); /** * @export * @enum {string} */ var AccountIdentityMatchScoreVerificationStatusEnum; (function (AccountIdentityMatchScoreVerificationStatusEnum) { AccountIdentityMatchScoreVerificationStatusEnum["AutomaticallyVerified"] = "automatically_verified"; AccountIdentityMatchScoreVerificationStatusEnum["PendingAutomaticVerification"] = "pending_automatic_verification"; AccountIdentityMatchScoreVerificationStatusEnum["PendingManualVerification"] = "pending_manual_verification"; AccountIdentityMatchScoreVerificationStatusEnum["ManuallyVerified"] = "manually_verified"; AccountIdentityMatchScoreVerificationStatusEnum["VerificationExpired"] = "verification_expired"; AccountIdentityMatchScoreVerificationStatusEnum["VerificationFailed"] = "verification_failed"; AccountIdentityMatchScoreVerificationStatusEnum["DatabaseMatched"] = "database_matched"; AccountIdentityMatchScoreVerificationStatusEnum["DatabaseInsightsPass"] = "database_insights_pass"; AccountIdentityMatchScoreVerificationStatusEnum["DatabaseInsightsPassWithCaution"] = "database_insights_pass_with_caution"; AccountIdentityMatchScoreVerificationStatusEnum["DatabaseInsightsFail"] = "database_insights_fail"; })(AccountIdentityMatchScoreVerificationStatusEnum = exports.AccountIdentityMatchScoreVerificationStatusEnum || (exports.AccountIdentityMatchScoreVerificationStatusEnum = {})); /** * The application requires that accounts be limited to a specific cardinality. `MULTI_SELECT`: indicates that the user should be allowed to pick multiple accounts. `SINGLE_SELECT`: indicates that the user should be allowed to pick only a single account. `ALL`: indicates that the user must share all of their accounts and should not be given the opportunity to de-select * @export * @enum {string} */ var AccountSelectionCardinality; (function (AccountSelectionCardinality) { AccountSelectionCardinality["SingleSelect"] = "SINGLE_SELECT"; AccountSelectionCardinality["MultiSelect"] = "MULTI_SELECT"; AccountSelectionCardinality["All"] = "ALL"; })(AccountSelectionCardinality = exports.AccountSelectionCardinality || (exports.AccountSelectionCardinality = {})); /** * See the [Account type schema](https://plaid.com/docs/api/accounts/#account-type-schema) for a full listing of account types and corresponding subtypes. * @export * @enum {string} */ var AccountSubtype; (function (AccountSubtype) { AccountSubtype["_401a"] = "401a"; AccountSubtype["_401k"] = "401k"; AccountSubtype["_403B"] = "403B"; AccountSubtype["_457b"] = "457b"; AccountSubtype["_529"] = "529"; AccountSubtype["Auto"] = "auto"; AccountSubtype["Brokerage"] = "brokerage"; AccountSubtype["Business"] = "business"; AccountSubtype["CashIsa"] = "cash isa"; AccountSubtype["CashManagement"] = "cash management"; AccountSubtype["Cd"] = "cd"; AccountSubtype["Checking"] = "checking"; AccountSubtype["Commercial"] = "commercial"; AccountSubtype["Construction"] = "construction"; AccountSubtype["Consumer"] = "consumer"; AccountSubtype["CreditCard"] = "credit card"; AccountSubtype["CryptoExchange"] = "crypto exchange"; AccountSubtype["Ebt"] = "ebt"; AccountSubtype["EducationSavingsAccount"] = "education savings account"; AccountSubtype["FixedAnnuity"] = "fixed annuity"; AccountSubtype["Gic"] = "gic"; AccountSubtype["HealthReimbursementArrangement"] = "health reimbursement arrangement"; AccountSubtype["HomeEquity"] = "home equity"; AccountSubtype["Hsa"] = "hsa"; AccountSubtype["Isa"] = "isa"; AccountSubtype["Ira"] = "ira"; AccountSubtype["Keogh"] = "keogh"; AccountSubtype["Lif"] = "lif"; AccountSubtype["LifeInsurance"] = "life insurance"; AccountSubtype["LineOfCredit"] = "line of credit"; AccountSubtype["Lira"] = "lira"; AccountSubtype["Loan"] = "loan"; AccountSubtype["Lrif"] = "lrif"; AccountSubtype["Lrsp"] = "lrsp"; AccountSubtype["MoneyMarket"] = "money market"; AccountSubtype["Mortgage"] = "mortgage"; AccountSubtype["MutualFund"] = "mutual fund"; AccountSubtype["NonCustodialWallet"] = "non-custodial wallet"; AccountSubtype["NonTaxableBrokerageAccount"] = "non-taxable brokerage account"; AccountSubtype["Other"] = "other"; AccountSubtype["OtherInsurance"] = "other insurance"; AccountSubtype["OtherAnnuity"] = "other annuity"; AccountSubtype["Overdraft"] = "overdraft"; AccountSubtype["Paypal"] = "paypal"; AccountSubtype["Payroll"] = "payroll"; AccountSubtype["Pension"] = "pension"; AccountSubtype["Prepaid"] = "prepaid"; AccountSubtype["Prif"] = "prif"; AccountSubtype["ProfitSharingPlan"] = "profit sharing plan"; AccountSubtype["Rdsp"] = "rdsp"; AccountSubtype["Resp"] = "resp"; AccountSubtype["Retirement"] = "retirement"; AccountSubtype["Rlif"] = "rlif"; AccountSubtype["Roth"] = "roth"; AccountSubtype["Roth401k"] = "roth 401k"; AccountSubtype["Rrif"] = "rrif"; AccountSubtype["Rrsp"] = "rrsp"; AccountSubtype["Sarsep"] = "sarsep"; AccountSubtype["Savings"] = "savings"; AccountSubtype["SepIra"] = "sep ira"; AccountSubtype["SimpleIra"] = "simple ira"; AccountSubtype["Sipp"] = "sipp"; AccountSubtype["StockPlan"] = "stock plan"; AccountSubtype["Student"] = "student"; AccountSubtype["ThriftSavingsPlan"] = "thrift savings plan"; AccountSubtype["Tfsa"] = "tfsa"; AccountSubtype["Trust"] = "trust"; AccountSubtype["Ugma"] = "ugma"; AccountSubtype["Utma"] = "utma"; AccountSubtype["VariableAnnuity"] = "variable annuity"; })(AccountSubtype = exports.AccountSubtype || (exports.AccountSubtype = {})); /** * `investment:` Investment account. In API versions 2018-05-22 and earlier, this type is called `brokerage` instead. `credit:` Credit card `depository:` Depository account `loan:` Loan account `other:` Non-specified account type See the [Account type schema](https://plaid.com/docs/api/accounts#account-type-schema) for a full listing of account types and corresponding subtypes. * @export * @enum {string} */ var AccountType; (function (AccountType) { AccountType["Investment"] = "investment"; AccountType["Credit"] = "credit"; AccountType["Depository"] = "depository"; AccountType["Loan"] = "loan"; AccountType["Brokerage"] = "brokerage"; AccountType["Other"] = "other"; })(AccountType = exports.AccountType || (exports.AccountType = {})); /** * Indicator of account number format validity for institution. `valid`: indicates that the account number has a correct format for the institution. `invalid`: indicates that the account number has an incorrect format for the institution. `unknown`: indicates that there was not enough information to determine whether the format is correct for the institution. * @export * @enum {string} */ var AccountVerificationInsightsAccountNumberFormat; (function (AccountVerificationInsightsAccountNumberFormat) { AccountVerificationInsightsAccountNumberFormat["Valid"] = "valid"; AccountVerificationInsightsAccountNumberFormat["Invalid"] = "invalid"; AccountVerificationInsightsAccountNumberFormat["Unknown"] = "unknown"; })(AccountVerificationInsightsAccountNumberFormat = exports.AccountVerificationInsightsAccountNumberFormat || (exports.AccountVerificationInsightsAccountNumberFormat = {})); /** * Enum representing the state of the action/activity. * @export * @enum {string} */ var ActionState; (function (ActionState) { ActionState["Unknown"] = "UNKNOWN"; ActionState["Attempt"] = "ATTEMPT"; ActionState["Success"] = "SUCCESS"; ActionState["Failure"] = "FAILURE"; ActionState["Skipped"] = "SKIPPED"; })(ActionState = exports.ActionState || (exports.ActionState = {})); /** * Types of consent activities * @export * @enum {string} */ var ActivityType; (function (ActivityType) { ActivityType["Unknown"] = "UNKNOWN"; ActivityType["ItemCreate"] = "ITEM_CREATE"; ActivityType["ItemImport"] = "ITEM_IMPORT"; ActivityType["ItemUpdate"] = "ITEM_UPDATE"; ActivityType["ItemUnlink"] = "ITEM_UNLINK"; ActivityType["PortalUnlink"] = "PORTAL_UNLINK"; ActivityType["PortalItemsDelete"] = "PORTAL_ITEMS_DELETE"; ActivityType["ItemRemove"] = "ITEM_REMOVE"; ActivityType["InvariantCheckerDeletion"] = "INVARIANT_CHECKER_DELETION"; ActivityType["ScopesUpdate"] = "SCOPES_UPDATE"; })(ActivityType = exports.ActivityType || (exports.ActivityType = {})); /** * Field describing whether the associated address is being used for commercial or residential purposes. Note: This value will be `no_data` when Plaid does not have sufficient data to determine the address\'s use. * @export * @enum {string} */ var AddressPurposeLabel; (function (AddressPurposeLabel) { AddressPurposeLabel["Residential"] = "residential"; AddressPurposeLabel["Commercial"] = "commercial"; AddressPurposeLabel["NoData"] = "no_data"; })(AddressPurposeLabel = exports.AddressPurposeLabel || (exports.AddressPurposeLabel = {})); /** * A list of add-ons that should be included in the Asset Report. `fast_assets`: When Fast Assets is requested, Plaid will create two versions of the Asset Report: the Fast Asset Report, which will contain only Identity and Balance information, and the Full Asset Report, which will also contain Transactions information. A `PRODUCT_READY` webhook will be fired for each Asset Report when it is ready, and the `report_type` field will indicate whether the webhook is firing for the `full` or `fast` Asset Report. To retrieve the Fast Asset Report, call `/asset_report/get` with `fast_report` set to `true`. There is no additional charge for using Fast Assets. To create a Fast Asset Report, Plaid must successfully retrieve both Identity and Balance data; if Plaid encounters an error obtaining this data, the Fast Asset Report will not be created. However, as long as Plaid can obtain Transactions data, the Full Asset Report will still be available. `investments`: Request an Asset Report with Investments. This add-on is in closed beta and not generally available. * @export * @enum {string} */ var AssetReportAddOns; (function (AssetReportAddOns) { AssetReportAddOns["Investments"] = "investments"; AssetReportAddOns["FastAssets"] = "fast_assets"; })(AssetReportAddOns = exports.AssetReportAddOns || (exports.AssetReportAddOns = {})); /** * `digital:` transactions that took place online. `place:` transactions that were made at a physical location. `special:` transactions that relate to banks, e.g. fees or deposits. `unresolved:` transactions that do not fit into the other three types. * @export * @enum {string} */ var AssetReportTransactionType; (function (AssetReportTransactionType) { AssetReportTransactionType["Digital"] = "digital"; AssetReportTransactionType["Place"] = "place"; AssetReportTransactionType["Special"] = "special"; AssetReportTransactionType["Unresolved"] = "unresolved"; })(AssetReportTransactionType = exports.AssetReportTransactionType || (exports.AssetReportTransactionType = {})); /** * Indicates either a Fast Asset Report, which will contain only current identity and balance information, or a Full Asset Report, which will also contain historical balance information and transaction data. * @export * @enum {string} */ var AssetReportType; (function (AssetReportType) { AssetReportType["Full"] = "FULL"; AssetReportType["Fast"] = "FAST"; })(AssetReportType = exports.AssetReportType || (exports.AssetReportType = {})); /** * Asset Transaction Category Type Enumerated derived by Vendor. * @export * @enum {string} */ var AssetTransactionCategoryType; (function (AssetTransactionCategoryType) { AssetTransactionCategoryType["AtmFee"] = "ATMFee"; AssetTransactionCategoryType["Advertising"] = "Advertising"; AssetTransactionCategoryType["AirTravel"] = "AirTravel"; AssetTransactionCategoryType["AlcoholBars"] = "AlcoholBars"; AssetTransactionCategoryType["Allowance"] = "Allowance"; AssetTransactionCategoryType["Amusement"] = "Amusement"; AssetTransactionCategoryType["Arts"] = "Arts"; AssetTransactionCategoryType["AutoTransport"] = "AutoTransport"; AssetTransactionCategoryType["AutoInsurance"] = "AutoInsurance"; AssetTransactionCategoryType["AutoPayment"] = "AutoPayment"; AssetTransactionCategoryType["BabySupplies"] = "BabySupplies"; AssetTransactionCategoryType["BabysitterDaycare"] = "BabysitterDaycare"; AssetTransactionCategoryType["BankFee"] = "BankFee"; AssetTransactionCategoryType["BillsUtilities"] = "BillsUtilities"; AssetTransactionCategoryType["Bonus"] = "Bonus"; AssetTransactionCategoryType["BooksSupplies"] = "BooksSupplies"; AssetTransactionCategoryType["BusinessServices"] = "Business Services"; AssetTransactionCategoryType["Buy"] = "Buy"; AssetTransactionCategoryType["CashAtm"] = "CashATM"; AssetTransactionCategoryType["Charity"] = "Charity"; AssetTransactionCategoryType["Check"] = "Check"; AssetTransactionCategoryType["ChildSupport"] = "ChildSupport"; AssetTransactionCategoryType["Clothing"] = "Clothing"; AssetTransactionCategoryType["CoffeeShops"] = "CoffeeShops"; AssetTransactionCategoryType["CreditCardPayment"] = "CreditCardPayment"; AssetTransactionCategoryType["Dentist"] = "Dentist"; AssetTransactionCategoryType["Doctor"] = "Doctor"; AssetTransactionCategoryType["Education"] = "Education"; AssetTransactionCategoryType["ElectronicsSoftware"] = "ElectronicsSoftware"; AssetTransactionCategoryType["Entertainment"] = "Entertainment"; AssetTransactionCategoryType["Eyecare"] = "Eyecare"; AssetTransactionCategoryType["FastFood"] = "FastFood"; AssetTransactionCategoryType["FederalTax"] = "FederalTax"; AssetTransactionCategoryType["FeesCharges"] = "FeesCharges"; AssetTransactionCategoryType["FinanceCharge"] = "FinanceCharge"; AssetTransactionCategoryType["Financial"] = "Financial"; AssetTransactionCategoryType["FinancialAdvisor"] = "FinancialAdvisor"; AssetTransactionCategoryType["FoodDining"] = "FoodDining"; AssetTransactionCategoryType["Furnishings"] = "Furnishings"; AssetTransactionCategoryType["GasFuel"] = "GasFuel"; AssetTransactionCategoryType["GiftsDonations"] = "GiftsDonations"; AssetTransactionCategoryType["Groceries"] = "Groceries"; AssetTransactionCategoryType["Gym"] = "Gym"; AssetTransactionCategoryType["Hair"] = "Hair"; AssetTransactionCategoryType["HealthFitness"] = "HealthFitness"; AssetTransactionCategoryType["HealthInsurance"] = "HealthInsurance"; AssetTransactionCategoryType["Hobbies"] = "Hobbies"; AssetTransactionCategoryType["Home"] = "Home"; AssetTransactionCategoryType["HomeImprovement"] = "HomeImprovement"; AssetTransactionCategoryType["HomeInsurance"] = "HomeInsurance"; AssetTransactionCategoryType["HomePhone"] = "HomePhone"; AssetTransactionCategoryType["HomeServices"] = "HomeServices"; AssetTransactionCategoryType["HomeSupplies"] = "HomeSupplies"; AssetTransactionCategoryType["Hotel"] = "Hotel"; AssetTransactionCategoryType["Income"] = "Income"; AssetTransactionCategoryType["InterestIncome"] = "InterestIncome"; AssetTransactionCategoryType["Internet"] = "Internet"; AssetTransactionCategoryType["Investments"] = "Investments"; AssetTransactionCategoryType["Kids"] = "Kids"; AssetTransactionCategoryType["KidsActivities"] = "KidsActivities"; AssetTransactionCategoryType["LateFee"] = "LateFee"; AssetTransactionCategoryType["Laundry"] = "Laundry"; AssetTransactionCategoryType["LawnGarden"] = "LawnGarden"; AssetTransactionCategoryType["Legal"] = "Legal"; AssetTransactionCategoryType["LifeInsurance"] = "LifeInsurance"; AssetTransactionCategoryType["LoanInsurance"] = "LoanInsurance"; AssetTransactionCategoryType["LoanPayment"] = "LoanPayment"; AssetTransactionCategoryType["Loans"] = "Loans"; AssetTransactionCategoryType["MobilePhone"] = "MobilePhone"; AssetTransactionCategoryType["MortgageRent"] = "MortgageRent"; AssetTransactionCategoryType["MoviesDvds"] = "MoviesDVDs"; AssetTransactionCategoryType["Music"] = "Music"; AssetTransactionCategoryType["NewspapersMagazines"] = "NewspapersMagazines"; AssetTransactionCategoryType["OfficeSupplies"] = "OfficeSupplies"; AssetTransactionCategoryType["Parking"] = "Parking"; AssetTransactionCategoryType["Paycheck"] = "Paycheck"; AssetTransactionCategoryType["PersonalCare"] = "PersonalCare"; AssetTransactionCategoryType["PetFoodSupplies"] = "PetFoodSupplies"; AssetTransactionCategoryType["PetGrooming"] = "PetGrooming"; AssetTransactionCategoryType["Pets"] = "Pets"; AssetTransactionCategoryType["Pharmacy"] = "Pharmacy"; AssetTransactionCategoryType["Printing"] = "Printing"; AssetTransactionCategoryType["PropertyTax"] = "Property Tax"; AssetTransactionCategoryType["PublicTransportation"] = "Public Transportation"; AssetTransactionCategoryType["Reimbursement"] = "Reimbursement"; AssetTransactionCategoryType["RentalCarTaxi"] = "RentalCarTaxi"; AssetTransactionCategoryType["Restaurants"] = "Restaurants"; AssetTransactionCategoryType["SalesTax"] = "SalesTax"; AssetTransactionCategoryType["ServiceParts"] = "ServiceParts"; AssetTransactionCategoryType["ServiceFee"] = "ServiceFee"; AssetTransactionCategoryType["Shipping"] = "Shipping"; AssetTransactionCategoryType["Shopping"] = "Shopping"; AssetTransactionCategoryType["SpaMassage"] = "SpaMassage"; AssetTransactionCategoryType["SportingGoods"] = "SportingGoods"; AssetTransactionCategoryType["Sports"] = "Sports"; AssetTransactionCategoryType["StateTax"] = "StateTax"; AssetTransactionCategoryType["StudentLoan"] = "Student Loan"; AssetTransactionCategoryType["Taxes"] = "Taxes"; AssetTransactionCategoryType["Television"] = "Television"; AssetTransactionCategoryType["Toys"] = "Toys"; AssetTransactionCategoryType["Transfer"] = "Transfer"; AssetTransactionCategoryType["Travel"] = "Travel"; AssetTransactionCategoryType["Tuition"] = "Tuition"; AssetTransactionCategoryType["Uncategorized"] = "Uncategorized"; AssetTransactionCategoryType["Utilities"] = "Utilities"; AssetTransactionCategoryType["Vacation"] = "Vacation"; AssetTransactionCategoryType["Veterinary"] = "Veterinary"; })(AssetTransactionCategoryType = exports.AssetTransactionCategoryType || (exports.AssetTransactionCategoryType = {})); /** * Asset Transaction Type. * @export * @enum {string} */ var AssetTransactionType; (function (AssetTransactionType) { AssetTransactionType["Credit"] = "Credit"; AssetTransactionType["Debit"] = "Debit"; })(AssetTransactionType = exports.AssetTransactionType || (exports.AssetTransactionType = {})); /** * A value from a MISMO prescribed list that specifies financial assets in a mortgage loan transaction. Assets may be either liquid or fixed and are associated with a corresponding asset amount. * @export * @enum {string} */ var AssetType; (function (AssetType) { AssetType["CheckingAccount"] = "CheckingAccount"; AssetType["SavingsAccount"] = "SavingsAccount"; AssetType["Investment"] = "Investment"; AssetType["MoneyMarketFund"] = "MoneyMarketFund"; AssetType["Other"] = "Other"; })(AssetType = exports.AssetType || (exports.AssetType = {})); /** * The possible types of auth data that may have changed. * @export * @enum {string} */ var AuthUpdateTypes; (function (AuthUpdateTypes) { AuthUpdateTypes["AccountNumber"] = "ACCOUNT_NUMBER"; AuthUpdateTypes["RoutingNumber"] = "ROUTING_NUMBER"; })(AuthUpdateTypes = exports.AuthUpdateTypes || (exports.AuthUpdateTypes = {})); /** * A five-tier risk assessment for the transaction, based on the probability distribution of ACH returns, measured by the incident rate. Each tier corresponds to a distribution with a different mean (average) probability. `HIGH`: The mean probability of ACH return risk is above 40%. `MEDIUM_HIGH`: The mean probability of ACH return risk is 15%-40%. `MEDIUM`: The mean probability of ACH return risk is 5-10%. `MEDIUM_LOW`: The mean probability of ACH return risk is 1%-2%. `LOW`: The mean probability of ACH return risk is below 1%. Note that these tiers correspond to probability *distributions* and not to discrete probabilities. These tier definitions are specific to Balance Plus and do not apply to risk tiers generated by other Plaid endpoints. * @export * @enum {string} */ var BalancePlusRiskLevel; (function (BalancePlusRiskLevel) { BalancePlusRiskLevel["High"] = "HIGH"; BalancePlusRiskLevel["MediumHigh"] = "MEDIUM_HIGH"; BalancePlusRiskLevel["Medium"] = "MEDIUM"; BalancePlusRiskLevel["MediumLow"] = "MEDIUM_LOW"; BalancePlusRiskLevel["Low"] = "LOW"; })(BalancePlusRiskLevel = exports.BalancePlusRiskLevel || (exports.BalancePlusRiskLevel = {})); /** * The result of the bank income report generation `SUCCESS`: The bank income report was successfully generated and can be retrieved via `/credit/bank_income/get`. `FAILURE`: The bank income report failed to be generated * @export * @enum {string} */ var BankIncomeCompleteResult; (function (BankIncomeCompleteResult) { BankIncomeCompleteResult["Success"] = "SUCCESS"; BankIncomeCompleteResult["Failure"] = "FAILURE"; })(BankIncomeCompleteResult = exports.BankIncomeCompleteResult || (exports.BankIncomeCompleteResult = {})); /** * The result of the bank income refresh report generation `SUCCESS`: The refreshed report was successfully generated and can be retrieved via `/credit/bank_income/get`. `FAILURE`: The refreshed report failed to be generated * @export * @enum {string} */ var BankIncomeRefreshCompleteResult; (function (BankIncomeRefreshCompleteResult) { BankIncomeRefreshCompleteResult["Success"] = "SUCCESS"; BankIncomeRefreshCompleteResult["Failure"] = "FAILURE"; })(BankIncomeRefreshCompleteResult = exports.BankIncomeRefreshCompleteResult || (exports.BankIncomeRefreshCompleteResult = {})); /** * Indicates the direction of the transfer: `outbound` for API-initiated transfers, or `inbound` for payments received by the FBO account. * @export * @enum {string} */ var BankTransferDirection; (function (BankTransferDirection) { BankTransferDirection["Outbound"] = "outbound"; BankTransferDirection["Inbound"] = "inbound"; BankTransferDirection["Null"] = "null"; })(BankTransferDirection = exports.BankTransferDirection || (exports.BankTransferDirection = {})); /** * The type of bank transfer. This will be either `debit` or `credit`. A `debit` indicates a transfer of money into your origination account; a `credit` indicates a transfer of money out of your origination account. * @export * @enum {string} */ var BankTransferEventListBankTransferType; (function (BankTransferEventListBankTransferType) { BankTransferEventListBankTransferType["Debit"] = "debit"; BankTransferEventListBankTransferType["Credit"] = "credit"; BankTransferEventListBankTransferType["Null"] = "null"; })(BankTransferEventListBankTransferType = exports.BankTransferEventListBankTransferType || (exports.BankTransferEventListBankTransferType = {})); /** * Indicates the direction of the transfer: `outbound`: for API-initiated transfers `inbound`: for payments received by the FBO account. * @export * @enum {string} */ var BankTransferEventListDirection; (function (BankTransferEventListDirection) { BankTransferEventListDirection["Inbound"] = "inbound"; BankTransferEventListDirection["Outbound"] = "outbound"; BankTransferEventListDirection["Null"] = "null"; })(BankTransferEventListDirection = exports.BankTransferEventListDirection || (exports.BankTransferEventListDirection = {})); /** * The type of event that this bank transfer represents. `pending`: A new transfer was created; it is in the pending state. `cancelled`: The transfer was cancelled by the client. `failed`: The transfer failed, no funds were moved. `posted`: The transfer has been successfully submitted to the payment network. `reversed`: A posted transfer was reversed. * @export * @enum {string} */ var BankTransferEventType; (function (BankTransferEventType) { BankTransferEventType["Pending"] = "pending"; BankTransferEventType["Cancelled"] = "cancelled"; BankTransferEventType["Failed"] = "failed"; BankTransferEventType["Posted"] = "posted"; BankTransferEventType["Reversed"] = "reversed"; })(BankTransferEventType = exports.BankTransferEventType || (exports.BankTransferEventType = {})); /** * The network or rails used for the transfer. Valid options are `ach`, `same-day-ach`, or `wire`. * @export * @enum {string} */ var BankTransferNetwork; (function (BankTransferNetwork) { BankTransferNetwork["Ach"] = "ach"; BankTransferNetwork["SameDayAch"] = "same-day-ach"; BankTransferNetwork["Wire"] = "wire"; })(BankTransferNetwork = exports.BankTransferNetwork || (exports.BankTransferNetwork = {})); /** * The status of the transfer. * @export * @enum {string} */ var BankTransferStatus; (function (BankTransferStatus) { BankTransferStatus["Pending"] = "pending"; BankTransferStatus["Posted"] = "posted"; BankTransferStatus["Cancelled"] = "cancelled"; BankTransferStatus["Failed"] = "failed"; BankTransferStatus["Reversed"] = "reversed"; })(BankTransferStatus = exports.BankTransferStatus || (exports.BankTransferStatus = {})); /** * The type of bank transfer. This will be either `debit` or `credit`. A `debit` indicates a transfer of money into the origination account; a `credit` indicates a transfer of money out of the origination account. * @export * @enum {string} */ var BankTransferType; (function (BankTransferType) { BankTransferType["Debit"] = "debit"; BankTransferType["Credit"] = "credit"; })(BankTransferType = exports.BankTransferType || (exports.BankTransferType = {})); /** * `digital:` transactions that took place online. `place:` transactions that were made at a physical location. `special:` transactions that relate to banks, e.g. fees or deposits. `unresolved:` transactions that do not fit into the other types. * @export * @enum {string} */ var BaseReportTransactionType; (function (BaseReportTransactionType) { BaseReportTransactionType["Digital"] = "digital"; BaseReportTransactionType["Place"] = "place"; BaseReportTransactionType["Special"] = "special"; BaseReportTransactionType["Unresolved"] = "unresolved"; })(BaseReportTransactionType = exports.BaseReportTransactionType || (exports.BaseReportTransactionType = {})); /** * The warning code identifies a specific kind of warning. `OWNERS_UNAVAILABLE` indicates that account-owner information is not available. `TRANSACTIONS_UNAVAILABLE` indicates that transactions information associated with Credit and Depository accounts are unavailable. `USER_FRAUD_ALERT` indicates that the User has placed a fraud alert on their Plaid Check consumer report due to suspected fraud. * @export * @enum {string} */ var BaseReportWarningCode; (function (BaseReportWarningCode) { BaseReportWarningCode["OwnersUnavailable"] = "OWNERS_UNAVAILABLE"; BaseReportWarningCode["TransactionsUnavailable"] = "TRANSACTIONS_UNAVAILABLE"; BaseReportWarningCode["UserFraudAlert"] = "USER_FRAUD_ALERT"; })(BaseReportWarningCode = exports.BaseReportWarningCode || (exports.BaseReportWarningCode = {})); /** * Description of the reason you want to evaluate risk. `ONBOARDING`: user links a first bank account as part of the onboarding flow of your platform. `NEW_ACCOUNT`: user links another bank account or replaces the currently linked bank account on your platform. `INFORMATION_CHANGE`: user changes their information on your platform, e.g., updating their phone number. `DORMANT_USER`: you decide to re-evaluate a user that becomes active after a period of inactivity. `OTHER`: any other reasons not listed here Possible values: `ONBOARDING`, `NEW_ACCOUNT`, `INFORMATION_CHANGE`, `DORMANT_USER`, `OTHER` * @export * @enum {string} */ var BeaconAccountRiskEvaluateEvaluationReason; (function (BeaconAccountRiskEvaluateEvaluationReason) { BeaconAccountRiskEvaluateEvaluationReason["Onboarding"] = "ONBOARDING"; BeaconAccountRiskEvaluateEvaluationReason["NewAccount"] = "NEW_ACCOUNT"; BeaconAccountRiskEvaluateEvaluationReason["InformationChange"] = "INFORMATION_CHANGE"; BeaconAccountRiskEvaluateEvaluationReason["DormantUser"] = "DORMANT_USER"; BeaconAccountRiskEvaluateEvaluationReason["Other"] = "OTHER"; })(BeaconAccountRiskEvaluateEvaluationReason = exports.BeaconAccountRiskEvaluateEvaluationReason || (exports.BeaconAccountRiskEvaluateEvaluationReason = {})); /** * A type indicating what caused a resource to be changed or updated. `dashboard` - The resource was created or updated by a member of your team via the Plaid dashboard. `api` - The resource was created or updated via the Plaid API. `system` - The resource was created or updated automatically by a part of the Plaid Beacon system. For example, if another business using Plaid Beacon created a fraud report that matched one of your users, your matching user\'s status would automatically be updated and the audit trail source would be `system`. `bulk_import` - The resource was created or updated as part of a bulk import process. For example, if your company provided a CSV of user data as part of your initial onboarding, the audit trail source would be `bulk_import`. * @export * @enum {string} */ var BeaconAuditTrailSource; (function (BeaconAuditTrailSource) { BeaconAuditTrailSource["Dashboard"] = "dashboard"; BeaconAuditTrailSource["Api"] = "api"; BeaconAuditTrailSource["System"] = "system"; BeaconAuditTrailSource["BulkImport"] = "bulk_import"; })(BeaconAuditTrailSource = exports.BeaconAuditTrailSource || (exports.BeaconAuditTrailSource = {})); /** * An enum indicating the match type between two Beacon Users. `match` indicates that the provided input data was a strong match against the other Beacon User. `partial_match` indicates the data approximately matched the other Beacon User. For example, \"Knope\" vs. \"Knope-Wyatt\" for last name. `no_match` indicates that Plaid was able to compare this field against the other Beacon User and it did not match the provided input data. `no_data` indicates that Plaid was unable to compare this field against the original Beacon User because the field was not present in one of the Beacon Users. * @export * @enum {string} */ var BeaconMatchSummaryCode; (function (BeaconMatchSummaryCode) { BeaconMatchSummaryCode["Match"] = "match"; BeaconMatchSummaryCode["PartialMatch"] = "partial_match"; BeaconMatchSummaryCode["NoMatch"] = "no_match"; BeaconMatchSummaryCode["NoData"] = "no_data"; })(BeaconMatchSummaryCode = exports.BeaconMatchSummaryCode || (exports.BeaconMatchSummaryCode = {})); /** * The type of Beacon Report. `first_party`: If this is the same individual as the one who submitted the KYC. `stolen`: If this is a different individual from the one who submitted the KYC. `synthetic`: If this is an individual using fabricated information. `account_takeover`: If this individual\'s account was compromised. `unknown`: If you aren\'t sure who committed the fraud. * @export * @enum {string} */ var BeaconReportCreateType; (function (BeaconReportCreateType) { BeaconReportCreateType["FirstParty"] = "first_party"; BeaconReportCreateType["Stolen"] = "stolen"; BeaconReportCreateType["Synthetic"] = "synthetic"; BeaconReportCreateType["AccountTakeover"] = "account_takeover"; BeaconReportCreateType["DataBreach"] = "data_breach"; BeaconReportCreateType["Unknown"] = "unknown"; })(BeaconReportCreateType = exports.BeaconReportCreateType || (exports.BeaconReportCreateType = {})); /** * The type of Beacon Report. `first_party`: If this is the same individual as the one who submitted the KYC. `stolen`: If this is a different individual from the one who submitted the KYC. `synthetic`: If this is an individual using fabricated information. `account_takeover`: If this individual\'s account was compromised. `data_breach`: If this individual\'s data was compromised in a breach. `unknown`: If you aren\'t sure who committed the fraud. * @export * @enum {string} */ var BeaconReportType; (function (BeaconReportType) { BeaconReportType["FirstParty"] = "first_party"; BeaconReportType["Stolen"] = "stolen"; BeaconReportType["Synthetic"] = "synthetic"; BeaconReportType["AccountTakeover"] = "account_takeover"; BeaconReportType["DataBreach"] = "data_breach"; BeaconReportType["Unknown"] = "unknown"; })(BeaconReportType = exports.BeaconReportType || (exports.BeaconReportType = {})); /** * A status of a Beacon User. `rejected`: The Beacon User has been rejected for fraud. Users can be automatically or manually rejected. `pending_review`: The Beacon User has been marked for review. `cleared`: The Beacon User has been cleared of fraud. * @export * @enum {string} */ var BeaconUserStatus; (function (BeaconUserStatus) { BeaconUserStatus["Rejected"] = "rejected"; BeaconUserStatus["PendingReview"] = "pending_review"; BeaconUserStatus["Cleared"] = "cleared"; })(BeaconUserStatus = exports.BeaconUserStatus || (exports.BeaconUserStatus = {})); /** * The versions of cashflow attributes * @export * @enum {string} */ var CashflowAttributesVersion; (function (CashflowAttributesVersion) { CashflowAttributesVersion["V10"] = "v1.0"; })(CashflowAttributesVersion = exports.CashflowAttributesVersion || (exports.CashflowAttributesVersion = {})); /** * Codes describing the object of a consent event. * @export * @enum {string} */ var ConsentEventCode; (function (ConsentEventCode) { ConsentEventCode["UserAgreement"] = "USER_AGREEMENT"; ConsentEventCode["UseCases"] = "USE_CASES"; ConsentEventCode["DataScopes"] = "DATA_SCOPES"; ConsentEventCode["AccountScopes"] = "ACCOUNT_SCOPES"; })(ConsentEventCode = exports.ConsentEventCode || (exports.ConsentEventCode = {})); /** * The entity that initiated collection of consent. * @export * @enum {string} */ var ConsentEventInitiator; (function (ConsentEventInitiator) { ConsentEventInitiator["Plaid"] = "PLAID"; ConsentEventInitiator["DataProvider"] = "DATA_PROVIDER"; ConsentEventInitiator["Customer"] = "CUSTOMER"; ConsentEventInitiator["EndUser"] = "END_USER"; })(ConsentEventInitiator = exports.ConsentEventInitiator || (exports.ConsentEventInitiator = {})); /** * A broad categorization of the consent event. * @export * @enum {string} */ var ConsentEventType; (function (ConsentEventType) { ConsentEventType["Granted"] = "CONSENT_GRANTED"; ConsentEventType["Revoked"] = "CONSENT_REVOKED"; ConsentEventType["Updated"] = "CONSENT_UPDATED"; })(ConsentEventType = exports.ConsentEventType || (exports.ConsentEventType = {})); /** * Type of data being disputed by the consumer * @export * @enum {string} */ var ConsumerDisputeCategory; (function (ConsumerDisputeCategory) { ConsumerDisputeCategory["Transaction"] = "TRANSACTION"; ConsumerDisputeCategory["Balance"] = "BALANCE"; ConsumerDisputeCategory["Identity"] = "IDENTITY"; ConsumerDisputeCategory["Other"] = "OTHER"; })(ConsumerDisputeCategory = exports.ConsumerDisputeCategory || (exports.ConsumerDisputeCategory = {})); /** * Describes the reason you are generating a Consumer Report for this user. `ACCOUNT_REVIEW_CREDIT`: In connection with a consumer credit transaction for the review or collection of an account pursuant to FCRA Section 604(a)(3)(A). `ACCOUNT_REVIEW_NON_CREDIT`: For a legitimate business need of the information to review a non-credit account provided primarily for personal, family, or household purposes to determine whether the consumer continues to meet the terms of the account pursuant to FCRA Section 604(a)(3)(F)(2). `EMPLOYMENT`: For employment purposes pursuant to FCRA 604(a)(3)(B), including hiring, retention and promotion purposes. `EXTENSION_OF_CREDIT`: In connection with a credit transaction initiated by and involving the consumer pursuant to FCRA Section 604(a)(3)(A). `LEGITIMATE_BUSINESS_NEED_TENANT_SCREENING`: For a legitimate business need in connection with a business transaction initiated by the consumer primarily for personal, family, or household purposes in connection with a property rental assessment pursuant to FCRA Section 604(a)(3)(F)(i). `LEGITIMATE_BUSINESS_NEED_OTHER`: For a legitimate business need in connection with a business transaction made primarily for personal, family, or household initiated by the consumer pursuant to FCRA Section 604(a)(3)(F)(i). `WRITTEN_INSTRUCTION_PREQUALIFICATION`: In accordance with the written instructions of the consumer pursuant to FCRA Section 604(a)(2), to evaluate an application’s profile to make an offer to the consumer. `WRITTEN_INSTRUCTION_OTHER`: In accordance with the written instructions of the consumer pursuant to FCRA Section 604(a)(2), such as when an individual agrees to act as a guarantor or assumes personal liability for a consumer, business, or commercial loan. * @export * @enum {string} */ var ConsumerReportPermissiblePurpose; (function (ConsumerReportPermissiblePurpose) { ConsumerReportPermissiblePurpose["AccountReviewCredit"] = "ACCOUNT_REVIEW_CREDIT"; ConsumerReportPermissiblePurpose["AccountReviewNonCredit"] = "ACCOUNT_REVIEW_NON_CREDIT"; ConsumerReportPermissiblePurpose["Employment"] = "EMPLOYMENT"; ConsumerReportPermissiblePurpose["ExtensionOfCredit"] = "EXTENSION_OF_CREDIT"; ConsumerReportPermissiblePurpose["LegitimateBusinessNeedTenantScreening"] = "LEGITIMATE_BUSINESS_NEED_TENANT_SCREENING"; ConsumerReportPermissiblePurpose["LegitimateBusinessNeedOther"] = "LEGITIMATE_BUSINESS_NEED_OTHER"; ConsumerReportPermissiblePurpose["WrittenInstructionPrequalification"] = "WRITTEN_INSTRUCTION_PREQUALIFICATION"; ConsumerReportPermissiblePurpose["WrittenInstructionOther"] = "WRITTEN_INSTRUCTION_OTHER"; })(ConsumerReportPermissiblePurpose = exports.ConsumerReportPermissiblePurpose || (exports.ConsumerReportPermissiblePurpose = {})); /** * The counterparty type. `merchant`: a provider of goods or services for purchase `financial_institution`: a financial entity (bank, credit union, BNPL, fintech) `payment_app`: a transfer or P2P app (e.g. Zelle) `marketplace`: a marketplace (e.g DoorDash, Google Play Store) `payment_terminal`: a point-of-sale payment terminal (e.g Square, Toast) `income_source`: the payer in an income transaction (e.g., an employer, client, or government agency) * @export * @enum {string} */ var CounterpartyType; (function (CounterpartyType) { CounterpartyType["Merchant"] = "merchant"; CounterpartyType["FinancialInstitution"] = "financial_institution"; CounterpartyType["PaymentApp"] = "payment_app"; CounterpartyType["Marketplace"] = "marketplace"; CounterpartyType["PaymentTerminal"] = "payment_terminal"; CounterpartyType["IncomeSource"] = "income_source"; })(CounterpartyType = exports.CounterpartyType || (exports.CounterpartyType = {})); /** * ISO-3166-1 alpha-2 country code standard. * @export * @enum {string} */ var CountryCode; (function (CountryCode) { CountryCode["Us"] = "US"; CountryCode["Gb"] = "GB"; CountryCode["Es"] = "ES"; CountryCode["Nl"] = "NL"; CountryCode["Fr"] = "FR"; CountryCode["Ie"] = "IE"; CountryCode["Ca"] = "CA"; CountryCode["De"] = "DE"; CountryCode["It"] = "IT"; CountryCode["Pl"] = "PL"; CountryCode["Dk"] = "DK"; CountryCode["No"] = "NO"; CountryCode["Se"] = "SE"; CountryCode["Ee"] = "EE"; CountryCode["Lt"] = "LT"; CountryCode["Lv"] = "LV"; CountryCode["Pt"] = "PT"; CountryCode["Be"] = "BE"; })(CountryCode = exports.CountryCode || (exports.CountryCode = {})); /** * The type of bonus that this transaction represents, if it is a bonus. `BONUS_INCLUDED`: Bonus is included in this transaction along with the normal pay `BONUS_ONLY`: This transaction is a standalone bonus * @export * @enum {string} */ var CraBankIncomeBonusType; (function (CraBankIncomeBonusType) { CraBankIncomeBonusType["BonusIncluded"] = "BONUS_INCLUDED"; CraBankIncomeBonusType["BonusOnly"] = "BONUS_ONLY"; CraBankIncomeBonusType["Null"] = "null"; })(CraBankIncomeBonusType = exports.CraBankIncomeBonusType || (exports.CraBankIncomeBonusType = {})); /** * The result of the bank income report generation `SUCCESS`: The bank income report was successfully generated and can be retrieved via `/cra/bank_income/get`. `FAILURE`: The bank income report failed to be generated * @export * @enum {string} */ var CraBankIncomeCompleteResult; (function (CraBankIncomeCompleteResult) { CraBankIncomeCompleteResult["Success"] = "SUCCESS"; CraBankIncomeCompleteResult["Failure"] = "FAILURE"; })(CraBankIncomeCompleteResult = exports.CraBankIncomeCompleteResult || (exports.CraBankIncomeCompleteResult = {})); /** * The warning code identifies a specific kind of warning. `IDENTITY_UNAVAILABLE`: Unable to extract identity for the Item `TRANSACTIONS_UNAVAILABLE`: Unable to extract transactions for the Item `REPORT_DELETED`: Report deleted due to customer or consumer request `DATA_UNAVAILABLE`: No relevant data was found for the Item * @export * @enum {string} */ var CraBankIncomeWarningCode; (function (CraBankIncomeWarningCode) { CraBankIncomeWarningCode["IdentityUnavailable"] = "IDENTITY_UNAVAILABLE"; CraBankIncomeWarningCode["TransactionsUnavailable"] = "TRANSACTIONS_UNAVAILABLE"; CraBankIncomeWarningCode["ReportDeleted"] = "REPORT_DELETED"; CraBankIncomeWarningCode["DataUnavailable"] = "DATA_UNAVAILABLE"; })(CraBankIncomeWarningCode = exports.CraBankIncomeWarningCode || (exports.CraBankIncomeWarningCode = {})); /** * The decision of the loan application. * @export * @enum {string} */ var CraLoanApplicationDecision; (function (CraLoanApplicationDecision) { CraLoanApplicationDecision["Approved"] = "APPROVED"; CraLoanApplicationDecision["Declined"] = "DECLINED"; CraLoanApplicationDecision["Other"] = "OTHER"; })(CraLoanApplicationDecision = exports.CraLoanApplicationDecision || (exports.CraLoanApplicationDecision = {})); /** * The frequency of a loan\'s payment schedule. `BIWEEKLY` represents one payment every two weeks. * @export * @enum {string} */ var CraLoanPaymentSchedule; (function (CraLoanPaymentSchedule) { CraLoanPaymentSchedule["Daily"] = "DAILY"; CraLoanPaymentSchedule["Weekly"] = "WEEKLY"; CraLoanPaymentSchedule["Biweekly"] = "BIWEEKLY"; CraLoanPaymentSchedule["Monthly"] = "MONTHLY"; CraLoanPaymentSchedule["Quarterly"] = "QUARTERLY"; CraLoanPaymentSchedule["Annually"] = "ANNUALLY"; CraLoanPaymentSchedule["Other"] = "OTHER"; })(CraLoanPaymentSchedule = exports.CraLoanPaymentSchedule || (exports.CraLoanPaymentSchedule = {})); /** * The status of the loan. * @export * @enum {string} */ var CraLoanStatus; (function (CraLoanStatus) { CraLoanStatus["Approved"] = "APPROVED"; CraLoanStatus["Declined"] = "DECLINED"; CraLoanStatus["Booked"] = "BOOKED"; CraLoanStatus["Current"] = "CURRENT"; CraLoanStatus["Delinquent"] = "DELINQUENT"; CraLoanStatus["Default"] = "DEFAULT"; CraLoanStatus["ChargedOff"] = "CHARGED_OFF"; CraLoanStatus["Transferred"] = "TRANSFERRED"; CraLoanStatus["PaidOff"] = "PAID_OFF"; CraLoanStatus["Other"] = "OTHER"; })(CraLoanStatus = exports.CraLoanStatus || (exports.CraLoanStatus = {})); /** * The type of loan the user applied for. * @export * @enum {string} */ var CraLoanType; (function (CraLoanType) { CraLoanType["Personal"] = "PERSONAL"; CraLoanType["CreditCard"] = "CREDIT_CARD"; CraLoanType["Business"] = "BUSINESS"; CraLoanType["Mortgage"] = "MORTGAGE"; CraLoanType["Auto"] = "AUTO"; CraLoanType["Payday"] = "PAYDAY"; CraLoanType["Student"] = "STUDENT"; CraLoanType["HomeEquity"] = "HOME_EQUITY"; CraLoanType["Other"] = "OTHER"; })(CraLoanType = exports.CraLoanType || (exports.CraLoanType = {})); /** * A list of add-ons that can be included in the PDF. `cra_income_insights`: Include Income Insights report in the PDF. * @export * @enum {string} */ var CraPDFAddOns; (function (CraPDFAddOns) { CraPDFAddOns["CraIncomeInsights"] = "cra_income_insights"; })(CraPDFAddOns = exports.CraPDFAddOns || (exports.CraPDFAddOns = {})); /** * Specifies the use case of the transfer. Required for transfers on an ACH network. `\"ccd\"` - Corporate Credit or Debit - fund transfer between two corporate bank accounts `\"ppd\"` - Prearranged Payment or Deposit - the transfer is part of a pre-existing relationship with a consumer, eg. bill payment `\"web\"` - A credit Entry initiated by or on behalf of a holder of a Consumer Account that is intended for a Consumer Account of a Receiver * @export * @enum {string} */ var CreditACHClass; (function (CreditACHClass) { CreditACHClass["Ccd"] = "ccd"; CreditACHClass["Ppd"] = "ppd"; CreditACHClass["Web"] = "web"; })(CreditACHClass = exports.CreditACHClass || (exports.CreditACHClass = {})); /** * Valid account subtypes for credit accounts. For a list containing descriptions of each subtype, see [Account schemas](https://plaid.com/docs/api/accounts/#StandaloneAccountType-credit). * @export * @enum {string} */ var CreditAccountSubtype; (function (CreditAccountSubtype) { CreditAccountSubtype["CreditCard"] = "credit card"; CreditAccountSubtype["Paypal"] = "paypal"; CreditAccountSubtype["All"] = "all"; })(CreditAccountSubtype = exports.CreditAccountSubtype || (exports.CreditAccountSubtype = {})); /** * The warning type which will always be `BANK_EMPLOYMENT_WARNING`. * @export * @enum {string} */ var CreditBankEmploymentWarningType; (function (CreditBankEmploymentWarningType) { CreditBankEmploymentWarningType["BankEmploymentWarning"] = "BANK_EMPLOYMENT_WARNING"; })(CreditBankEmploymentWarningType = exports.CreditBankEmploymentWarningType || (exports.CreditBankEmploymentWarningType = {})); /** * The account type. This will always be `depository`. * @export * @enum {string} */ var CreditBankIncomeAccountType; (function (CreditBankIncomeAccountType) { CreditBankIncomeAccountType["Depository"] = "depository"; })(CreditBankIncomeAccountType = exports.CreditBankIncomeAccountType || (exports.CreditBankIncomeAccountType = {})); /** * The income category. `BANK_INTEREST`: Interest earned from a bank account. `BENEFIT_OTHER`: Government benefits other than retirement, unemployment, child support, or disability. Currently used only in the UK, to represent benefits such as Cost of Living Payments. `CASH`: Deprecated and used only for existing legacy implementations. Has been replaced by `CASH_DEPOSIT` and `TRANSFER_FROM_APPLICATION`. `CASH_DEPOSIT`: A cash or check deposit. `CHILD_SUPPORT`: Child support payments received. `GIG_ECONOMY`: Income earned as a gig economy worker, e.g. driving for Uber, Lyft, Postmates, DoorDash, etc. `LONG_TERM_DISABILITY`: Disability payments, including Social Security disability benefits. `OTHER`: Income that could not be categorized as any other income category. `MILITARY`: Veterans benefits. Income earned as salary for serving in the military (e.g. through DFAS) will be classified as `SALARY` rather than `MILITARY`. `RENTAL`: Income earned from a rental property. Income may be identified as rental when the payment is received through a rental platform, e.g. Airbnb; rent paid directly by the tenant to the property owner (e.g. via cash, check, or ACH) will typically not be classified as rental income. `RETIREMENT`: Payments from private retirement systems, pensions, and government retirement programs, including Social Security retirement benefits. `SALARY`: Payment from an employer to an earner or other form of permanent employment. `TAX_REFUND`: A tax refund. `TRANSFER_FROM_APPLICATION`: Deposits from a money transfer app, such as Venmo, Cash App, or Zelle. `UNEMPLOYMENT`: Unemployment benefits. In the UK, includes certain low-income benefits such as the Universal Credit. * @export * @enum {string} */ var CreditBankIncomeCategory; (function (CreditBankIncomeCategory) { CreditBankIncomeCategory["Salary"] = "SALARY"; CreditBankIncomeCategory["Unemployment"] = "UNEMPLOYMENT"; CreditBankIncomeCategory["Cash"] = "CASH"; CreditBankIncomeCategory["GigEconomy"] = "GIG_ECONOMY"; CreditBankIncomeCategory["Rental"] = "RENTAL"; CreditBankIncomeCategory["ChildSupport"] = "CHILD_SUPPORT"; CreditBankIncomeCategory["Military"] = "MILITARY"; CreditBankIncomeCategory["Retirement"] = "RETIREMENT"; CreditBankIncomeCategory["LongTermDisability"] = "LONG_TERM_DISABILITY"; CreditBankIncomeCategory["BankInterest"] = "BANK_INTEREST"; CreditBankIncomeCategory["CashDeposit"] = "CASH_DEPOSIT"; CreditBankIncomeCategory["TransferFromApplication"] = "TRANSFER_FROM_APPLICATION"; CreditBankIncomeCategory["TaxRefund"] = "TAX_REFUND"; CreditBankIncomeCategory["BenefitOther"] = "BENEFIT_OTHER"; CreditBankIncomeCategory["Other"] = "OTHER"; })(CreditBankIncomeCategory = exports.CreditBankIncomeCategory || (exports.CreditBankIncomeCategory = {})); /** * A broad categorization of the error. Safe for programmatic use. * @export * @enum {string} */ var CreditBankIncomeErrorType; (function (CreditBankIncomeErrorType) { CreditBankIncomeErrorType["InternalServerError"] = "INTERNAL_SERVER_ERROR"; CreditBankIncomeErrorType["InsufficientCredentials"] = "INSUFFICIENT_CREDENTIALS"; CreditBankIncomeErrorType["ItemLocked"] = "ITEM_LOCKED"; CreditBankIncomeErrorType["UserSetupRequired"] = "USER_SETUP_REQUIRED"; CreditBankIncomeErrorType["CountryNotSupported"] = "COUNTRY_NOT_SUPPORTED"; CreditBankIncomeErrorType["InstitutionDown"] = "INSTITUTION_DOWN"; CreditBankIncomeErrorType["InstitutionNoLongerSupported"] = "INSTITUTION_NO_LONGER_SUPPORTED"; CreditBankIncomeErrorType["InstitutionNotResponding"] = "INSTITUTION_NOT_RESPONDING"; CreditBankIncomeErrorType["InvalidCredentials"] = "INVALID_CREDENTIALS"; CreditBankIncomeErrorType["InvalidMfa"] = "INVALID_MFA"; CreditBankIncomeErrorType["InvalidSendMethod"] = "INVALID_SEND_METHOD"; CreditBankIncomeErrorType["ItemLoginRequired"] = "ITEM_LOGIN_REQUIRED"; CreditBankIncomeErrorType["MfaNotSupported"] = "MFA_NOT_SUPPORTED"; CreditBankIncomeErrorType["NoAccounts"] = "NO_ACCOUNTS"; CreditBankIncomeErrorType["ItemNotSupported"] = "ITEM_NOT_SUPPORTED"; CreditBankIncomeErrorType["AccessNotGranted"] = "ACCESS_NOT_GRANTED"; })(CreditBankIncomeErrorType = exports.CreditBankIncomeErrorType || (exports.CreditBankIncomeErrorType = {})); /** * The income pay frequency. * @export * @enum {string} */ var CreditBankIncomePayFrequency; (function (CreditBankIncomePayFrequency) { CreditBankIncomePayFrequency["Weekly"] = "WEEKLY"; CreditBankIncomePayFrequency["Biweekly"] = "BIWEEKLY"; CreditBankIncomePayFrequency["SemiMonthly"] = "SEMI_MONTHLY"; CreditBankIncomePayFrequency["Monthly"] = "MONTHLY"; CreditBankIncomePayFrequency["Daily"] = "DAILY"; CreditBankIncomePayFrequency["Unknown"] = "UNKNOWN"; })(CreditBankIncomePayFrequency = exports.CreditBankIncomePayFrequency || (exports.CreditBankIncomePayFrequency = {})); /** * The warning code identifies a specific kind of warning. `IDENTITY_UNAVAILABLE`: Unable to extract identity for the Item `TRANSACTIONS_UNAVAILABLE`: Unable to extract transactions for the Item `ITEM_UNAPPROVED`: User exited flow before giving permission to share data for the Item `REPORT_DELETED`: Report deleted due to customer or consumer request `DATA_UNAVAILABLE`: No relevant data was found for the Item * @export * @enum {string} */ var CreditBankIncomeWarningCode; (function (CreditBankIncomeWarningCode) { CreditBankIncomeWarningCode["IdentityUnavailable"] = "IDENTITY_UNAVAILABLE"; CreditBankIncomeWarningCode["TransactionsUnavailable"] = "TRANSACTIONS_UNAVAILABLE"; CreditBankIncomeWarningCode["ItemUnapproved"] = "ITEM_UNAPPROVED"; CreditBankIncomeWarningCode["ReportDeleted"] = "REPORT_DELETED"; CreditBankIncomeWarningCode["DataUnavailable"] = "DATA_UNAVAILABLE"; })(CreditBankIncomeWarningCode = exports.CreditBankIncomeWarningCode || (exports.CreditBankIncomeWarningCode = {})); /** * The warning type which will always be `BANK_INCOME_WARNING`. * @export * @enum {string} */ var CreditBankIncomeWarningType; (function (CreditBankIncomeWarningType) { CreditBankIncomeWarningType["BankIncomeWarning"] = "BANK_INCOME_WARNING"; })(CreditBankIncomeWarningType = exports.CreditBankIncomeWarningType || (exports.CreditBankIncomeWarningType = {})); /** * The explicit pay basis on the paystub (if present). * @export * @enum {string} */ var CreditPayStubPayBasisType; (function (CreditPayStubPayBasisType) { CreditPayStubPayBasisType["Salary"] = "SALARY"; CreditPayStubPayBasisType["Hourly"] = "HOURLY"; CreditPayStubPayBasisType["Commission"] = "COMMISSION"; })(CreditPayStubPayBasisType = exports.CreditPayStubPayBasisType || (exports.CreditPayStubPayBasisType = {})); /** * Status of the Bank Employment Link session. `APPROVED`: User has approved and verified their employment. `NO_EMPLOYMENTS_FOUND`: We attempted, but were unable to find any employment in the connected account. `EMPLOYER_NOT_LISTED`: The user explicitly indicated that they did not see their current or previous employer in the list of employer names found. `STARTED`: The user began the bank income portion of the link flow. `INTERNAL_ERROR`: The user encountered an internal error. * @export * @enum {string} */ var CreditSessionBankEmploymentStatus; (function (CreditSessionBankEmploymentStatus) { CreditSessionBankEmploymentStatus["Approved"] = "APPROVED"; CreditSessionBankEmploymentStatus["NoEmployersFound"] = "NO_EMPLOYERS_FOUND"; CreditSessionBankEmploymentStatus["EmployerNotListed"] = "EMPLOYER_NOT_LISTED"; })(CreditSessionBankEmploymentStatus = exports.CreditSessionBankEmploymentStatus || (exports.CreditSessionBankEmploymentStatus = {})); /** * Status of the Bank Income Link session. `APPROVED`: User has approved and verified their income `NO_DEPOSITS_FOUND`: We attempted, but were unable to find any income in the connected account. `USER_REPORTED_NO_INCOME`: The user explicitly indicated that they don\'t receive income in the connected account. `STARTED`: The user began the bank income portion of the link flow. `INTERNAL_ERROR`: The user encountered an internal error. * @export * @enum {string} */ var CreditSessionBankIncomeStatus; (function (CreditSessionBankIncomeStatus) { CreditSessionBankIncomeStatus["Approved"] = "APPROVED"; CreditSessionBankIncomeStatus["NoDepositsFound"] = "NO_DEPOSITS_FOUND"; CreditSessionBankIncomeStatus["UserReportedNoIncome"] = "USER_REPORTED_NO_INCOME"; })(CreditSessionBankIncomeStatus = exports.CreditSessionBankIncomeStatus || (exports.CreditSessionBankIncomeStatus = {})); /** * The current status of the user. * @export * @enum {string} */ var DashboardUserStatus; (function (DashboardUserStatus) { DashboardUserStatus["Invited"] = "invited"; DashboardUserStatus["Active"] = "active"; DashboardUserStatus["Deactivated"] = "deactivated"; })(DashboardUserStatus = exports.DashboardUserStatus || (exports.DashboardUserStatus = {})); /** * A description of the source of data for a given product/data type. `INSTITUTION`: The institution supports this product, and the data was provided by the institution. `INSTITUTION_MASK`: The user manually provided the full account number, which was matched to the account mask provided by the institution. Only applicable to the `numbers` data type. `USER`: The institution does not support this product, and the data was manually provided by the user. * @export * @enum {string} */ var DataSources; (function (DataSources) { DataSources["Institution"] = "INSTITUTION"; DataSources["InstitutionMask"] = "INSTITUTION_MASK"; DataSources["User"] = "USER"; })(DataSources = exports.DataSources || (exports.DataSources = {})); /** * @export * @enum {string} */ var DepositSwitchAltCreateRequestCountryCodeEnum; (function (DepositSwitchAltCreateRequestCountryCodeEnum) { DepositSwitchAltCreateRequestCountryCodeEnum["Us"] = "US"; DepositSwitchAltCreateRequestCountryCodeEnum["Ca"] = "CA"; })(DepositSwitchAltCreateRequestCountryCodeEnum = exports.DepositSwitchAltCreateRequestCountryCodeEnum || (exports.DepositSwitchAltCreateRequestCountryCodeEnum = {})); /** * @export * @enum {string} */ var DepositSwitchCreateRequestCountryCodeEnum; (function (DepositSwitchCreateRequestCountryCodeEnum) { DepositSwitchCreateRequestCountryCodeEnum["Us"] = "US"; DepositSwitchCreateRequestCountryCodeEnum["Ca"] = "CA"; })(DepositSwitchCreateRequestCountryCodeEnum = exports.DepositSwitchCreateRequestCountryCodeEnum || (exports.DepositSwitchCreateRequestCountryCodeEnum = {})); /** * @export * @enum {string} */ var DepositSwitchGetResponseStateEnum; (function (DepositSwitchGetResponseStateEnum) { DepositSwitchGetResponseStateEnum["Initialized"] = "initialized"; DepositSwitchGetResponseStateEnum["Processing"] = "processing"; DepositSwitchGetResponseStateEnum["Completed"] = "completed"; DepositSwitchGetResponseStateEnum["Error"] = "error"; })(DepositSwitchGetResponseStateEnum = exports.DepositSwitchGetResponseStateEnum || (exports.DepositSwitchGetResponseStateEnum = {})); /** * @export * @enum {string} */ var DepositSwitchGetResponseSwitchMethodEnum; (function (DepositSwitchGetResponseSwitchMethodEnum) { DepositSwitchGetResponseSwitchMethodEnum["Instant"] = "instant"; DepositSwitchGetResponseSwitchMethodEnum["Mail"] = "mail"; DepositSwitchGetResponseSwitchMethodEnum["Pdf"] = "pdf"; DepositSwitchGetResponseSwitchMethodEnum["Null"] = "null"; })(DepositSwitchGetResponseSwitchMethodEnum = exports.DepositSwitchGetResponseSwitchMethodEnum || (exports.DepositSwitchGetResponseSwitchMethodEnum = {})); /** * @export * @enum {string} */ var DepositSwitchTargetAccountAccountSubtypeEnum; (function (DepositSwitchTargetAccountAccountSubtypeEnum) { DepositSwitchTargetAccountAccountSubtypeEnum["Checking"] = "checking"; DepositSwitchTargetAccountAccountSubtypeEnum["Savings"] = "savings"; })(DepositSwitchTargetAccountAccountSubtypeEnum = exports.DepositSwitchTargetAccountAccountSubtypeEnum || (exports.DepositSwitchTargetAccountAccountSubtypeEnum = {})); /** * Valid account subtypes for depository accounts. For a list containing descriptions of each subtype, see [Account schemas](https://plaid.com/docs/api/accounts/#StandaloneAccountType-depository). * @export * @enum {string} */ var DepositoryAccountSubtype; (function (DepositoryAccountSubtype) { DepositoryAccountSubtype["Checking"] = "checking"; DepositoryAccountSubtype["Savings"] = "savings"; DepositoryAccountSubtype["Hsa"] = "hsa"; DepositoryAccountSubtype["Cd"] = "cd"; DepositoryAccountSubtype["MoneyMarket"] = "money market"; DepositoryAccountSubtype["Paypal"] = "paypal"; DepositoryAccountSubtype["Prepaid"] = "prepaid"; DepositoryAccountSubtype["CashManagement"] = "cash management"; DepositoryAccountSubtype["Ebt"] = "ebt"; DepositoryAccountSubtype["All"] = "all"; })(DepositoryAccountSubtype = exports.DepositoryAccountSubtype || (exports.DepositoryAccountSubtype = {})); /** * The type of document. `DOCUMENT_TYPE_PAYSTUB`: A paystub. `DOCUMENT_TYPE_BANK_STATEMENT`: A bank statement. `DOCUMENT_TYPE_US_TAX_W2`: A W-2 wage and tax statement provided by a US employer reflecting wages earned by the employee. `DOCUMENT_TYPE_US_MILITARY_ERAS`: An electronic Retirement Account Statement (eRAS) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_LES`: A Leave and Earnings Statement (LES) issued by the US military. `DOCUMENT_TYPE_US_MILITARY_CLES`: A Civilian Leave and Earnings Statement (CLES) issued by the US military. `DOCUMENT_TYPE_GIG`: Used to indicate that the income is related to gig work. Does not necessarily correspond to a specific document type. `DOCUMENT_TYPE_NONE`: Used to indicate that there is no underlying document for the data. `DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF`: Used to indicate that the PDF for the paystub was generated by Plaid. `UNKNOWN`: Document type could not be determined. * @export * @enum {string} */ var DocType; (function (DocType) { DocType["Unknown"] = "UNKNOWN"; DocType["DocumentTypePaystub"] = "DOCUMENT_TYPE_PAYSTUB"; DocType["DocumentTypeBankStatement"] = "DOCUMENT_TYPE_BANK_STATEMENT"; DocType["DocumentTypeUsTaxW2"] = "DOCUMENT_TYPE_US_TAX_W2"; DocType["DocumentTypeUsMilitaryEras"] = "DOCUMENT_TYPE_US_MILITARY_ERAS"; DocType["DocumentTypeUsMilitaryLes"] = "DOCUMENT_TYPE_US_MILITARY_LES"; DocType["DocumentTypeUsMilitaryCles"] = "DOCUMENT_TYPE_US_MILITARY_CLES"; DocType["DocumentTypeGig"] = "DOCUMENT_TYPE_GIG"; DocType["DocumentTypeNone"] = "DOCUMENT_TYPE_NONE"; DocType["DocumentTypeUsTax1099Misc"] = "DOCUMENT_TYPE_US_TAX_1099_MISC"; DocType["DocumentTypeUsTax1099K"] = "DOCUMENT_TYPE_US_TAX_1099_K"; DocType["DocumentTypePlaidGeneratedPaystubPdf"] = "DOCUMENT_TYPE_PLAID_GENERATED_PAYSTUB_PDF"; })(DocType = exports.DocType || (exports.DocType = {})); /** * High level summary of whether the document in the provided image matches the formatting rules and security checks for the associated jurisdiction. For example, most identity documents have formatting rules like the following: The image of the person\'s face must have a certain contrast in order to highlight skin tone The subject in the document\'s image must remove eye glasses and pose in a certain way The informational fields (name, date of birth, ID number, etc.) must be colored and aligned according to specific rules Security features like watermarks and background patterns must be present So a `match` status for this field indicates that the document in the provided image seems to conform to the various formatting and security rules associated with the detected document. * @export * @enum {string} */ var DocumentAuthenticityMatchCode; (function (DocumentAuthenticityMatchCode) { DocumentAuthenticityMatchCode["Match"] = "match"; DocumentAuthenticityMatchCode["PartialMatch"] = "partial_match"; DocumentAuthenticityMatchCode["NoMatch"] = "no_match"; DocumentAuthenticityMatchCode["NoData"] = "no_data"; })(DocumentAuthenticityMatchCode = exports.DocumentAuthenticityMatchCode || (exports.DocumentAuthenticityMatchCode = {})); /** * A match summary describing the cross comparison between the subject\'s date of birth, extracted from the document image, and the date of birth they separately provided to the identity verification attempt. * @export * @enum {string} */ var DocumentDateOfBirthMatchCode; (function (DocumentDateOfBirthMatchCode) { DocumentDateOfBirthMatchCode["Match"] = "match"; DocumentDateOfBirthMatchCode["PartialMatch"] = "partial_match"; DocumentDateOfBirthMatchCode["NoMatch"] = "no_match"; DocumentDateOfBirthMatchCode["NoData"] = "no_data"; })(DocumentDateOfBirthMatchCode = exports.DocumentDateOfBirthMatchCode || (exports.DocumentDateOfBirthMatchCode = {})); /** * A match summary describing the cross comparison between the subject\'s name, extracted from the document image, and the name they separately provided to identity verification attempt. * @export * @enum {string} */ var DocumentNameMatchCode; (function (DocumentNameMatchCode) { DocumentNameMatchCode["Match"] = "match"; DocumentNameMatchCode["PartialMatch"] = "partial_match"; DocumentNameMatchCode["NoMatch"] = "no_match"; DocumentNameMatchCode["NoData"] = "no_data"; })(DocumentNameMatchCode = exports.DocumentNameMatchCode || (exports.DocumentNameMatchCode = {})); /** * An outcome status for this specific document submission. Distinct from the overall `documentary_verification.status` that summarizes the verification outcome from one or more documents. * @export * @enum {string} */ var DocumentStatus; (function (DocumentStatus) { DocumentStatus["Success"] = "success"; DocumentStatus["Failed"] = "failed"; DocumentStatus["ManuallyApproved"] = "manually_approved"; })(DocumentStatus = exports.DocumentStatus || (exports.DocumentStatus = {})); /** * Commonly used term to describe the earning line item. * @export * @enum {string} */ var EarningsBreakdownCanonicalDescription; (function (EarningsBreakdownCanonicalDescription) { EarningsBreakdownCanonicalDescription["Bonus"] = "BONUS"; EarningsBreakdownCanonicalDescription["Commission"] = "COMMISSION"; EarningsBreakdownCanonicalDescription["Overtime"] = "OVERTIME"; EarningsBreakdownCanonicalDescription["PaidTimeOff"] = "PAID TIME OFF"; EarningsBreakdownCanonicalDescription["RegularPay"] = "REGULAR PAY"; EarningsBreakdownCanonicalDescription["Vacation"] = "VACATION"; EarningsBreakdownCanonicalDescription["BasicAllowanceHousing"] = "BASIC ALLOWANCE HOUSING"; EarningsBreakdownCanonicalDescription["BasicAllowanceSubsistence"] = "BASIC ALLOWANCE SUBSISTENCE"; EarningsBreakdownCanonicalDescription["Other"] = "OTHER"; EarningsBreakdownCanonicalDescription["Null"] = "null"; })(EarningsBreakdownCanonicalDescription = exports.EarningsBreakdownCanonicalDescription || (exports.EarningsBreakdownCanonicalDescription = {})); /** * @export * @enum {string} */ var EmailTypeEnum; (function (EmailTypeEnum) { EmailTypeEnum["Primary"] = "primary"; EmailTypeEnum["Secondary"] = "secondary"; EmailTypeEnum["Other"] = "other"; })(EmailTypeEnum = exports.EmailTypeEnum || (exports.EmailTypeEnum = {})); /** * The types of source employment data that users should be able to share * @export * @enum {string} */ var EmploymentSourceType; (function (EmploymentSourceType) { EmploymentSourceType["Bank"] = "bank"; EmploymentSourceType["Payroll"] = "payroll"; })(EmploymentSourceType = exports.EmploymentSourceType || (exports.EmploymentSourceType = {})); /** * Current employment status. * @export * @enum {string} */ var EmploymentVerificationStatus; (function (EmploymentVerificationStatus) { EmploymentVerificationStatus["EmploymentStatusActive"] = "EMPLOYMENT_STATUS_ACTIVE"; EmploymentVerificationStatus["EmploymentStatusInactive"] = "EMPLOYMENT_STATUS_INACTIVE"; EmploymentVerificationStatus["Null"] = "null"; })(EmploymentVerificationStatus = exports.EmploymentVerificationStatus || (exports.EmploymentVerificationStatus = {})); /** * The direction of the transaction from the perspective of the account holder: `OUTFLOW` - Includes outgoing transfers, purchases, and fees. (Typically represented as a negative value on checking accounts and debit cards and a positive value on credit cards.) `INFLOW` - Includes incoming transfers, refunds, and income. (Typically represented as a positive value on checking accounts and debit cards and a negative value on credit cards.) * @export * @enum {string} */ var EnrichTransactionDirection; (function (EnrichTransactionDirection) { EnrichTransactionDirection["Inflow"] = "INFLOW"; EnrichTransactionDirection["Outflow"] = "OUTFLOW"; })(EnrichTransactionDirection = exports.EnrichTransactionDirection || (exports.EnrichTransactionDirection = {})); /** * The kind of official document represented by this object. `bik` - Russian bank code `business_number` - A number that uniquely identifies the business within a category of businesses `imo` - Number assigned to the entity by the International Maritime Organization `other` - Any document not covered by other categories `swift` - Number identifying a bank and branch. `tax_id` - Identification issued for the purpose of collecting taxes * @export * @enum {string} */ var EntityDocumentType; (function (EntityDocumentType) { EntityDocumentType["Bik"] = "bik"; EntityDocumentType["BusinessNumber"] = "business_number"; EntityDocumentType["Imo"] = "imo"; EntityDocumentType["Other"] = "other"; EntityDocumentType["Swift"] = "swift"; EntityDocumentType["TaxId"] = "tax_id"; })(EntityDocumentType = exports.EntityDocumentType || (exports.EntityDocumentType = {})); /** * Shorthand identifier for a specific screening list for entities. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_SOE`: State Owned Enterprise List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `US_CAP`: US OFAC Correspondent Account or Payable-Through Account Sanctions `US_FSE`: US OFAC Foreign Sanctions Evaders `US_MBS`: US Non-SDN Menu-Based Sanctions `US_SDN`: US Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `US_CMC`: US OFAC Non-SDN Chinese Military-Industrial Complex List `US_UVL`: Bureau of Industry and Security Unverified List `UK_HMC`: UK HM Treasury Consolidated List * @export * @enum {string} */ var EntityWatchlistCode; (function (EntityWatchlistCode) { EntityWatchlistCode["CaCon"] = "CA_CON"; EntityWatchlistCode["EuCon"] = "EU_CON"; EntityWatchlistCode["IzSoe"] = "IZ_SOE"; EntityWatchlistCode["IzUnc"] = "IZ_UNC"; EntityWatchlistCode["IzWbk"] = "IZ_WBK"; EntityWatchlistCode["UsCap"] = "US_CAP"; EntityWatchlistCode["UsFse"] = "US_FSE"; EntityWatchlistCode["UsMbs"] = "US_MBS"; EntityWatchlistCode["UsSdn"] = "US_SDN"; EntityWatchlistCode["UsSsi"] = "US_SSI"; EntityWatchlistCode["UsCmc"] = "US_CMC"; EntityWatchlistCode["UsUvl"] = "US_UVL"; EntityWatchlistCode["AuCon"] = "AU_CON"; EntityWatchlistCode["UkHmc"] = "UK_HMC"; })(EntityWatchlistCode = exports.EntityWatchlistCode || (exports.EntityWatchlistCode = {})); /** * A description of whether the associated document was expired when the verification was performed. Note: In the case where an expiration date is not present on the document or failed to be extracted, this value will be `no_data`. * @export * @enum {string} */ var ExpirationDate; (function (ExpirationDate) { ExpirationDate["NotExpired"] = "not_expired"; ExpirationDate["Expired"] = "expired"; ExpirationDate["NoData"] = "no_data"; })(ExpirationDate = exports.ExpirationDate || (exports.ExpirationDate = {})); /** * Types of document formats. (Suggested values) * @export * @enum {string} */ var FDXContentTypes; (function (FDXContentTypes) { FDXContentTypes["ApplicationPdf"] = "application/pdf"; FDXContentTypes["ImageGif"] = "image/gif"; FDXContentTypes["ImageJpeg"] = "image/jpeg"; FDXContentTypes["ImageTiff"] = "image/tiff"; FDXContentTypes["ImagePng"] = "image/png"; FDXContentTypes["ApplicationJson"] = "application/json"; })(FDXContentTypes = exports.FDXContentTypes || (exports.FDXContentTypes = {})); /** * HTTP Method to use for the request * @export * @enum {string} */ var FDXHateoasLinkAction; (function (FDXHateoasLinkAction) { FDXHateoasLinkAction["Get"] = "GET"; FDXHateoasLinkAction["Post"] = "POST"; FDXHateoasLinkAction["Patch"] = "PATCH"; FDXHateoasLinkAction["Delete"] = "DELETE"; FDXHateoasLinkAction["Put"] = "PUT"; })(FDXHateoasLinkAction = exports.FDXHateoasLinkAction || (exports.FDXHateoasLinkAction = {})); /** * Category of Notification * @export * @enum {string} */ var FDXNotificationCategory; (function (FDXNotificationCategory) { FDXNotificationCategory["Security"] = "SECURITY"; FDXNotificationCategory["Maintenance"] = "MAINTENANCE"; FDXNotificationCategory["Fraud"] = "FRAUD"; FDXNotificationCategory["Consent"] = "CONSENT"; FDXNotificationCategory["NewData"] = "NEW_DATA"; })(FDXNotificationCategory = exports.FDXNotificationCategory || (exports.FDXNotificationCategory = {})); /** * Type of entity causing origination of a notification * @export * @enum {string} */ var FDXNotificationPayloadIdType; (function (FDXNotificationPayloadIdType) { FDXNotificationPayloadIdType["Account"] = "ACCOUNT"; FDXNotificationPayloadIdType["Customer"] = "CUSTOMER"; FDXNotificationPayloadIdType["Party"] = "PARTY"; FDXNotificationPayloadIdType["Maintenance"] = "MAINTENANCE"; FDXNotificationPayloadIdType["Consent"] = "CONSENT"; })(FDXNotificationPayloadIdType = exports.FDXNotificationPayloadIdType || (exports.FDXNotificationPayloadIdType = {})); /** * Priority of notification * @export * @enum {string} */ var FDXNotificationPriority; (function (FDXNotificationPriority) { FDXNotificationPriority["High"] = "HIGH"; FDXNotificationPriority["Medium"] = "MEDIUM"; FDXNotificationPriority["Low"] = "LOW"; })(FDXNotificationPriority = exports.FDXNotificationPriority || (exports.FDXNotificationPriority = {})); /** * Severity level of notification * @export * @enum {string} */ var FDXNotificationSeverity; (function (FDXNotificationSeverity) { FDXNotificationSeverity["Emergency"] = "EMERGENCY"; FDXNotificationSeverity["Alert"] = "ALERT"; FDXNotificationSeverity["Warning"] = "WARNING"; FDXNotificationSeverity["Notice"] = "NOTICE"; FDXNotificationSeverity["Info"] = "INFO"; })(FDXNotificationSeverity = exports.FDXNotificationSeverity || (exports.FDXNotificationSeverity = {})); /** * Type of Notification * @export * @enum {string} */ var FDXNotificationType; (function (FDXNotificationType) { FDXNotificationType["ConsentRevoked"] = "CONSENT_REVOKED"; FDXNotificationType["ConsentUpdated"] = "CONSENT_UPDATED"; FDXNotificationType["Custom"] = "CUSTOM"; FDXNotificationType["Service"] = "SERVICE"; FDXNotificationType["Balance"] = "BALANCE"; FDXNotificationType["PlannedOutage"] = "PLANNED_OUTAGE"; })(FDXNotificationType = exports.FDXNotificationType || (exports.FDXNotificationType = {})); /** * The registry containing the party’s registration with name and id * @export * @enum {string} */ var FDXPartyRegistry; (function (FDXPartyRegistry) { FDXPartyRegistry["Fdx"] = "FDX"; FDXPartyRegistry["Gleif"] = "GLEIF"; FDXPartyRegistry["Icann"] = "ICANN"; FDXPartyRegistry["Private"] = "PRIVATE"; })(FDXPartyRegistry = exports.FDXPartyRegistry || (exports.FDXPartyRegistry = {})); /** * Identifies the type of a party * @export * @enum {string} */ var FDXPartyType; (function (FDXPartyType) { FDXPartyType["DataAccessPlatform"] = "DATA_ACCESS_PLATFORM"; FDXPartyType["DataProvider"] = "DATA_PROVIDER"; FDXPartyType["DataRecipient"] = "DATA_RECIPIENT"; FDXPartyType["Individual"] = "INDIVIDUAL"; FDXPartyType["Merchant"] = "MERCHANT"; FDXPartyType["Vendor"] = "VENDOR"; })(FDXPartyType = exports.FDXPartyType || (exports.FDXPartyType = {})); /** * Form 1099 Type * @export * @enum {string} */ var Form1099Type; (function (Form1099Type) { Form1099Type["Unknown"] = "FORM_1099_TYPE_UNKNOWN"; Form1099Type["Misc"] = "FORM_1099_TYPE_MISC"; Form1099Type["K"] = "FORM_1099_TYPE_K"; })(Form1099Type = exports.Form1099Type || (exports.Form1099Type = {})); /** * The outcome of the fraud check. * @export * @enum {string} */ var FraudCheckOutcome; (function (FraudCheckOutcome) { FraudCheckOutcome["Success"] = "success"; FraudCheckOutcome["Failed"] = "failed"; })(FraudCheckOutcome = exports.FraudCheckOutcome || (exports.FraudCheckOutcome = {})); /** * The outcome of the fraud check, when available. * @export * @enum {string} */ var FraudCheckOutcomeWithNoData; (function (FraudCheckOutcomeWithNoData) { FraudCheckOutcomeWithNoData["Success"] = "success"; FraudCheckOutcomeWithNoData["Failed"] = "failed"; FraudCheckOutcomeWithNoData["NoData"] = "no_data"; })(FraudCheckOutcomeWithNoData = exports.FraudCheckOutcomeWithNoData || (exports.FraudCheckOutcomeWithNoData = {})); /** * An enum indicating the match type between data provided by user and data checked against an external data source. `match` indicates that the provided input data was a strong match against external data. `partial_match` indicates the data approximately matched against external data. For example, \"Knope\" vs. \"Knope-Wyatt\" for last name. `no_match` indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data. `no_data` indicates that Plaid was unable to find external data to compare against the provided input data. `no_input` indicates that Plaid was unable to perform a check because no information was provided for this field by the end user. * @export * @enum {string} */ var HiddenMatchSummaryCode; (function (HiddenMatchSummaryCode) { HiddenMatchSummaryCode["Match"] = "match"; HiddenMatchSummaryCode["PartialMatch"] = "partial_match"; HiddenMatchSummaryCode["NoMatch"] = "no_match"; HiddenMatchSummaryCode["NoData"] = "no_data"; HiddenMatchSummaryCode["NoInput"] = "no_input"; })(HiddenMatchSummaryCode = exports.HiddenMatchSummaryCode || (exports.HiddenMatchSummaryCode = {})); /** * How Plaid should deliver the Plaid Link session to the customer. Only available to customers enabled for Link Delivery (beta). To request Link Delivery access, contact your account manager. \'sms\' will deliver via SMS. Must pass `user.phone_number`. \'email\' will deliver via email. Must pass `user.email_address`. In the Sandbox environment, this field will be ignored; use the Production environment to test Link Delivery instead. * @export * @enum {string} */ var HostedLinkDeliveryMethod; (function (HostedLinkDeliveryMethod) { HostedLinkDeliveryMethod["Sms"] = "sms"; HostedLinkDeliveryMethod["Email"] = "email"; })(HostedLinkDeliveryMethod = exports.HostedLinkDeliveryMethod || (exports.HostedLinkDeliveryMethod = {})); /** * A globally unique and human readable ID type, specific to the country and document category. For more context on this field, see [Hybrid Input Validation](https://plaid.com/docs/identity-verification/hybrid-input-validation). * @export * @enum {string} */ var IDNumberType; (function (IDNumberType) { IDNumberType["ArDni"] = "ar_dni"; IDNumberType["AuDriversLicense"] = "au_drivers_license"; IDNumberType["AuPassport"] = "au_passport"; IDNumberType["BrCpf"] = "br_cpf"; IDNumberType["CaSin"] = "ca_sin"; IDNumberType["ClRun"] = "cl_run"; IDNumberType["CnResidentCard"] = "cn_resident_card"; IDNumberType["CoNit"] = "co_nit"; IDNumberType["DkCpr"] = "dk_cpr"; IDNumberType["EgNationalId"] = "eg_national_id"; IDNumberType["EsDni"] = "es_dni"; IDNumberType["EsNie"] = "es_nie"; IDNumberType["HkHkid"] = "hk_hkid"; IDNumberType["InPan"] = "in_pan"; IDNumberType["ItCf"] = "it_cf"; IDNumberType["JoCivilId"] = "jo_civil_id"; IDNumberType["JpMyNumber"] = "jp_my_number"; IDNumberType["KeHudumaNamba"] = "ke_huduma_namba"; IDNumberType["KwCivilId"] = "kw_civil_id"; IDNumberType["MxCurp"] = "mx_curp"; IDNumberType["MxRfc"] = "mx_rfc"; IDNumberType["MyNric"] = "my_nric"; IDNumberType["NgNin"] = "ng_nin"; IDNumberType["NzDriversLicense"] = "nz_drivers_license"; IDNumberType["OmCivilId"] = "om_civil_id"; IDNumberType["PhPsn"] = "ph_psn"; IDNumberType["PlPesel"] = "pl_pesel"; IDNumberType["RoCnp"] = "ro_cnp"; IDNumberType["SaNationalId"] = "sa_national_id"; IDNumberType["SePin"] = "se_pin"; IDNumberType["SgNric"] = "sg_nric"; IDNumberType["TrTcKimlik"] = "tr_tc_kimlik"; IDNumberType["UsSsn"] = "us_ssn"; IDNumberType["UsSsnLast4"] = "us_ssn_last_4"; IDNumberType["ZaSmartId"] = "za_smart_id"; })(IDNumberType = exports.IDNumberType || (exports.IDNumberType = {})); /** * An ISO-4217 currency code. * @export * @enum {string} */ var ISOCurrencyCode; (function (ISOCurrencyCode) { ISOCurrencyCode["Usd"] = "USD"; })(ISOCurrencyCode = exports.ISOCurrencyCode || (exports.ISOCurrencyCode = {})); /** * The possible types of identity data that may have changed. * @export * @enum {string} */ var IdentityUpdateTypes; (function (IdentityUpdateTypes) { IdentityUpdateTypes["Phones"] = "PHONES"; IdentityUpdateTypes["Addresses"] = "ADDRESSES"; IdentityUpdateTypes["Emails"] = "EMAILS"; IdentityUpdateTypes["Names"] = "NAMES"; })(IdentityUpdateTypes = exports.IdentityUpdateTypes || (exports.IdentityUpdateTypes = {})); /** * A status enum indicating whether autofill succeeded or failed. * @export * @enum {string} */ var IdentityVerificationAutofillStatus; (function (IdentityVerificationAutofillStatus) { IdentityVerificationAutofillStatus["Success"] = "success"; IdentityVerificationAutofillStatus["Failed"] = "failed"; })(IdentityVerificationAutofillStatus = exports.IdentityVerificationAutofillStatus || (exports.IdentityVerificationAutofillStatus = {})); /** * The status of this Identity Verification attempt. `active` - The Identity Verification attempt is incomplete. The user may have completed part of the session, but has neither failed or passed. `success` - The Identity Verification attempt has completed, passing all steps defined to the associated Identity Verification template `failed` - The user failed one or more steps in the session and was told to contact support. `expired` - The Identity Verification attempt was active for a long period of time without being completed and was automatically marked as expired. Note that sessions currently do not expire. Automatic expiration is expected to be enabled in the future. `canceled` - The Identity Verification attempt was canceled, either via the dashboard by a user, or via API. The user may have completed part of the session, but has neither failed or passed. `pending_review` - The Identity Verification attempt template was configured to perform a screening that had one or more hits needing review. * @export * @enum {string} */ var IdentityVerificationStatus; (function (IdentityVerificationStatus) { IdentityVerificationStatus["Active"] = "active"; IdentityVerificationStatus["Success"] = "success"; IdentityVerificationStatus["Failed"] = "failed"; IdentityVerificationStatus["Expired"] = "expired"; IdentityVerificationStatus["Canceled"] = "canceled"; IdentityVerificationStatus["PendingReview"] = "pending_review"; })(IdentityVerificationStatus = exports.IdentityVerificationStatus || (exports.IdentityVerificationStatus = {})); /** * The status of a step in the Identity Verification process. * @export * @enum {string} */ var IdentityVerificationStepStatus; (function (IdentityVerificationStepStatus) { IdentityVerificationStepStatus["Success"] = "success"; IdentityVerificationStepStatus["Active"] = "active"; IdentityVerificationStepStatus["Failed"] = "failed"; IdentityVerificationStepStatus["WaitingForPrerequisite"] = "waiting_for_prerequisite"; IdentityVerificationStepStatus["NotApplicable"] = "not_applicable"; IdentityVerificationStepStatus["Skipped"] = "skipped"; IdentityVerificationStepStatus["Expired"] = "expired"; IdentityVerificationStepStatus["Canceled"] = "canceled"; IdentityVerificationStepStatus["PendingReview"] = "pending_review"; IdentityVerificationStepStatus["ManuallyApproved"] = "manually_approved"; IdentityVerificationStepStatus["ManuallyRejected"] = "manually_rejected"; })(IdentityVerificationStepStatus = exports.IdentityVerificationStepStatus || (exports.IdentityVerificationStepStatus = {})); /** * A high level description of the quality of the image the user submitted. For example, an image that is blurry, distorted by glare from a nearby light source, or improperly framed might be marked as low or medium quality. Poor quality images are more likely to fail OCR and/or template conformity checks. Note: By default, Plaid will let a user recapture document images twice before failing the entire session if we attribute the failure to low image quality. * @export * @enum {string} */ var ImageQuality; (function (ImageQuality) { ImageQuality["High"] = "high"; ImageQuality["Medium"] = "medium"; ImageQuality["Low"] = "low"; })(ImageQuality = exports.ImageQuality || (exports.ImageQuality = {})); /** * The outcome of the image quality check. * @export * @enum {string} */ var ImageQualityOutcome; (function (ImageQualityOutcome) { ImageQualityOutcome["Success"] = "success"; ImageQualityOutcome["Failed"] = "failed"; })(ImageQualityOutcome = exports.ImageQualityOutcome || (exports.ImageQualityOutcome = {})); /** * @export * @enum {string} */ var IncidentUpdateStatusEnum; (function (IncidentUpdateStatusEnum) { IncidentUpdateStatusEnum["Investigating"] = "INVESTIGATING"; IncidentUpdateStatusEnum["Identified"] = "IDENTIFIED"; IncidentUpdateStatusEnum["Scheduled"] = "SCHEDULED"; IncidentUpdateStatusEnum["Resolved"] = "RESOLVED"; IncidentUpdateStatusEnum["Unknown"] = "UNKNOWN"; })(IncidentUpdateStatusEnum = exports.IncidentUpdateStatusEnum || (exports.IncidentUpdateStatusEnum = {})); /** * The type of income. Possible values include: `\"regular\"`: regular income `\"overtime\"`: overtime income `\"bonus\"`: bonus income * @export * @enum {string} */ var IncomeBreakdownType; (function (IncomeBreakdownType) { IncomeBreakdownType["Bonus"] = "bonus"; IncomeBreakdownType["Overtime"] = "overtime"; IncomeBreakdownType["Regular"] = "regular"; IncomeBreakdownType["Null"] = "null"; })(IncomeBreakdownType = exports.IncomeBreakdownType || (exports.IncomeBreakdownType = {})); /** * Analysis options to enable for document parsing * @export * @enum {string} */ var IncomeVerificationDocParsingConfig; (function (IncomeVerificationDocParsingConfig) { IncomeVerificationDocParsingConfig["Ocr"] = "ocr"; IncomeVerificationDocParsingConfig["RiskSignals"] = "risk_signals"; })(IncomeVerificationDocParsingConfig = exports.IncomeVerificationDocParsingConfig || (exports.IncomeVerificationDocParsingConfig = {})); /** * Flow types to retrieve payroll income data * @export * @enum {string} */ var IncomeVerificationPayrollFlowType; (function (IncomeVerificationPayrollFlowType) { IncomeVerificationPayrollFlowType["DigitalIncome"] = "payroll_digital_income"; IncomeVerificationPayrollFlowType["DocumentIncome"] = "payroll_document_income"; })(IncomeVerificationPayrollFlowType = exports.IncomeVerificationPayrollFlowType || (exports.IncomeVerificationPayrollFlowType = {})); /** * The confidence that Plaid can support the user in the digital income verification flow instead of requiring a manual paystub upload. One of the following: `\"HIGH\"`: It is very likely that this user can use the digital income verification flow. \"`LOW`\": It is unlikely that this user can use the digital income verification flow. `\"UNKNOWN\"`: It was not possible to determine if the user is supportable with the information passed. * @export * @enum {string} */ var IncomeVerificationPrecheckConfidence; (function (IncomeVerificationPrecheckConfidence) { IncomeVerificationPrecheckConfidence["High"] = "HIGH"; IncomeVerificationPrecheckConfidence["Low"] = "LOW"; IncomeVerificationPrecheckConfidence["Unknown"] = "UNKNOWN"; })(IncomeVerificationPrecheckConfidence = exports.IncomeVerificationPrecheckConfidence || (exports.IncomeVerificationPrecheckConfidence = {})); /** * The types of source income data that users should be able to share * @export * @enum {string} */ var IncomeVerificationSourceType; (function (IncomeVerificationSourceType) { IncomeVerificationSourceType["Bank"] = "bank"; IncomeVerificationSourceType["Payroll"] = "payroll"; })(IncomeVerificationSourceType = exports.IncomeVerificationSourceType || (exports.IncomeVerificationSourceType = {})); /** * Shorthand identifier for a specific screening list for individuals. `AU_CON`: Australia Department of Foreign Affairs and Trade Consolidated List `CA_CON`: Government of Canada Consolidated List of Sanctions `EU_CON`: European External Action Service Consolidated List `IZ_CIA`: CIA List of Chiefs of State and Cabinet Members `IZ_IPL`: Interpol Red Notices for Wanted Persons List `IZ_PEP`: Politically Exposed Persons List `IZ_UNC`: United Nations Consolidated Sanctions `IZ_WBK`: World Bank Listing of Ineligible Firms and Individuals `UK_HMC`: UK HM Treasury Consolidated List `US_DPL`: Bureau of Industry and Security Denied Persons List `US_DTC`: US Department of State AECA Debarred `US_FBI`: US Department of Justice FBI Wanted List `US_FSE`: US OFAC Foreign Sanctions Evaders `US_ISN`: US Department of State Nonproliferation Sanctions `US_PLC`: US OFAC Palestinian Legislative Council `US_SDN`: US OFAC Specially Designated Nationals List `US_SSI`: US OFAC Sectoral Sanctions Identifications `SG_SOF`: Government of Singapore Terrorists and Terrorist Entities `TR_TWL`: Government of Turkey Terrorist Wanted List `TR_DFD`: Government of Turkey Domestic Freezing Decisions `TR_FOR`: Government of Turkey Foreign Freezing Requests `TR_WMD`: Government of Turkey Weapons of Mass Destruction `TR_CMB`: Government of Turkey Capital Markets Board * @export * @enum {string} */ var IndividualWatchlistCode; (function (IndividualWatchlistCode) { IndividualWatchlistCode["AuCon"] = "AU_CON"; IndividualWatchlistCode["CaCon"] = "CA_CON"; IndividualWatchlistCode["EuCon"] = "EU_CON"; IndividualWatchlistCode["IzCia"] = "IZ_CIA"; IndividualWatchlistCode["IzIpl"] = "IZ_IPL"; IndividualWatchlistCode["IzPep"] = "IZ_PEP"; IndividualWatchlistCode["IzUnc"] = "IZ_UNC"; IndividualWatchlistCode["IzWbk"] = "IZ_WBK"; IndividualWatchlistCode["UkHmc"] = "UK_HMC"; IndividualWatchlistCode["UsDpl"] = "US_DPL"; IndividualWatchlistCode["UsDtc"] = "US_DTC"; IndividualWatchlistCode["UsFbi"] = "US_FBI"; IndividualWatchlistCode["UsFse"] = "US_FSE"; IndividualWatchlistCode["UsIsn"] = "US_ISN"; IndividualWatchlistCode["UsMbs"] = "US_MBS"; IndividualWatchlistCode["UsPlc"] = "US_PLC"; IndividualWatchlistCode["UsSdn"] = "US_SDN"; IndividualWatchlistCode["UsSsi"] = "US_SSI"; IndividualWatchlistCode["SgSof"] = "SG_SOF"; IndividualWatchlistCode["TrTwl"] = "TR_TWL"; IndividualWatchlistCode["TrDfd"] = "TR_DFD"; IndividualWatchlistCode["TrFor"] = "TR_FOR"; IndividualWatchlistCode["TrWmd"] = "TR_WMD"; IndividualWatchlistCode["TrCmb"] = "TR_CMB"; })(IndividualWatchlistCode = exports.IndividualWatchlistCode || (exports.IndividualWatchlistCode = {})); /** * Valid account subtypes for investment accounts. For a list containing descriptions of each subtype, see [Account schemas](https://plaid.com/docs/api/accounts/#StandaloneAccountType-investment). * @export * @enum {string} */ var InvestmentAccountSubtype; (function (InvestmentAccountSubtype) { InvestmentAccountSubtype["_529"] = "529"; InvestmentAccountSubtype["_401a"] = "401a"; InvestmentAccountSubtype["_401k"] = "401k"; InvestmentAccountSubtype["_403B"] = "403B"; InvestmentAccountSubtype["_457b"] = "457b"; InvestmentAccountSubtype["Brokerage"] = "brokerage"; InvestmentAccountSubtype["CashIsa"] = "cash isa"; InvestmentAccountSubtype["CryptoExchange"] = "crypto exchange"; InvestmentAccountSubtype["EducationSavingsAccount"] = "education savings account"; InvestmentAccountSubtype["FixedAnnuity"] = "fixed annuity"; InvestmentAccountSubtype["Gic"] = "gic"; InvestmentAccountSubtype["HealthReimbursementArrangement"] = "health reimbursement arrangement"; InvestmentAccountSubtype["Hsa"] = "hsa"; InvestmentAccountSubtype["Ira"] = "ira"; InvestmentAccountSubtype["Isa"] = "isa"; InvestmentAccountSubtype["Keogh"] = "keogh"; InvestmentAccountSubtype["Lif"] = "lif"; InvestmentAccountSubtype["LifeInsurance"] = "life insurance"; InvestmentAccountSubtype["Lira"] = "lira"; InvestmentAccountSubtype["Lrif"] = "lrif"; InvestmentAccountSubtype["Lrsp"] = "lrsp"; InvestmentAccountSubtype["MutualFund"] = "mutual fund"; InvestmentAccountSubtype["NonCustodialWallet"] = "non-custodial wallet"; InvestmentAccountSubtype["NonTaxableBrokerageAccount"] = "non-taxable brokerage account"; InvestmentAccountSubtype["Other"] = "other"; InvestmentAccountSubtype["OtherAnnuity"] = "other annuity"; InvestmentAccountSubtype["OtherInsurance"] = "other insurance"; InvestmentAccountSubtype["Pension"] = "pension"; InvestmentAccountSubtype["Prif"] = "prif"; InvestmentAccountSubtype["ProfitSharingPlan"] = "profit sharing plan"; InvestmentAccountSubtype["Qshr"] = "qshr"; InvestmentAccountSubtype["Rdsp"] = "rdsp"; InvestmentAccountSubtype["Resp"] = "resp"; InvestmentAccountSubtype["Retirement"] = "retirement"; InvestmentAccountSubtype["Rlif"] = "rlif"; InvestmentAccountSubtype["Roth"] = "roth"; InvestmentAccountSubtype["Roth401k"] = "roth 401k"; InvestmentAccountSubtype["Rrif"] = "rrif"; InvestmentAccountSubtype["Rrsp"] = "rrsp"; InvestmentAccountSubtype["Sarsep"] = "sarsep"; InvestmentAccountSubtype["SepIra"] = "sep ira"; InvestmentAccountSubtype["SimpleIra"] = "simple ira"; InvestmentAccountSubtype["Sipp"] = "sipp"; InvestmentAccountSubtype["StockPlan"] = "stock plan"; InvestmentAccountSubtype["Tfsa"] = "tfsa"; InvestmentAccountSubtype["Trust"] = "trust"; InvestmentAccountSubtype["Ugma"] = "ugma"; InvestmentAccountSubtype["Utma"] = "utma"; InvestmentAccountSubtype["VariableAnnuity"] = "variable annuity"; InvestmentAccountSubtype["All"] = "all"; })(InvestmentAccountSubtype = exports.InvestmentAccountSubtype || (exports.InvestmentAccountSubtype = {})); /** * For descriptions of possible transaction types and subtypes, see the [Investment transaction types schema](https://plaid.com/docs/api/accounts/#investment-transaction-types-schema). * @export * @enum {string} */ var InvestmentTransactionSubtype; (function (InvestmentTransactionSubtype) { InvestmentTransactionSubtype["AccountFee"] = "account fee"; InvestmentTransactionSubtype["Adjustment"] = "adjustment"; InvestmentTransactionSubtype["Assignment"] = "assignment"; InvestmentTransactionSubtype["Buy"] = "buy"; InvestmentTransactionSubtype["BuyToCover"] = "buy to cover"; InvestmentTransactionSubtype["Contribution"] = "contribution"; InvestmentTransactionSubtype["Deposit"] = "deposit"; InvestmentTransactionSubtype["Distribution"] = "distribution"; InvestmentTransactionSubtype["Dividend"] = "dividend"; InvestmentTransactionSubtype["DividendReinvestment"] = "dividend reinvestment"; InvestmentTransactionSubtype["Exercise"] = "exercise"; InvestmentTransactionSubtype["Expire"] = "expire"; InvestmentTransactionSubtype["FundFee"] = "fund fee"; InvestmentTransactionSubtype["Interest"] = "interest"; InvestmentTransactionSubtype["InterestReceivable"] = "interest receivable"; InvestmentTransactionSubtype["InterestReinvestment"] = "interest reinvestment"; InvestmentTransactionSubtype["LegalFee"] = "legal fee"; InvestmentTransactionSubtype["LoanPayment"] = "loan payment"; InvestmentTransactionSubtype["LongTermCapitalGain"] = "long-term capital gain"; InvestmentTransactionSubtype["LongTermCapitalGainReinvestment"] = "long-term capital gain reinvestment"; InvestmentTransactionSubtype["ManagementFee"] = "management fee"; InvestmentTransactionSubtype["MarginExpense"] = "margin expense"; InvestmentTransactionSubtype["Merger"] = "merger"; InvestmentTransactionSubtype["MiscellaneousFee"] = "miscellaneous fee"; InvestmentTransactionSubtype["NonQualifiedDividend"] = "non-qualified dividend"; InvestmentTransactionSubtype["NonResidentTax"] = "non-resident tax"; InvestmentTransactionSubtype["PendingCredit"] = "pending credit"; InvestmentTransactionSubtype["PendingDebit"] = "pending debit"; InvestmentTransactionSubtype["QualifiedDividend"] = "qualified dividend"; InvestmentTransactionSubtype["Rebalance"] = "rebalance"; InvestmentTransactionSubtype["ReturnOfPrincipal"] = "return of principal"; InvestmentTransactionSubtype["Request"] = "request"; InvestmentTransactionSubtype["Sell"] = "sell"; InvestmentTransactionSubtype["SellShort"] = "sell short"; InvestmentTransactionSubtype["Send"] = "send"; InvestmentTransactionSubtype["ShortTermCapitalGain"] = "short-term capital gain"; InvestmentTransactionSubtype["ShortTermCapitalGainReinvestment"] = "short-term capital gain reinvestment"; InvestmentTransactionSubtype["SpinOff"] = "spin off"; InvestmentTransactionSubtype["Split"] = "split"; InvestmentTransactionSubtype["StockDistribution"] = "stock distribution"; InvestmentTransactionSubtype["Tax"] = "tax"; InvestmentTransactionSubtype["TaxWithheld"] = "tax withheld"; InvestmentTransactionSubtype["Trade"] = "trade"; InvestmentTransactionSubtype["Transfer"] = "transfer"; InvestmentTransactionSubtype["TransferFee"] = "transfer fee"; InvestmentTransactionSubtype["TrustFee"] = "trust fee"; InvestmentTransactionSubtype["UnqualifiedGain"] = "unqualified gain"; InvestmentTransactionSubtype["Withdrawal"] = "withdrawal"; })(InvestmentTransactionSubtype = exports.InvestmentTransactionSubtype || (exports.InvestmentTransactionSubtype = {})); /** * Value is one of the following: `buy`: Buying an investment `sell`: Selling an investment `cancel`: A cancellation of a pending transaction `cash`: Activity that modifies a cash position `fee`: A fee on the account `transfer`: Activity which modifies a position, but not through buy/sell activity e.g. options exercise, portfolio transfer For descriptions of possible transaction types and subtypes, see the [Investment transaction types schema](https://plaid.com/docs/api/accounts/#investment-transaction-types-schema). * @export * @enum {string} */ var InvestmentTransactionType; (function (InvestmentTransactionType) { InvestmentTransactionType["Buy"] = "buy"; InvestmentTransactionType["Sell"] = "sell"; InvestmentTransactionType["Cancel"] = "cancel"; InvestmentTransactionType["Cash"] = "cash"; InvestmentTransactionType["Fee"] = "fee"; InvestmentTransactionType["Transfer"] = "transfer"; })(InvestmentTransactionType = exports.InvestmentTransactionType || (exports.InvestmentTransactionType = {})); /** * The current status of the issue. * @export * @enum {string} */ var IssuesStatus; (function (IssuesStatus) { IssuesStatus["Reported"] = "REPORTED"; IssuesStatus["AwaitingResolution"] = "AWAITING_RESOLUTION"; IssuesStatus["FixInProgress"] = "FIX_IN_PROGRESS"; IssuesStatus["FixPendingValidation"] = "FIX_PENDING_VALIDATION"; IssuesStatus["CannotFix"] = "CANNOT_FIX"; IssuesStatus["Resolved"] = "RESOLVED"; })(IssuesStatus = exports.IssuesStatus || (exports.IssuesStatus = {})); /** * A binary match indicator specifying whether the country that issued the provided document matches the country that the user separately provided to Plaid. Note: You can configure whether a `no_match` on `issuing_country` fails the `documentary_verification` by editing your Plaid Template. * @export * @enum {string} */ var IssuingCountry; (function (IssuingCountry) { IssuingCountry["Match"] = "match"; IssuingCountry["NoMatch"] = "no_match"; })(IssuingCountry = exports.IssuingCountry || (exports.IssuingCountry = {})); /** * @export * @enum {string} */ var ItemUpdateTypeEnum; (function (ItemUpdateTypeEnum) { ItemUpdateTypeEnum["Background"] = "background"; ItemUpdateTypeEnum["UserPresentRequired"] = "user_present_required"; })(ItemUpdateTypeEnum = exports.ItemUpdateTypeEnum || (exports.ItemUpdateTypeEnum = {})); /** * The method used to populate Auth data for the Item. This field is only populated for Items that have had Auth numbers data set on at least one of its accounts, and will be `null` otherwise. For info about the various flows, see our [Auth coverage documentation](https://plaid.com/docs/auth/coverage/). `INSTANT_AUTH`: The Item\'s Auth data was provided directly by the user\'s institution connection. `INSTANT_MATCH`: The Item\'s Auth data was provided via the Instant Match fallback flow. `AUTOMATED_MICRODEPOSITS`: The Item\'s Auth data was provided via the Automated Micro-deposits flow. `SAME_DAY_MICRODEPOSITS`: The Item\'s Auth data was provided via the Same Day Micro-deposits flow. `INSTANT_MICRODEPOSITS`: The Item\'s Auth data was provided via the Instant Micro-deposits flow. `DATABASE_MATCH`: The Item\'s Auth data was provided via the Database Match flow. `DATABASE_INSIGHTS`: The Item\'s Auth data was provided via the Database Insights flow. `TRANSFER_MIGRATED`: The Item\'s Auth data was provided via [`/transfer/migrate_account`](https://plaid.com/docs/api/products/transfer/account-linking/#migrate-account-into-transfers). `INVESTMENTS_FALLBACK`: The Item\'s Auth data for Investments Move was provided via a [fallback flow](https://plaid.com/docs/investments-move/#fallback-flows). * @export * @enum {string} */ var ItemAuthMethod; (function (ItemAuthMethod) { ItemAuthMethod["InstantAuth"] = "INSTANT_AUTH"; ItemAuthMethod["InstantMatch"] = "INSTANT_MATCH"; ItemAuthMethod["AutomatedMicrodeposits"] = "AUTOMATED_MICRODEPOSITS"; ItemAuthMethod["SameDayMicrodeposits"] = "SAME_DAY_MICRODEPOSITS"; ItemAuthMethod["InstantMicrodeposits"] = "INSTANT_MICRODEPOSITS"; ItemAuthMethod["DatabaseMatch"] = "DATABASE_MATCH"; ItemAuthMethod["DatabaseInsights"] = "DATABASE_INSIGHTS"; ItemAuthMethod["TransferMigrated"] = "TRANSFER_MIGRATED"; ItemAuthMethod["InvestmentsFallback"] = "INVESTMENTS_FALLBACK"; })(ItemAuthMethod = exports.ItemAuthMethod || (exports.ItemAuthMethod = {})); /** * A data scope for the products that a user can consent to in [Data Transparency Messaging](/docs/link/data-transparency-messaging-migration-guide) * @export * @enum {string} */ var ItemConsentedDataScope; (function (ItemConsentedDataScope) { ItemConsentedDataScope["AccountAndBalanceInfo"] = "account_and_balance_info"; ItemConsentedDataScope["ContactInfo"] = "contact_info"; ItemConsentedDataScope["AccountAndRoutingNumbers"] = "account_and_routing_numbers"; ItemConsentedDataScope["Transactions"] = "transactions"; ItemConsentedDataScope["CreditAndLoans"] = "credit_and_loans"; ItemConsentedDataScope["Investments"] = "investments"; ItemConsentedDataScope["BankStatements"] = "bank_statements"; ItemConsentedDataScope["RiskInfo"] = "risk_info"; })(ItemConsentedDataScope = exports.ItemConsentedDataScope || (exports.ItemConsentedDataScope = {})); /** * Enum representing the entity authenticating the user. * @export * @enum {string} */ var ItemCreateAuthentication; (function (ItemCreateAuthentication) { ItemCreateAuthentication["Unknown"] = "UNKNOWN"; ItemCreateAuthentication["DataPartner"] = "DATA_PARTNER"; ItemCreateAuthentication["Plaid"] = "PLAID"; })(ItemCreateAuthentication = exports.ItemCreateAuthentication || (exports.ItemCreateAuthentication = {})); /** * @export * @enum {string} */ var ItemWithConsentFieldsUpdateTypeEnum; (function (ItemWithConsentFieldsUpdateTypeEnum) { ItemWithConsentFieldsUpdateTypeEnum["Background"] = "background"; ItemWithConsentFieldsUpdateTypeEnum["UserPresentRequired"] = "user_present_required"; })(ItemWithConsentFieldsUpdateTypeEnum = exports.ItemWithConsentFieldsUpdateTypeEnum || (exports.ItemWithConsentFieldsUpdateTypeEnum = {})); /** * The delivery method to be used to deliver the Hosted Link session URL. `SMS`: The URL will be delivered through SMS `EMAIL`: The URL will be delivered through email * @export * @enum {string} */ var LinkDeliveryDeliveryMethod; (function (LinkDeliveryDeliveryMethod) { LinkDeliveryDeliveryMethod["Sms"] = "SMS"; LinkDeliveryDeliveryMethod["Email"] = "EMAIL"; })(LinkDeliveryDeliveryMethod = exports.LinkDeliveryDeliveryMethod || (exports.LinkDeliveryDeliveryMethod = {})); /** * The status of the given Hosted Link session. `CREATED`: The session is created but not yet accessed by the user `OPENED`: The session is opened by the user but not yet completed `EXITED`: The session has been exited by the user `COMPLETED`: The session has been completed by the user `EXPIRED`: The session has expired * @export * @enum {string} */ var LinkDeliverySessionStatus; (function (LinkDeliverySessionStatus) { LinkDeliverySessionStatus["Created"] = "CREATED"; LinkDeliverySessionStatus["Opened"] = "OPENED"; LinkDeliverySessionStatus["Exited"] = "EXITED"; LinkDeliverySessionStatus["Completed"] = "COMPLETED"; LinkDeliverySessionStatus["Expired"] = "EXPIRED"; })(LinkDeliverySessionStatus = exports.LinkDeliverySessionStatus || (exports.LinkDeliverySessionStatus = {})); /** * Indicates an Item\'s micro-deposit-based verification or database verification status. * @export * @enum {string} */ var LinkDeliveryVerificationStatus; (function (LinkDeliveryVerificationStatus) { LinkDeliveryVerificationStatus["AutomaticallyVerified"] = "automatically_verified"; LinkDeliveryVerificationStatus["PendingAutomaticVerification"] = "pending_automatic_verification"; LinkDeliveryVerificationStatus["PendingManualVerification"] = "pending_manual_verification"; LinkDeliveryVerificationStatus["ManuallyVerified"] = "manually_verified"; LinkDeliveryVerificationStatus["VerificationExpired"] = "verification_expired"; LinkDeliveryVerificationStatus["VerificationFailed"] = "verification_failed"; LinkDeliveryVerificationStatus["DatabaseMatched"] = "database_matched"; LinkDeliveryVerificationStatus["DatabaseInsightsPending"] = "database_insights_pending"; })(LinkDeliveryVerificationStatus = exports.LinkDeliveryVerificationStatus || (exports.LinkDeliveryVerificationStatus = {})); /** * The type of Link callback event * @export * @enum {string} */ var LinkDeliveryWebhookCallbackType; (function (LinkDeliveryWebhookCallbackType) { LinkDeliveryWebhookCallbackType["Success"] = "ON_SUCCESS"; LinkDeliveryWebhookCallbackType["Event"] = "ON_EVENT"; LinkDeliveryWebhookCallbackType["Exit"] = "ON_EXIT"; })(LinkDeliveryWebhookCallbackType = exports.LinkDeliveryWebhookCallbackType || (exports.LinkDeliveryWebhookCallbackType = {})); /** * The communication method used to deliver the Hosted Link session * @export * @enum {string} */ var LinkDeliveryWebhookCommunicationMethod; (function (LinkDeliveryWebhookCommunicationMethod) { LinkDeliveryWebhookCommunicationMethod["Sms"] = "SMS"; LinkDeliveryWebhookCommunicationMethod["Email"] = "EMAIL"; })(LinkDeliveryWebhookCommunicationMethod = exports.LinkDeliveryWebhookCommunicationMethod || (exports.LinkDeliveryWebhookCommunicationMethod = {})); /** * The status of the delivery of the Hosted Link to the user * @export * @enum {string} */ var LinkDeliveryWebhookDeliveryStatus; (function (LinkDeliveryWebhookDeliveryStatus) { LinkDeliveryWebhookDeliveryStatus["Success"] = "SUCCESS"; LinkDeliveryWebhookDeliveryStatus["Failure"] = "FAILURE"; })(LinkDeliveryWebhookDeliveryStatus = exports.LinkDeliveryWebhookDeliveryStatus || (exports.LinkDeliveryWebhookDeliveryStatus = {})); /** * A string representing the event that has just occurred in the Link flow. * @export * @enum {string} */ var LinkEventName; (function (LinkEventName) { LinkEventName["BankIncomeInsightsCompleted"] = "BANK_INCOME_INSIGHTS_COMPLETED"; LinkEventName["CloseOauth"] = "CLOSE_OAUTH"; LinkEventName["Error"] = "ERROR"; LinkEventName["Exit"] = "EXIT"; LinkEventName["FailOauth"] = "FAIL_OAUTH"; LinkEventName["Handoff"] = "HANDOFF"; LinkEventName["IssueFollowed"] = "ISSUE_FOLLOWED"; LinkEventName["Open"] = "OPEN"; LinkEventName["OpenMyPlaid"] = "OPEN_MY_PLAID"; LinkEventName["OpenOauth"] = "OPEN_OAUTH"; LinkEventName["SearchInstitution"] = "SEARCH_INSTITUTION"; LinkEventName["SelectAuthType"] = "SELECT_AUTH_TYPE"; LinkEventName["SelectBrand"] = "SELECT_BRAND"; LinkEventName["SelectDegradedInstitution"] = "SELECT_DEGRADED_INSTITUTION"; LinkEventName["SelectDownInstitution"] = "SELECT_DOWN_INSTITUTION"; LinkEventName["SelectFilteredInstitution"] = "SELECT_FILTERED_INSTITUTION"; LinkEventName["SelectInstitution"] = "SELECT_INSTITUTION"; LinkEventName["SubmitAccountNumber"] = "SUBMIT_ACCOUNT_NUMBER"; LinkEventName["SubmitCredentials"] = "SUBMIT_CREDENTIALS"; LinkEventName["SubmitDocuments"] = "SUBMIT_DOCUMENTS"; LinkEventName["SubmitDocumentsError"] = "SUBMIT_DOCUMENTS_ERROR"; LinkEventName["SubmitDocumentsSuccess"] = "SUBMIT_DOCUMENTS_SUCCESS"; LinkEventName["SubmitMfa"] = "SUBMIT_MFA"; LinkEventName["SubmitRoutingNumber"] = "SUBMIT_ROUTING_NUMBER"; LinkEventName["TransitionView"] = "TRANSITION_VIEW"; LinkEventName["ViewDataTypes"] = "VIEW_DATA_TYPES"; })(LinkEventName = exports.LinkEventName || (exports.LinkEventName = {})); /** * The status of a transfer. Returned only when [Transfer UI](/docs/transfer/using-transfer-ui) is implemented. - `COMPLETE` – The transfer was completed. - `INCOMPLETE` – The transfer could not be completed. For help, see [Troubleshooting transfers](/docs/transfer/using-transfer-ui#troubleshooting-transfers). * @export * @enum {string} */ var LinkSessionSuccessMetadataTransferStatus; (function (LinkSessionSuccessMetadataTransferStatus) { LinkSessionSuccessMetadataTransferStatus["Complete"] = "COMPLETE"; LinkSessionSuccessMetadataTransferStatus["Incomplete"] = "INCOMPLETE"; LinkSessionSuccessMetadataTransferStatus["Null"] = "null"; })(LinkSessionSuccessMetadataTransferStatus = exports.LinkSessionSuccessMetadataTransferStatus || (exports.LinkSessionSuccessMetadataTransferStatus = {})); /** * @export * @enum {string} */ var LinkTokenCreateRequestAuthRerouteToCredentialsEnum; (function (LinkTokenCreateRequestAuthRerouteToCredentialsEnum) { LinkTokenCreateRequestAuthRerouteToCredentialsEnum["Off"] = "OFF"; LinkTokenCreateRequestAuthRerouteToCredentialsEnum["Optional"] = "OPTIONAL"; LinkTokenCreateRequestAuthRerouteToCredentialsEnum["Forced"] = "FORCED"; })(LinkTokenCreateRequestAuthRerouteToCredentialsEnum = exports.LinkTokenCreateRequestAuthRerouteToCredentialsEnum || (exports.LinkTokenCreateRequestAuthRerouteToCredentialsEnum = {})); /** * @export * @enum {string} */ var LinkTokenCreateRequestAuthFlowTypeEnum; (function (LinkTokenCreateRequestAuthFlowTypeEnum) { LinkTokenCreateRequestAuthFlowTypeEnum["FlexibleAuth"] = "FLEXIBLE_AUTH"; })(LinkTokenCreateRequestAuthFlowTypeEnum = exports.LinkTokenCreateRequestAuthFlowTypeEnum || (exports.LinkTokenCreateRequestAuthFlowTypeEnum = {})); /** * Valid account subtypes for loan accounts. For a list containing descriptions of each subtype, see [Account schemas](https://plaid.com/docs/api/accounts/#StandaloneAccountType-loan). * @export * @enum {string} */ var LoanAccountSubtype; (function (LoanAccountSubtype) { LoanAccountSubtype["Auto"] = "auto"; LoanAccountSubtype["Business"] = "business"; LoanAccountSubtype["Commercial"] = "commercial"; LoanAccountSubtype["Construction"] = "construction"; LoanAccountSubtype["Consumer"] = "consumer"; LoanAccountSubtype["HomeEquity"] = "home equity"; LoanAccountSubtype["Loan"] = "loan"; LoanAccountSubtype["Mortgage"] = "mortgage"; LoanAccountSubtype["LineOfCredit"] = "line of credit"; LoanAccountSubtype["Student"] = "student"; LoanAccountSubtype["Other"] = "other"; LoanAccountSubtype["All"] = "all"; })(LoanAccountSubtype = exports.LoanAccountSubtype || (exports.LoanAccountSubtype = {})); /** * A value from a MISMO prescribed list that specifies the type of loan identifier. * @export * @enum {string} */ var LoanIdentifierType; (function (LoanIdentifierType) { LoanIdentifierType["LenderLoan"] = "LenderLoan"; LoanIdentifierType["UniversalLoan"] = "UniversalLoan"; })(LoanIdentifierType = exports.LoanIdentifierType || (exports.LoanIdentifierType = {})); /** * An enum indicating the match type between data provided by user and data checked against an external data source. `match` indicates that the provided input data was a strong match against external data. `partial_match` indicates the data approximately matched against external data. For example, \"Knope\" vs. \"Knope-Wyatt\" for last name. `no_match` indicates that Plaid was able to perform a check against an external data source and it did not match the provided input data. `no_data` indicates that Plaid was unable to find external data to compare against the provided input data. `no_input` indicates that Plaid was unable to perform a check because no information was provided for this field by the end user. * @export * @enum {string} */ var MatchSummaryCode; (function (MatchSummaryCode) { MatchSummaryCode["Match"] = "match"; MatchSummaryCode["PartialMatch"] = "partial_match"; MatchSummaryCode["NoMatch"] = "no_match"; MatchSummaryCode["NoData"] = "no_data"; MatchSummaryCode["NoInput"] = "no_input"; })(MatchSummaryCode = exports.MatchSummaryCode || (exports.MatchSummaryCode = {})); /** * Describes the reason you are generating a Consumer Report for this user. `ACCOUNT_REVIEW_CREDIT`: In connection with a consumer credit transaction for the review or collection of an account pursuant to FCRA Section 604(a)(3)(A). `WRITTEN_INSTRUCTION_OTHER`: In accordance with the written instructions of the consumer pursuant to FCRA Section 604(a)(2), such as when an individual agrees to act as a guarantor or assumes personal liability for a consumer, business, or commercial loan. * @export * @enum {string} */ var MonitoringConsumerReportPermissiblePurpose; (function (MonitoringConsumerReportPermissiblePurpose) { MonitoringConsumerReportPermissiblePurpose["AccountReviewCredit"] = "ACCOUNT_REVIEW_CREDIT"; MonitoringConsumerReportPermissiblePurpose["WrittenInstructionOther"] = "WRITTEN_INSTRUCTION_OTHER"; })(MonitoringConsumerReportPermissiblePurpose = exports.MonitoringConsumerReportPermissiblePurpose || (exports.MonitoringConsumerReportPermissiblePurpose = {})); /** * Enum for the status of the insights * @export * @enum {string} */ var MonitoringInsightsStatus; (function (MonitoringInsightsStatus) { MonitoringInsightsStatus["Available"] = "AVAILABLE"; MonitoringInsightsStatus["Failed"] = "FAILED"; MonitoringInsightsStatus["Pending"] = "PENDING"; MonitoringInsightsStatus["Unsupported"] = "UNSUPPORTED"; MonitoringInsightsStatus["Unhealthy"] = "UNHEALTHY"; })(MonitoringInsightsStatus = exports.MonitoringInsightsStatus || (exports.MonitoringInsightsStatus = {})); /** * Enum for the status of the Item\'s insights * @export * @enum {string} */ var MonitoringItemStatusCode; (function (MonitoringItemStatusCode) { MonitoringItemStatusCode["Available"] = "AVAILABLE"; MonitoringItemStatusCode["Failed"] = "FAILED"; MonitoringItemStatusCode["Pending"] = "PENDING"; MonitoringItemStatusCode["ItemNotSupported"] = "ITEM_NOT_SUPPORTED"; MonitoringItemStatusCode["ItemLoginRequired"] = "ITEM_LOGIN_REQUIRED"; })(MonitoringItemStatusCode = exports.MonitoringItemStatusCode || (exports.MonitoringItemStatusCode = {})); /** * Enum representing the overall network status of the user. * @export * @enum {string} */ var NetworkStatusGetResponseNetworkStatus; (function (NetworkStatusGetResponseNetworkStatus) { NetworkStatusGetResponseNetworkStatus["Unknown"] = "UNKNOWN"; NetworkStatusGetResponseNetworkStatus["ReturningUser"] = "RETURNING_USER"; })(NetworkStatusGetResponseNetworkStatus = exports.NetworkStatusGetResponseNetworkStatus || (exports.NetworkStatusGetResponseNetworkStatus = {})); /** * The type of transfer. Valid values are `debit` or `credit`. A `debit` indicates a transfer of money into the origination account; a `credit` indicates a transfer of money out of the origination account. This field is omitted for Plaid Ledger Sweep events. * @export * @enum {string} */ var OmittableTransferType; (function (OmittableTransferType) { OmittableTransferType["Debit"] = "debit"; OmittableTransferType["Credit"] = "credit"; })(OmittableTransferType = exports.OmittableTransferType || (exports.OmittableTransferType = {})); /** * The originator\'s expected transfer frequency. * @export * @enum {string} */ var OriginatorExpectedTransferFrequency; (function (OriginatorExpectedTransferFrequency) { OriginatorExpectedTransferFrequency["OncePerMonth"] = "once_per_month"; OriginatorExpectedTransferFrequency["TwicePerMonth"] = "twice_per_month"; OriginatorExpectedTransferFrequency["OncePerWeek"] = "once_per_week"; OriginatorExpectedTransferFrequency["Daily"] = "daily"; })(OriginatorExpectedTransferFrequency = exports.OriginatorExpectedTransferFrequency || (exports.OriginatorExpectedTransferFrequency = {})); /** * Valid account subtypes for other accounts. For a list containing descriptions of each subtype, see [Account schemas](https://plaid.com/docs/api/accounts/#StandaloneAccountType-other). * @export * @enum {string} */ var OtherAccountSubtype; (function (OtherAccountSubtype) { OtherAccountSubtype["Other"] = "other"; OtherAccountSubtype["All"] = "all"; })(OtherAccountSubtype = exports.OtherAccountSubtype || (exports.OtherAccountSubtype = {})); /** * `investment:` Investment account. `credit:` Credit card `depository:` Depository account `loan:` Loan account `payroll:` Payroll account `other:` Non-specified account type See the [Account type schema](https://plaid.com/docs/api/accounts#account-type-schema) for a full listing of account types and corresponding subtypes. * @export * @enum {string} */ var OverrideAccountType; (function (OverrideAccountType) { OverrideAccountType["Investment"] = "investment"; OverrideAccountType["Credit"] = "credit"; OverrideAccountType["Depository"] = "depository"; OverrideAccountType["Loan"] = "loan"; OverrideAccountType["Payroll"] = "payroll"; OverrideAccountType["Other"] = "other"; })(OverrideAccountType = exports.OverrideAccountType || (exports.OverrideAccountType = {})); /** * How an asset is owned. `association`: Ownership by a corporation, partnership, or unincorporated association, including for-profit and not-for-profit organizations. `individual`: Ownership by an individual. `joint`: Joint ownership by multiple parties. `trust`: Ownership by a revocable or irrevocable trust. * @export * @enum {string} */ var OwnershipType; (function (OwnershipType) { OwnershipType["Null"] = "null"; OwnershipType["Individual"] = "individual"; OwnershipType["Joint"] = "joint"; OwnershipType["Association"] = "association"; OwnershipType["Trust"] = "trust"; })(OwnershipType = exports.OwnershipType || (exports.OwnershipType = {})); /** * Field describing whether the associated address is a post office box. Will be `yes` when a P.O. box is detected, `no` when Plaid confirmed the address is not a P.O. box, and `no_data` when Plaid was not able to determine if the address is a P.O. box. * @export * @enum {string} */ var POBoxStatus; (function (POBoxStatus) { POBoxStatus["Yes"] = "yes"; POBoxStatus["No"] = "no"; POBoxStatus["NoData"] = "no_data"; })(POBoxStatus = exports.POBoxStatus || (exports.POBoxStatus = {})); /** * The status of the addendum to the Plaid MSA (\"flowdown\") for the end customer. * @export * @enum {string} */ var PartnerEndCustomerFlowdownStatus; (function (PartnerEndCustomerFlowdownStatus) { PartnerEndCustomerFlowdownStatus["NotStarted"] = "NOT_STARTED"; PartnerEndCustomerFlowdownStatus["InReview"] = "IN_REVIEW"; PartnerEndCustomerFlowdownStatus["Negotiation"] = "NEGOTIATION"; PartnerEndCustomerFlowdownStatus["Complete"] = "COMPLETE"; })(PartnerEndCustomerFlowdownStatus = exports.PartnerEndCustomerFlowdownStatus || (exports.PartnerEndCustomerFlowdownStatus = {})); /** * The registration status for the end customer\'s application. * @export * @enum {string} */ var PartnerEndCustomerOAuthInstitutionApplicationStatus; (function (PartnerEndCustomerOAuthInstitutionApplicationStatus) { PartnerEndCustomerOAuthInstitutionApplicationStatus["NotStarted"] = "NOT_STARTED"; PartnerEndCustomerOAuthInstitutionApplicationStatus["Processing"] = "PROCESSING"; PartnerEndCustomerOAuthInstitutionApplicationStatus["Approved"] = "APPROVED"; PartnerEndCustomerOAuthInstitutionApplicationStatus["Enabled"] = "ENABLED"; PartnerEndCustomerOAuthInstitutionApplicationStatus["AttentionRequired"] = "ATTENTION_REQUIRED"; })(PartnerEndCustomerOAuthInstitutionApplicationStatus = exports.PartnerEndCustomerOAuthInstitutionApplicationStatus || (exports.PartnerEndCustomerOAuthInstitutionApplicationStatus = {})); /** * The OAuth status of the update * @export * @enum {string} */ var PartnerEndCustomerOAuthStatusUpdatedValues; (function (PartnerEndCustomerOAuthStatusUpdatedValues) { PartnerEndCustomerOAuthStatusUpdatedValues["NotStarted"] = "not-started"; PartnerEndCustomerOAuthStatusUpdatedValues["Processing"] = "processing"; PartnerEndCustomerOAuthStatusUpdatedValues["Approved"] = "approved"; PartnerEndCustomerOAuthStatusUpdatedValues["Enabled"] = "enabled"; PartnerEndCustomerOAuthStatusUpdatedValues["AttentionRequired"] = "attention-required"; })(PartnerEndCustomerOAuthStatusUpdatedValues = exports.PartnerEndCustomerOAuthStatusUpdatedValues || (exports.PartnerEndCustomerOAuthStatusUpdatedValues = {})); /** * The status of the end customer\'s security questionnaire. * @export * @enum {string} */ var PartnerEndCustomerQuestionnaireStatus; (function (PartnerEndCustomerQuestionnaireStatus) { PartnerEndCustomerQuestionnaireStatus["NotStarted"] = "NOT_STARTED"; PartnerEndCustomerQuestionnaireStatus["Received"] = "RECEIVED"; PartnerEndCustomerQuestionnaireStatus["Complete"] = "COMPLETE"; })(PartnerEndCustomerQuestionnaireStatus = exports.PartnerEndCustomerQuestionnaireStatus || (exports.PartnerEndCustomerQuestionnaireStatus = {})); /** * The status of the given end customer. `UNDER_REVIEW`: The end customer has been created and enabled in Sandbox and Limited Production. The end customer must be manually reviewed by the Plaid team before it can be enabled in full production, at which point its status will automatically transition to `PENDING_ENABLEMENT` or `DENIED`. `PENDING_ENABLEMENT`: The end customer is ready to be fully enabled in the Production environment. Call the `/partner/customer/enable` endpoint to enable the end customer in full Production. `ACTIVE`: The end customer has been fully enabled in all environments. `DENIED`: The end customer has been created and enabled in Sandbox and Limited Production, but it did not pass review by the Plaid team and therefore cannot be enabled for full Production access. Talk to your Account Manager for more information. * @export * @enum {string} */ var PartnerEndCustomerStatus; (function (PartnerEndCustomerStatus) { PartnerEndCustomerStatus["UnderReview"] = "UNDER_REVIEW"; PartnerEndCustomerStatus["PendingEnablement"] = "PENDING_ENABLEMENT"; PartnerEndCustomerStatus["Active"] = "ACTIVE"; PartnerEndCustomerStatus["Denied"] = "DENIED"; })(PartnerEndCustomerStatus = exports.PartnerEndCustomerStatus || (exports.PartnerEndCustomerStatus = {})); /** * A value from a MISMO defined list that identifies the role that the party plays in the transaction. Parties may be either a person or legal entity. A party may play multiple roles in a transaction.A value from a MISMO defined list that identifies the role that the party plays in the transaction. Parties may be either a person or legal entity. A party may play multiple roles in a transaction. * @export * @enum {string} */ var PartyRoleType; (function (PartyRoleType) { PartyRoleType["Borrower"] = "Borrower"; })(PartyRoleType = exports.PartyRoleType || (exports.PartyRoleType = {})); /** * The frequency of the pay period. * @export * @enum {string} */ var PayFrequencyValue; (function (PayFrequencyValue) { PayFrequencyValue["Monthly"] = "monthly"; PayFrequencyValue["Semimonthly"] = "semimonthly"; PayFrequencyValue["Weekly"] = "weekly"; PayFrequencyValue["Biweekly"] = "biweekly"; PayFrequencyValue["Unknown"] = "unknown"; PayFrequencyValue["Null"] = "null"; })(PayFrequencyValue = exports.PayFrequencyValue || (exports.PayFrequencyValue = {})); /** * The frequency at which an individual is paid. * @export * @enum {string} */ var PayPeriodDetailsPayFrequency; (function (PayPeriodDetailsPayFrequency) { PayPeriodDetailsPayFrequency["PayFrequencyUnknown"] = "PAY_FREQUENCY_UNKNOWN"; PayPeriodDetailsPayFrequency["PayFrequencyWeekly"] = "PAY_FREQUENCY_WEEKLY"; PayPeriodDetailsPayFrequency["PayFrequencyBiweekly"] = "PAY_FREQUENCY_BIWEEKLY"; PayPeriodDetailsPayFrequency["PayFrequencySemimonthly"] = "PAY_FREQUENCY_SEMIMONTHLY"; PayPeriodDetailsPayFrequency["PayFrequencyMonthly"] = "PAY_FREQUENCY_MONTHLY"; PayPeriodDetailsPayFrequency["Null"] = "null"; })(PayPeriodDetailsPayFrequency = exports.PayPeriodDetailsPayFrequency || (exports.PayPeriodDetailsPayFrequency = {})); /** * The ISO-4217 currency code of the payment. For standing orders and payment consents, `\"GBP\"` must be used. For Poland, Denmark, Sweden and Norway, only the local currency is currently supported. * @export * @enum {string} */ var PaymentAmountCurrency; (function (PaymentAmountCurrency) { PaymentAmountCurrency["Gbp"] = "GBP"; PaymentAmountCurrency["Eur"] = "EUR"; PaymentAmountCurrency["Pln"] = "PLN"; PaymentAmountCurrency["Sek"] = "SEK"; PaymentAmountCurrency["Dkk"] = "DKK"; PaymentAmountCurrency["Nok"] = "NOK"; })(PaymentAmountCurrency = exports.PaymentAmountCurrency || (exports.PaymentAmountCurrency = {})); /** * The channel used to make a payment. `online:` transactions that took place online. `in store:` transactions that were made at a physical location. `other:` transactions that relate to banks, e.g. fees or deposits. * @export * @enum {string} */ var PaymentChannel; (function (PaymentChannel) { PaymentChannel["Online"] = "online"; PaymentChannel["InStore"] = "in store"; PaymentChannel["Other"] = "other"; })(PaymentChannel = exports.PaymentChannel || (exports.PaymentChannel = {})); /** * Where the payment consent period should start. If the institution is Monzo, only `CONSENT` alignments are supported. `CALENDAR`: line up with a calendar. `CONSENT`: on the date of consent creation. * @export * @enum {string} */ var PaymentConsentPeriodicAlignment; (function (PaymentConsentPeriodicAlignment) { PaymentConsentPeriodicAlignment["Calendar"] = "CALENDAR"; PaymentConsentPeriodicAlignment["Consent"] = "CONSENT"; })(PaymentConsentPeriodicAlignment = exports.PaymentConsentPeriodicAlignment || (exports.PaymentConsentPeriodicAlignment = {})); /** * Payment consent periodic interval. * @export * @enum {string} */ var PaymentConsentPeriodicInterval; (function (PaymentConsentPeriodicInterval) { PaymentConsentPeriodicInterval["Day"] = "DAY"; PaymentConsentPeriodicInterval["Week"] = "WEEK"; PaymentConsentPeriodicInterval["Month"] = "MONTH"; PaymentConsentPeriodicInterval["Year"] = "YEAR"; })(PaymentConsentPeriodicInterval = exports.PaymentConsentPeriodicInterval || (exports.PaymentConsentPeriodicInterval = {})); /** * Decides the mode under which the payment processing should be performed, using `IMMEDIATE` as default. `IMMEDIATE`: Will immediately execute the payment, waiting for a response from the ASPSP before returning the result of the payment initiation. This is ideal for user-present flows. `ASYNC`: Will accept a payment execution request and schedule it for processing, immediately returning the new `payment_id`. Listen for webhooks or use the [`/payment_initiation/payment/get`](https://plaid.com/docs/api/products/payment-initiation/#payment_initiationpaymentget) endpoint to obtain updates on the payment status. This is ideal for non user-present flows. * @export * @enum {string} */ var PaymentInitiationConsentProcessingMode; (function (PaymentInitiationConsentProcessingMode) { PaymentInitiationConsentProcessingMode["Async"] = "ASYNC"; PaymentInitiationConsentProcessingMode["Immediate"] = "IMMEDIATE"; })(PaymentInitiationConsentProcessingMode = exports.PaymentInitiationConsentProcessingMode || (exports.PaymentInitiationConsentProcessingMode = {})); /** * This field is deprecated in favor of the consent `type` field. Consents are required to have a single type. Payment consent scope. Defines possible directions for payments made with the given consent. `ME_TO_ME`: Allows moving money between accounts owned by the same user. `EXTERNAL`: Allows initiating payments from the user\'s account to third parties. * @export * @enum {string} */ var PaymentInitiationConsentScope; (function (PaymentInitiationConsentScope) { PaymentInitiationConsentScope["MeToMe"] = "ME_TO_ME"; PaymentInitiationConsentScope["External"] = "EXTERNAL"; })(PaymentInitiationConsentScope = exports.PaymentInitiationConsentScope || (exports.PaymentInitiationConsentScope = {})); /** * The status of the payment consent. `UNAUTHORISED`: Consent created, but requires user authorisation. `REJECTED`: Consent authorisation was rejected by the user and/or the bank. `AUTHORISED`: Consent is active and ready to be used. `REVOKED`: Consent has been revoked and can no longer be used. `EXPIRED`: Consent is no longer valid. * @export * @enum {string} */ var PaymentInitiationConsentStatus; (function (PaymentInitiationConsentStatus) { PaymentInitiationConsentStatus["Unauthorised"] = "UNAUTHORISED"; PaymentInitiationConsentStatus["Authorised"] = "AUTHORISED"; PaymentInitiationConsentStatus["Revoked"] = "REVOKED"; PaymentInitiationConsentStatus["Rejected"] = "REJECTED"; PaymentInitiationConsentStatus["Expired"] = "EXPIRED"; })(PaymentInitiationConsentStatus = exports.PaymentInitiationConsentStatus || (exports.PaymentInitiationConsentStatus = {})); /** * Payment consent type. Defines possible use case for payments made with the given consent. `SWEEPING`: Allows moving money between accounts owned by the same user. `COMMERCIAL`: Allows initiating payments from the user\'s account to third parties. * @export * @enum {string} */ var PaymentInitiationConsentType; (function (PaymentInitiationConsentType) { PaymentInitiationConsentType["Sweeping"] = "SWEEPING"; PaymentInitiationConsentType["Commercial"] = "COMMERCIAL"; })(PaymentInitiationConsentType = exports.PaymentInitiationConsentType || (exports.PaymentInitiationConsentType = {})); /** * For a payment returned by this endpoint, there is only one possible value: `PAYMENT_STATUS_INPUT_NEEDED`: The initial phase of the payment * @export * @enum {string} */ var PaymentInitiationPaymentCreateStatus; (function (PaymentInitiationPaymentCreateStatus) { PaymentInitiationPaymentCreateStatus["PaymentStatusInputNeeded"] = "PAYMENT_STATUS_INPUT_NEEDED"; })(PaymentInitiationPaymentCreateStatus = exports.PaymentInitiationPaymentCreateStatus || (exports.PaymentInitiationPaymentCreateStatus = {})); /** * The status of the payment. `PAYMENT_STATUS_INPUT_NEEDED`: This is the initial state of all payments. It indicates that the payment is waiting on user input to continue processing. A payment may re-enter this state later on if further input is needed. `PAYMENT_STATUS_INITIATED`: The payment has been successfully authorised and accepted by the financial institution. For successful payments, this is a potential terminal status. Further status transitions can be to REJECTED and, when supported by the institution, to EXECUTED. `PAYMENT_STATUS_INSUFFICIENT_FUNDS`: The payment has failed due to insufficient funds. `PAYMENT_STATUS_FAILED`: The payment has failed to be initiated. This error may be caused by transient system outages and is retryable once the root cause is resolved. `PAYMENT_STATUS_BLOCKED`: The payment has been blocked by Plaid. This can occur, for example, due to Plaid flagging the payment as potentially risky. This is a retryable error. `PAYMENT_STATUS_AUTHORISING`: The payment is currently being processed. The payment will automatically exit this state when the financial institution has authorised the transaction. `PAYMENT_STATUS_CANCELLED`: The payment was cancelled (typically by the end user) during authorisation. `PAYMENT_STATUS_EXECUTED`: The funds have successfully left the payer account and payment is considered complete. Not all institutions support this status: support is more common in the UK, and less common in the EU. For institutions where this status is not supported, the terminal status for a successful payment will be `PAYMENT_STATUS_INITIATED`. `PAYMENT_STATUS_SETTLED`: The payment has settled and funds are available for use. A payment will typically settle within seconds to several days, depending on which payment rail is used. This status is only available to customers using [Plaid Virtual Accounts](https://plaid.com/docs/virtual-accounts/). `PAYMENT_STATUS_ESTABLISHED`: Indicates that the standing order has been successfully established. This state is only used for standing orders. `PAYMENT_STATUS_REJECTED`: The payment was rejected by the financial institution. Deprecated: These statuses will be removed in a future release. `PAYMENT_STATUS_UNKNOWN`: The payment status is unknown. `PAYMENT_STATUS_PROCESSING`: The payment is currently being processed. The payment will automatically exit this state when processing is complete. `PAYMENT_STATUS_COMPLETED`: Indicates that the standing order has been successfully established. This state is only used for standing orders. * @export * @enum {string} */ var PaymentInitiationPaymentStatus; (function (PaymentInitiationPaymentStatus) { PaymentInitiationPaymentStatus["InputNeeded"] = "PAYMENT_STATUS_INPUT_NEEDED"; PaymentInitiationPaymentStatus["Processing"] = "PAYMENT_STATUS_PROCESSING"; PaymentInitiationPaymentStatus["Initiated"] = "PAYMENT_STATUS_INITIATED"; PaymentInitiationPaymentStatus["Completed"] = "PAYMENT_STATUS_COMPLETED"; PaymentInitiationPaymentStatus["InsufficientFunds"] = "PAYMENT_STATUS_INSUFFICIENT_FUNDS"; PaymentInitiationPaymentStatus["Failed"] = "PAYMENT_STATUS_FAILED"; PaymentInitiationPaymentStatus["Blocked"] = "PAYMENT_STATUS_BLOCKED"; PaymentInitiationPaymentStatus["Unknown"] = "PAYMENT_STATUS_UNKNOWN"; PaymentInitiationPaymentStatus["Executed"] = "PAYMENT_STATUS_EXECUTED"; PaymentInitiationPaymentStatus["Settled"] = "PAYMENT_STATUS_SETTLED"; PaymentInitiationPaymentStatus["Authorising"] = "PAYMENT_STATUS_AUTHORISING"; PaymentInitiationPaymentStatus["Cancelled"] = "PAYMENT_STATUS_CANCELLED"; PaymentInitiationPaymentStatus["Established"] = "PAYMENT_STATUS_ESTABLISHED"; PaymentInitiationPaymentStatus["Rejected"] = "PAYMENT_STATUS_REJECTED"; })(PaymentInitiationPaymentStatus = exports.PaymentInitiationPaymentStatus || (exports.PaymentInitiationPaymentStatus = {})); /** * The status of the given Payment Profile. `READY`: This Payment Profile is ready to be used to create transfers using `/transfer/authorization/create` and `/transfer/create`. `PENDING`: This Payment Profile is not ready to be used. You’ll need to call `/link/token/create` and provide the `payment_profile_token` in the `transfer.payment_profile_token` field to initiate the account linking experience. `REMOVED`: This Payment Profile has been removed. * @export * @enum {string} */ var PaymentProfileStatus; (function (PaymentProfileStatus) { PaymentProfileStatus["Pending"] = "PENDING"; PaymentProfileStatus["Ready"] = "READY"; PaymentProfileStatus["Removed"] = "REMOVED"; })(PaymentProfileStatus = exports.PaymentProfileStatus || (exports.PaymentProfileStatus = {})); /** * The frequency interval of the payment. * @export * @enum {string} */ var PaymentScheduleInterval; (function (PaymentScheduleInterval) { PaymentScheduleInterval["Weekly"] = "WEEKLY"; PaymentScheduleInterval["Monthly"] = "MONTHLY"; })(PaymentScheduleInterval = exports.PaymentScheduleInterval || (exports.PaymentScheduleInterval = {})); /** * Payment scheme. If not specified - the default in the region will be used (e.g. `SEPA_CREDIT_TRANSFER` for EU). Using unsupported values will result in a failed payment. `LOCAL_DEFAULT`: The default payment scheme for the selected market and currency will be used. `LOCAL_INSTANT`: The instant payment scheme for the selected market and currency will be used (if applicable). Fees may be applied by the institution. If the market does not support an Instant Scheme (e.g. Denmark), the default in the region will be used. `SEPA_CREDIT_TRANSFER`: The standard payment to a beneficiary within the SEPA area. `SEPA_CREDIT_TRANSFER_INSTANT`: Instant payment within the SEPA area. May involve additional fees and may not be available at some banks. * @export * @enum {string} */ var PaymentScheme; (function (PaymentScheme) { PaymentScheme["Null"] = "null"; PaymentScheme["LocalDefault"] = "LOCAL_DEFAULT"; PaymentScheme["LocalInstant"] = "LOCAL_INSTANT"; PaymentScheme["SepaCreditTransfer"] = "SEPA_CREDIT_TRANSFER"; PaymentScheme["SepaCreditTransferInstant"] = "SEPA_CREDIT_TRANSFER_INSTANT"; })(PaymentScheme = exports.PaymentScheme || (exports.PaymentScheme = {})); /** * The frequency at which the employee is paid. Possible values: `MONTHLY`, `BI-WEEKLY`, `WEEKLY`, `SEMI-MONTHLY`. * @export * @enum {string} */ var PaystubPayFrequency; (function (PaystubPayFrequency) { PaystubPayFrequency["Monthly"] = "MONTHLY"; PaystubPayFrequency["BiWeekly"] = "BI-WEEKLY"; PaystubPayFrequency["Weekly"] = "WEEKLY"; PaystubPayFrequency["SemiMonthly"] = "SEMI-MONTHLY"; PaystubPayFrequency["Null"] = "null"; })(PaystubPayFrequency = exports.PaystubPayFrequency || (exports.PaystubPayFrequency = {})); /** * Reason why the item is about to be disconnected. `INSTITUTION_MIGRATION`: The institution is moving to API or to a different integration. For example, this can occur when an institution moves from a non-OAuth integration to an OAuth integration. `INSTITUTION_TOKEN_EXPIRATION`: The consent on an Item associated with a US or CA institution is about to expire. * @export * @enum {string} */ var PendingDisconnectWebhookReason; (function (PendingDisconnectWebhookReason) { PendingDisconnectWebhookReason["Migration"] = "INSTITUTION_MIGRATION"; PendingDisconnectWebhookReason["TokenExpiration"] = "INSTITUTION_TOKEN_EXPIRATION"; })(PendingDisconnectWebhookReason = exports.PendingDisconnectWebhookReason || (exports.PendingDisconnectWebhookReason = {})); /** * @export * @enum {string} */ var PhoneNumberTypeEnum; (function (PhoneNumberTypeEnum) { PhoneNumberTypeEnum["Home"] = "home"; PhoneNumberTypeEnum["Work"] = "work"; PhoneNumberTypeEnum["Office"] = "office"; PhoneNumberTypeEnum["Mobile"] = "mobile"; PhoneNumberTypeEnum["Mobile1"] = "mobile1"; PhoneNumberTypeEnum["Other"] = "other"; })(PhoneNumberTypeEnum = exports.PhoneNumberTypeEnum || (exports.PhoneNumberTypeEnum = {})); /** * An enum indicating whether a phone number is a phone line or a fax line. * @export * @enum {string} */ var PhoneType; (function (PhoneType) { PhoneType["Phone"] = "phone"; PhoneType["Fax"] = "fax"; })(PhoneType = exports.PhoneType || (exports.PhoneType = {})); /** * The type of identity document detected in the images provided. Will always be one of the following values: `drivers_license` - A driver\'s license issued by the associated country, establishing identity without any guarantee as to citizenship, and granting driving privileges `id_card` - A general national identification card, distinct from driver\'s licenses as it only establishes identity `passport` - A travel passport issued by the associated country for one of its citizens `residence_permit_card` - An identity document issued by the associated country permitting a foreign citizen to temporarily reside there `resident_card` - An identity document issued by the associated country permitting a foreign citizen to permanently reside there `visa` - An identity document issued by the associated country permitting a foreign citizen entry for a short duration and for a specific purpose, typically no longer than 6 months Note: This value may be different from the ID type that the user selects within Link. For example, if they select \"Driver\'s License\" but then submit a picture of a passport, this field will say `passport` * @export * @enum {string} */ var PhysicalDocumentCategory; (function (PhysicalDocumentCategory) { PhysicalDocumentCategory["DriversLicense"] = "drivers_license"; PhysicalDocumentCategory["IdCard"] = "id_card"; PhysicalDocumentCategory["Passport"] = "passport"; PhysicalDocumentCategory["ResidencePermitCard"] = "residence_permit_card"; PhysicalDocumentCategory["ResidentCard"] = "resident_card"; PhysicalDocumentCategory["Visa"] = "visa"; })(PhysicalDocumentCategory = exports.PhysicalDocumentCategory || (exports.PhysicalDocumentCategory = {})); /** * A broad categorization of the error. Safe for programmatic use. * @export * @enum {string} */ var PlaidErrorType; (function (PlaidErrorType) { PlaidErrorType["InvalidRequest"] = "INVALID_REQUEST"; PlaidErrorType["InvalidResult"] = "INVALID_RESULT"; PlaidErrorType["InvalidInput"] = "INVALID_INPUT"; PlaidErrorType["InstitutionError"] = "INSTITUTION_ERROR"; PlaidErrorType["RateLimitExceeded"] = "RATE_LIMIT_EXCEEDED"; PlaidErrorType["ApiError"] = "API_ERROR"; PlaidErrorType["ItemError"] = "ITEM_ERROR"; PlaidErrorType["AssetReportError"] = "ASSET_REPORT_ERROR"; PlaidErrorType["RecaptchaError"] = "RECAPTCHA_ERROR"; PlaidErrorType["OauthError"] = "OAUTH_ERROR"; PlaidErrorType["PaymentError"] = "PAYMENT_ERROR"; PlaidErrorType["BankTransferError"] = "BANK_TRANSFER_ERROR"; PlaidErrorType["IncomeVerificationError"] = "INCOME_VERIFICATION_ERROR"; PlaidErrorType["MicrodepositsError"] = "MICRODEPOSITS_ERROR"; PlaidErrorType["SandboxError"] = "SANDBOX_ERROR"; PlaidErrorType["PartnerError"] = "PARTNER_ERROR"; PlaidErrorType["TransactionsError"] = "TRANSACTIONS_ERROR"; PlaidErrorType["TransactionError"] = "TRANSACTION_ERROR"; PlaidErrorType["TransferError"] = "TRANSFER_ERROR"; })(PlaidErrorType = exports.PlaidErrorType || (exports.PlaidErrorType = {})); /** * The version of Prism CashScore. If not specified, will default to v3. * @export * @enum {string} */ var PrismCashScoreVersion; (function (PrismCashScoreVersion) { PrismCashScoreVersion["_3Lite"] = "3_lite"; PrismCashScoreVersion["_3"] = "3"; PrismCashScoreVersion["Null"] = "null"; })(PrismCashScoreVersion = exports.PrismCashScoreVersion || (exports.PrismCashScoreVersion = {})); /** * The version of Prism FirstDetect. If not specified, will default to v3. * @export * @enum {string} */ var PrismFirstDetectVersion; (function (PrismFirstDetectVersion) { PrismFirstDetectVersion["_3"] = "3"; PrismFirstDetectVersion["Null"] = "null"; })(PrismFirstDetectVersion = exports.PrismFirstDetectVersion || (exports.PrismFirstDetectVersion = {})); /** * The version of Prism Insights. If not specified, will default to v3. * @export * @enum {string} */ var PrismInsightsVersion; (function (PrismInsightsVersion) { PrismInsightsVersion["_3"] = "3"; PrismInsightsVersion["Null"] = "null"; })(PrismInsightsVersion = exports.PrismInsightsVersion || (exports.PrismInsightsVersion = {})); /** * The Prism products that can be returned by the Plaid API * @export * @enum {string} */ var PrismProduct; (function (PrismProduct) { PrismProduct["Insights"] = "insights"; PrismProduct["Scores"] = "scores"; })(PrismProduct = exports.PrismProduct || (exports.PrismProduct = {})); /** * @export * @enum {string} */ var ProcessorTokenCreateRequestProcessorEnum; (function (ProcessorTokenCreateRequestProcessorEnum) { ProcessorTokenCreateRequestProcessorEnum["Dwolla"] = "dwolla"; ProcessorTokenCreateRequestProcessorEnum["Galileo"] = "galileo"; ProcessorTokenCreateRequestProcessorEnum["ModernTreasury"] = "modern_treasury"; ProcessorTokenCreateRequestProcessorEnum["Ocrolus"] = "ocrolus"; ProcessorTokenCreateRequestProcessorEnum["Vesta"] = "vesta"; ProcessorTokenCreateRequestProcessorEnum["Drivewealth"] = "drivewealth"; ProcessorTokenCreateRequestProcessorEnum["Vopay"] = "vopay"; ProcessorTokenCreateRequestProcessorEnum["Achq"] = "achq"; ProcessorTokenCreateRequestProcessorEnum["Check"] = "check"; ProcessorTokenCreateRequestProcessorEnum["Checkbook"] = "checkbook"; ProcessorTokenCreateRequestProcessorEnum["Circle"] = "circle"; ProcessorTokenCreateRequestProcessorEnum["SilaMoney"] = "sila_money"; ProcessorTokenCreateRequestProcessorEnum["Rize"] = "rize"; ProcessorTokenCreateRequestProcessorEnum["SvbApi"] = "svb_api"; ProcessorTokenCreateRequestProcessorEnum["Unit"] = "unit"; ProcessorTokenCreateRequestProcessorEnum["Wyre"] = "wyre"; ProcessorTokenCreateRequestProcessorEnum["Lithic"] = "lithic"; ProcessorTokenCreateRequestProcessorEnum["Alpaca"] = "alpaca"; ProcessorTokenCreateRequestProcessorEnum["Astra"] = "astra"; ProcessorTokenCreateRequestProcessorEnum["Moov"] = "moov"; ProcessorTokenCreateRequestProcessorEnum["TreasuryPrime"] = "treasury_prime"; ProcessorTokenCreateRequestProcessorEnum["Marqeta"] = "marqeta"; ProcessorTokenCreateRequestProcessorEnum["Checkout"] = "checkout"; ProcessorTokenCreateRequestProcessorEnum["Solid"] = "solid"; ProcessorTokenCreateRequestProcessorEnum["Highnote"] = "highnote"; ProcessorTokenCreateRequestProcessorEnum["Gemini"] = "gemini"; ProcessorTokenCreateRequestProcessorEnum["ApexClearing"] = "apex_clearing"; ProcessorTokenCreateRequestProcessorEnum["Gusto"] = "gusto"; ProcessorTokenCreateRequestProcessorEnum["Adyen"] = "adyen"; ProcessorTokenCreateRequestProcessorEnum["Atomic"] = "atomic"; ProcessorTokenCreateRequestProcessorEnum["I2c"] = "i2c"; ProcessorTokenCreateRequestProcessorEnum["Wepay"] = "wepay"; ProcessorTokenCreateRequestProcessorEnum["Riskified"] = "riskified"; ProcessorTokenCreateRequestProcessorEnum["Utb"] = "utb"; ProcessorTokenCreateRequestProcessorEnum["AdpRoll"] = "adp_roll"; ProcessorTokenCreateRequestProcessorEnum["FortressTrust"] = "fortress_trust"; ProcessorTokenCreateRequestProcessorEnum["Bond"] = "bond"; ProcessorTokenCreateRequestProcessorEnum["Bakkt"] = "bakkt"; ProcessorTokenCreateRequestProcessorEnum["Teal"] = "teal"; ProcessorTokenCreateRequestProcessorEnum["ZeroHash"] = "zero_hash"; ProcessorTokenCreateRequestProcessorEnum["TabaPay"] = "taba_pay"; ProcessorTokenCreateRequestProcessorEnum["Knot"] = "knot"; ProcessorTokenCreateRequestProcessorEnum["Sardine"] = "sardine"; ProcessorTokenCreateRequestProcessorEnum["Alloy"] = "alloy"; ProcessorTokenCreateRequestProcessorEnum["Finix"] = "finix"; ProcessorTokenCreateRequestProcessorEnum["Nuvei"] = "nuvei"; ProcessorTokenCreateRequestProcessorEnum["Layer"] = "layer"; ProcessorTokenCreateRequestProcessorEnum["Boom"] = "boom"; ProcessorTokenCreateRequestProcessorEnum["Paynote"] = "paynote"; ProcessorTokenCreateRequestProcessorEnum["Stake"] = "stake"; ProcessorTokenCreateRequestProcessorEnum["Wedbush"] = "wedbush"; ProcessorTokenCreateRequestProcessorEnum["Esusu"] = "esusu"; ProcessorTokenCreateRequestProcessorEnum["Ansa"] = "ansa"; ProcessorTokenCreateRequestProcessorEnum["Scribeup"] = "scribeup"; ProcessorTokenCreateRequestProcessorEnum["Straddle"] = "straddle"; ProcessorTokenCreateRequestProcessorEnum["Loanpro"] = "loanpro"; })(ProcessorTokenCreateRequestProcessorEnum = exports.ProcessorTokenCreateRequestProcessorEnum || (exports.ProcessorTokenCreateRequestProcessorEnum = {})); /** * @export * @enum {string} */ var ProductStatusStatusEnum; (function (ProductStatusStatusEnum) { ProductStatusStatusEnum["Healthy"] = "HEALTHY"; ProductStatusStatusEnum["Degraded"] = "DEGRADED"; ProductStatusStatusEnum["Down"] = "DOWN"; })(ProductStatusStatusEnum = exports.ProductStatusStatusEnum || (exports.ProductStatusStatusEnum = {})); /** * @export * @enum {string} */ var ProductStatusBreakdownRefreshIntervalEnum; (function (ProductStatusBreakdownRefreshIntervalEnum) { ProductStatusBreakdownRefreshIntervalEnum["Normal"] = "NORMAL"; ProductStatusBreakdownRefreshIntervalEnum["Delayed"] = "DELAYED"; ProductStatusBreakdownRefreshIntervalEnum["Stopped"] = "STOPPED"; })(ProductStatusBreakdownRefreshIntervalEnum = exports.ProductStatusBreakdownRefreshIntervalEnum || (exports.ProductStatusBreakdownRefreshIntervalEnum = {})); /** * A list of products that an institution can support. All Items must be initialized with at least one product. The Balance product is always available and does not need to be specified during initialization. * @export * @enum {string} */ var Products; (function (Products) { Products["Assets"] = "assets"; Products["Auth"] = "auth"; Products["Balance"] = "balance"; Products["BalancePlus"] = "balance_plus"; Products["Beacon"] = "beacon"; Products["Identity"] = "identity"; Products["IdentityMatch"] = "identity_match"; Products["Investments"] = "investments"; Products["InvestmentsAuth"] = "investments_auth"; Products["Liabilities"] = "liabilities"; Products["PaymentInitiation"] = "payment_initiation"; Products["IdentityVerification"] = "identity_verification"; Products["Transactions"] = "transactions"; Products["CreditDetails"] = "credit_details"; Products["Income"] = "income"; Products["IncomeVerification"] = "income_verification"; Products["StandingOrders"] = "standing_orders"; Products["Transfer"] = "transfer"; Products["Employment"] = "employment"; Products["RecurringTransactions"] = "recurring_transactions"; Products["TransactionsRefresh"] = "transactions_refresh"; Products["Signal"] = "signal"; Products["Statements"] = "statements"; Products["ProcessorPayments"] = "processor_payments"; Products["ProcessorIdentity"] = "processor_identity"; Products["Profile"] = "profile"; Products["CraBaseReport"] = "cra_base_report"; Products["CraIncomeInsights"] = "cra_income_insights"; Products["CraPartnerInsights"] = "cra_partner_insights"; Products["CraNetworkInsights"] = "cra_network_insights"; Products["CraCashflowInsights"] = "cra_cashflow_insights"; Products["Layer"] = "layer"; Products["PayByBank"] = "pay_by_bank"; })(Products = exports.Products || (exports.Products = {})); /** * The valid name matching sensitivity configurations for a screening program. Note that while certain matching techniques may be more prevalent on less strict settings, all matching algorithms are enabled for every sensitivity. `coarse` - See more potential matches. This sensitivity will see more broad phonetic matches across alphabets that make missing a potential hit very unlikely. This setting is noisier and will require more manual review. `balanced` - A good default for most companies. This sensitivity is balanced to show high quality hits with reduced noise. `strict` - Aggressive false positive reduction. This sensitivity will require names to be more similar than `coarse` and `balanced` settings, relying less on phonetics, while still accounting for character transpositions, missing tokens, and other common permutations. `exact` - Matches must be nearly exact. This sensitivity will only show hits with exact or nearly exact name matches with only basic correction such as extraneous symbols and capitalization. This setting is generally not recommended unless you have a very specific use case. * @export * @enum {string} */ var ProgramNameSensitivity; (function (ProgramNameSensitivity) { ProgramNameSensitivity["Coarse"] = "coarse"; ProgramNameSensitivity["Balanced"] = "balanced"; ProgramNameSensitivity["Strict"] = "strict"; ProgramNameSensitivity["Exact"] = "exact"; })(ProgramNameSensitivity = exports.ProgramNameSensitivity || (exports.ProgramNameSensitivity = {})); /** * An enum indicating whether a network proxy is present and if so what type it is. `none_detected` indicates the user is not on a detectable proxy network. `tor` indicates the user was using a Tor browser, which sends encrypted traffic on a decentralized network and is somewhat similar to a VPN (Virtual Private Network). `vpn` indicates the user is on a VPN (Virtual Private Network) `web_proxy` indicates the user is on a web proxy server, which may allow them to conceal information such as their IP address or other identifying information. `public_proxy` indicates the user is on a public web proxy server, which is similar to a web proxy but can be shared by multiple users. This may allow multiple users to appear as if they have the same IP address for instance. * @export * @enum {string} */ var ProxyType; (function (ProxyType) { ProxyType["NoneDetected"] = "none_detected"; ProxyType["Tor"] = "tor"; ProxyType["Vpn"] = "vpn"; ProxyType["WebProxy"] = "web_proxy"; ProxyType["PublicProxy"] = "public_proxy"; })(ProxyType = exports.ProxyType || (exports.ProxyType = {})); /** * The recommendation result for that date. * @export * @enum {string} */ var RecommendationString; (function (RecommendationString) { RecommendationString["Recommended"] = "RECOMMENDED"; RecommendationString["NotRecommended"] = "NOT_RECOMMENDED"; RecommendationString["Unknown"] = "UNKNOWN"; })(RecommendationString = exports.RecommendationString || (exports.RecommendationString = {})); /** * Describes the frequency of the transaction stream. `WEEKLY`: Assigned to a transaction stream that occurs approximately every week. `BIWEEKLY`: Assigned to a transaction stream that occurs approximately every 2 weeks. `SEMI_MONTHLY`: Assigned to a transaction stream that occurs approximately twice per month. This frequency is typically seen for inflow transaction streams. `MONTHLY`: Assigned to a transaction stream that occurs approximately every month. `ANNUALLY`: Assigned to a transaction stream that occurs approximately every year. `DAILY`: Assigned to a transaction stream that occurs approximately every day. `DYNAMIC`: Assigned to a transaction stream that varies in recurrence frequency. This frequency is typically seen for inflow streams in the gig economy. `UNKNOWN`: Assigned to a transaction stream that isn\'t recurring in nature. * @export * @enum {string} */ var RecurringFrequency; (function (RecurringFrequency) { RecurringFrequency["Unknown"] = "UNKNOWN"; RecurringFrequency["Weekly"] = "WEEKLY"; RecurringFrequency["Biweekly"] = "BIWEEKLY"; RecurringFrequency["SemiMonthly"] = "SEMI_MONTHLY"; RecurringFrequency["Monthly"] = "MONTHLY"; RecurringFrequency["Annually"] = "ANNUALLY"; RecurringFrequency["Daily"] = "DAILY"; RecurringFrequency["Dynamic"] = "DYNAMIC"; RecurringFrequency["Null"] = "null"; })(RecurringFrequency = exports.RecurringFrequency || (exports.RecurringFrequency = {})); /** * Describes the frequency of the transaction stream. `WEEKLY`: Assigned to a transaction stream that occurs approximately every week. `BIWEEKLY`: Assigned to a transaction stream that occurs approximately every 2 weeks. `SEMI_MONTHLY`: Assigned to a transaction stream that occurs approximately twice per month. This frequency is typically seen for inflow transaction streams. `MONTHLY`: Assigned to a transaction stream that occurs approximately every month. `ANNUALLY`: Assigned to a transaction stream that occurs approximately every year. `UNKNOWN`: Assigned to a transaction stream that does not fit any of the pre-defined frequencies. * @export * @enum {string} */ var RecurringTransactionFrequency; (function (RecurringTransactionFrequency) { RecurringTransactionFrequency["Unknown"] = "UNKNOWN"; RecurringTransactionFrequency["Weekly"] = "WEEKLY"; RecurringTransactionFrequency["Biweekly"] = "BIWEEKLY"; RecurringTransactionFrequency["SemiMonthly"] = "SEMI_MONTHLY"; RecurringTransactionFrequency["Monthly"] = "MONTHLY"; RecurringTransactionFrequency["Annually"] = "ANNUALLY"; })(RecurringTransactionFrequency = exports.RecurringTransactionFrequency || (exports.RecurringTransactionFrequency = {})); /** * The report type. It can be `asset`. Income report types are not yet supported. * @export * @enum {string} */ var ReportType; (function (ReportType) { ReportType["Asset"] = "asset"; })(ReportType = exports.ReportType || (exports.ReportType = {})); /** * Field describing the outcome of a bot detection behavior risk check. `yes` indicates that automated activity was detected. `no` indicates that automated activity was not detected. `no_data` indicates there was not enough information available to give an accurate signal. * @export * @enum {string} */ var RiskCheckBehaviorBotDetectedLabel; (function (RiskCheckBehaviorBotDetectedLabel) { RiskCheckBehaviorBotDetectedLabel["Yes"] = "yes"; RiskCheckBehaviorBotDetectedLabel["No"] = "no"; RiskCheckBehaviorBotDetectedLabel["NoData"] = "no_data"; })(RiskCheckBehaviorBotDetectedLabel = exports.RiskCheckBehaviorBotDetectedLabel || (exports.RiskCheckBehaviorBotDetectedLabel = {})); /** * Field describing the outcome of a fraud ring behavior risk check. `yes` indicates that fraud ring activity was detected. `no` indicates that fraud ring activity was not detected. `no_data` indicates there was not enough information available to give an accurate signal. * @export * @enum {string} */ var RiskCheckBehaviorFraudRingDetectedLabel; (function (RiskCheckBehaviorFraudRingDetectedLabel) { RiskCheckBehaviorFraudRingDetectedLabel["Yes"] = "yes"; RiskCheckBehaviorFraudRingDetectedLabel["No"] = "no"; RiskCheckBehaviorFraudRingDetectedLabel["NoData"] = "no_data"; })(RiskCheckBehaviorFraudRingDetectedLabel = exports.RiskCheckBehaviorFraudRingDetectedLabel || (exports.RiskCheckBehaviorFraudRingDetectedLabel = {})); /** * Field describing the overall user interaction signals of a behavior risk check. This value represents how familiar the user is with the personal data they provide, based on a number of signals that are collected during their session. `genuine` indicates the user has high familiarity with the data they are providing, and that fraud is unlikely. `neutral` indicates some signals are present in between `risky` and `genuine`, but there are not enough clear signals to determine an outcome. `risky` indicates the user has low familiarity with the data they are providing, and that fraud is likely. `no_data` indicates there is not sufficient information to give an accurate signal. * @export * @enum {string} */ var RiskCheckBehaviorUserInteractionsLabel; (function (RiskCheckBehaviorUserInteractionsLabel) { RiskCheckBehaviorUserInteractionsLabel["Genuine"] = "genuine"; RiskCheckBehaviorUserInteractionsLabel["Neutral"] = "neutral"; RiskCheckBehaviorUserInteractionsLabel["Risky"] = "risky"; RiskCheckBehaviorUserInteractionsLabel["NoData"] = "no_data"; })(RiskCheckBehaviorUserInteractionsLabel = exports.RiskCheckBehaviorUserInteractionsLabel || (exports.RiskCheckBehaviorUserInteractionsLabel = {})); /** * Indicates whether the email address domain is custom if known, i.e. a company domain and not free or disposable. * @export * @enum {string} */ var RiskCheckEmailDomainIsCustom; (function (RiskCheckEmailDomainIsCustom) { RiskCheckEmailDomainIsCustom["Yes"] = "yes"; RiskCheckEmailDomainIsCustom["No"] = "no"; RiskCheckEmailDomainIsCustom["NoData"] = "no_data"; })(RiskCheckEmailDomainIsCustom = exports.RiskCheckEmailDomainIsCustom || (exports.RiskCheckEmailDomainIsCustom = {})); /** * Indicates whether the email domain is listed as disposable if known. Disposable domains are often used to create email addresses that are part of a fake set of user details. * @export * @enum {string} */ var RiskCheckEmailDomainIsDisposable; (function (RiskCheckEmailDomainIsDisposable) { RiskCheckEmailDomainIsDisposable["Yes"] = "yes"; RiskCheckEmailDomainIsDisposable["No"] = "no"; RiskCheckEmailDomainIsDisposable["NoData"] = "no_data"; })(RiskCheckEmailDomainIsDisposable = exports.RiskCheckEmailDomainIsDisposable || (exports.RiskCheckEmailDomainIsDisposable = {})); /** * Indicates whether the email address domain is a free provider such as Gmail or Hotmail if known. * @export * @enum {string} */ var RiskCheckEmailDomainIsFreeProvider; (function (RiskCheckEmailDomainIsFreeProvider) { RiskCheckEmailDomainIsFreeProvider["Yes"] = "yes"; RiskCheckEmailDomainIsFreeProvider["No"] = "no"; RiskCheckEmailDomainIsFreeProvider["NoData"] = "no_data"; })(RiskCheckEmailDomainIsFreeProvider = exports.RiskCheckEmailDomainIsFreeProvider || (exports.RiskCheckEmailDomainIsFreeProvider = {})); /** * SMTP-MX check to confirm the email address exists if known. * @export * @enum {string} */ var RiskCheckEmailIsDeliverableStatus; (function (RiskCheckEmailIsDeliverableStatus) { RiskCheckEmailIsDeliverableStatus["Yes"] = "yes"; RiskCheckEmailIsDeliverableStatus["No"] = "no"; RiskCheckEmailIsDeliverableStatus["NoData"] = "no_data"; })(RiskCheckEmailIsDeliverableStatus = exports.RiskCheckEmailIsDeliverableStatus || (exports.RiskCheckEmailIsDeliverableStatus = {})); /** * Indicates whether the email address top level domain, which is the last part of the domain, is fraudulent or risky if known. In most cases, a suspicious top level domain is also associated with a disposable or high-risk domain. * @export * @enum {string} */ var RiskCheckEmailTopLevelDomainIsSuspicious; (function (RiskCheckEmailTopLevelDomainIsSuspicious) { RiskCheckEmailTopLevelDomainIsSuspicious["Yes"] = "yes"; RiskCheckEmailTopLevelDomainIsSuspicious["No"] = "no"; RiskCheckEmailTopLevelDomainIsSuspicious["NoData"] = "no_data"; })(RiskCheckEmailTopLevelDomainIsSuspicious = exports.RiskCheckEmailTopLevelDomainIsSuspicious || (exports.RiskCheckEmailTopLevelDomainIsSuspicious = {})); /** * An enum indicating the type of a linked service. Note that `adult_sites` refers\' to explicit video content, and includes a number of related services. * @export * @enum {string} */ var RiskCheckLinkedService; (function (RiskCheckLinkedService) { RiskCheckLinkedService["Aboutme"] = "aboutme"; RiskCheckLinkedService["Adobe"] = "adobe"; RiskCheckLinkedService["AdultSites"] = "adult_sites"; RiskCheckLinkedService["Airbnb"] = "airbnb"; RiskCheckLinkedService["Altbalaji"] = "altbalaji"; RiskCheckLinkedService["Amazon"] = "amazon"; RiskCheckLinkedService["Apple"] = "apple"; RiskCheckLinkedService["Archiveorg"] = "archiveorg"; RiskCheckLinkedService["Atlassian"] = "atlassian"; RiskCheckLinkedService["Bitmoji"] = "bitmoji"; RiskCheckLinkedService["Bodybuilding"] = "bodybuilding"; RiskCheckLinkedService["Booking"] = "booking"; RiskCheckLinkedService["Bukalapak"] = "bukalapak"; RiskCheckLinkedService["Codecademy"] = "codecademy"; RiskCheckLinkedService["Deliveroo"] = "deliveroo"; RiskCheckLinkedService["Diigo"] = "diigo"; RiskCheckLinkedService["Discord"] = "discord"; RiskCheckLinkedService["Disneyplus"] = "disneyplus"; RiskCheckLinkedService["Duolingo"] = "duolingo"; RiskCheckLinkedService["Ebay"] = "ebay"; RiskCheckLinkedService["Envato"] = "envato"; RiskCheckLinkedService["Eventbrite"] = "eventbrite"; RiskCheckLinkedService["Evernote"] = "evernote"; RiskCheckLinkedService["Facebook"] = "facebook"; RiskCheckLinkedService["Firefox"] = "firefox"; RiskCheckLinkedService["Flickr"] = "flickr"; RiskCheckLinkedService["Flipkart"] = "flipkart"; RiskCheckLinkedService["Foursquare"] = "foursquare"; RiskCheckLinkedService["Freelancer"] = "freelancer"; RiskCheckLinkedService["Gaana"] = "gaana"; RiskCheckLinkedService["Giphy"] = "giphy"; RiskCheckLinkedService["Github"] = "github"; RiskCheckLinkedService["Google"] = "google"; RiskCheckLinkedService["Gravatar"] = "gravatar"; RiskCheckLinkedService["Hubspot"] = "hubspot"; RiskCheckLinkedService["Imgur"] = "imgur"; RiskCheckLinkedService["Instagram"] = "instagram"; RiskCheckLinkedService["Jdid"] = "jdid"; RiskCheckLinkedService["Kakao"] = "kakao"; RiskCheckLinkedService["Kommo"] = "kommo"; RiskCheckLinkedService["Komoot"] = "komoot"; RiskCheckLinkedService["Lastfm"] = "lastfm"; RiskCheckLinkedService["Lazada"] = "lazada"; RiskCheckLinkedService["Line"] = "line"; RiskCheckLinkedService["Linkedin"] = "linkedin"; RiskCheckLinkedService["Mailru"] = "mailru"; RiskCheckLinkedService["Microsoft"] = "microsoft"; RiskCheckLinkedService["Myspace"] = "myspace"; RiskCheckLinkedService["Netflix"] = "netflix"; RiskCheckLinkedService["Nike"] = "nike"; RiskCheckLinkedService["Ok"] = "ok"; RiskCheckLinkedService["Patreon"] = "patreon"; RiskCheckLinkedService["Pinterest"] = "pinterest"; RiskCheckLinkedService["Plurk"] = "plurk"; RiskCheckLinkedService["Quora"] = "quora"; RiskCheckLinkedService["Qzone"] = "qzone"; RiskCheckLinkedService["Rambler"] = "rambler"; RiskCheckLinkedService["Rappi"] = "rappi"; RiskCheckLinkedService["Replit"] = "replit"; RiskCheckLinkedService["Samsung"] = "samsung"; RiskCheckLinkedService["Seoclerks"] = "seoclerks"; RiskCheckLinkedService["Shopclues"] = "shopclues"; RiskCheckLinkedService["Skype"] = "skype"; RiskCheckLinkedService["Snapchat"] = "snapchat"; RiskCheckLinkedService["Snapdeal"] = "snapdeal"; RiskCheckLinkedService["Soundcloud"] = "soundcloud"; RiskCheckLinkedService["Spotify"] = "spotify"; RiskCheckLinkedService["Starz"] = "starz"; RiskCheckLinkedService["Strava"] = "strava"; RiskCheckLinkedService["Taringa"] = "taringa"; RiskCheckLinkedService["Telegram"] = "telegram"; RiskCheckLinkedService["Tiki"] = "tiki"; RiskCheckLinkedService["Tokopedia"] = "tokopedia"; RiskCheckLinkedService["Treehouse"] = "treehouse"; RiskCheckLinkedService["Tumblr"] = "tumblr"; RiskCheckLinkedService["Twitter"] = "twitter"; RiskCheckLinkedService["Venmo"] = "venmo"; RiskCheckLinkedService["Viber"] = "viber"; RiskCheckLinkedService["Vimeo"] = "vimeo"; RiskCheckLinkedService["Vivino"] = "vivino"; RiskCheckLinkedService["Vkontakte"] = "vkontakte"; RiskCheckLinkedService["Wattpad"] = "wattpad"; RiskCheckLinkedService["Weibo"] = "weibo"; RiskCheckLinkedService["Whatsapp"] = "whatsapp"; RiskCheckLinkedService["Wordpress"] = "wordpress"; RiskCheckLinkedService["Xing"] = "xing"; RiskCheckLinkedService["Yahoo"] = "yahoo"; RiskCheckLinkedService["Yandex"] = "yandex"; RiskCheckLinkedService["Zalo"] = "zalo"; RiskCheckLinkedService["Zoho"] = "zoho"; })(RiskCheckLinkedService = exports.RiskCheckLinkedService || (exports.RiskCheckLinkedService = {})); /** * Risk level for the given risk check type. * @export * @enum {string} */ var RiskLevel; (function (RiskLevel) { RiskLevel["Low"] = "low"; RiskLevel["Medium"] = "medium"; RiskLevel["High"] = "high"; })(RiskLevel = exports.RiskLevel || (exports.RiskLevel = {})); /** * Risk level for the given risk check type, when available. * @export * @enum {string} */ var RiskLevelWithNoData; (function (RiskLevelWithNoData) { RiskLevelWithNoData["Low"] = "low"; RiskLevelWithNoData["Medium"] = "medium"; RiskLevelWithNoData["High"] = "high"; RiskLevelWithNoData["NoData"] = "no_data"; })(RiskLevelWithNoData = exports.RiskLevelWithNoData || (exports.RiskLevelWithNoData = {})); /** * Status of a document for risk signal analysis * @export * @enum {string} */ var RiskSignalDocumentStatus; (function (RiskSignalDocumentStatus) { RiskSignalDocumentStatus["Processing"] = "PROCESSING"; RiskSignalDocumentStatus["ProcessingComplete"] = "PROCESSING_COMPLETE"; RiskSignalDocumentStatus["ProcessingError"] = "PROCESSING_ERROR"; RiskSignalDocumentStatus["PasswordProtected"] = "PASSWORD_PROTECTED"; RiskSignalDocumentStatus["VirusDetected"] = "VIRUS_DETECTED"; })(RiskSignalDocumentStatus = exports.RiskSignalDocumentStatus || (exports.RiskSignalDocumentStatus = {})); /** * Type of a document for risk signal analysis * @export * @enum {string} */ var RiskSignalDocumentType; (function (RiskSignalDocumentType) { RiskSignalDocumentType["Unknown"] = "UNKNOWN"; RiskSignalDocumentType["BankStatement"] = "BANK_STATEMENT"; RiskSignalDocumentType["BenefitsStatement"] = "BENEFITS_STATEMENT"; RiskSignalDocumentType["BusinessFiling"] = "BUSINESS_FILING"; RiskSignalDocumentType["Check"] = "CHECK"; RiskSignalDocumentType["DrivingLicense"] = "DRIVING_LICENSE"; RiskSignalDocumentType["FinancialStatement"] = "FINANCIAL_STATEMENT"; RiskSignalDocumentType["Invoice"] = "INVOICE"; RiskSignalDocumentType["Payslip"] = "PAYSLIP"; RiskSignalDocumentType["SocialSecurityCard"] = "SOCIAL_SECURITY_CARD"; RiskSignalDocumentType["TaxForm"] = "TAX_FORM"; RiskSignalDocumentType["UtilityBill"] = "UTILITY_BILL"; })(RiskSignalDocumentType = exports.RiskSignalDocumentType || (exports.RiskSignalDocumentType = {})); /** * The file type for risk signal analysis * @export * @enum {string} */ var RiskSignalFileType; (function (RiskSignalFileType) { RiskSignalFileType["Unknown"] = "UNKNOWN"; RiskSignalFileType["ImagePdf"] = "IMAGE_PDF"; RiskSignalFileType["ScanOcr"] = "SCAN_OCR"; RiskSignalFileType["TruePdf"] = "TRUE_PDF"; RiskSignalFileType["Image"] = "IMAGE"; RiskSignalFileType["MixedPagePdf"] = "MIXED_PAGE_PDF"; RiskSignalFileType["EmptyPdf"] = "EMPTY_PDF"; RiskSignalFileType["FlattenedPdf"] = "FLATTENED_PDF"; })(RiskSignalFileType = exports.RiskSignalFileType || (exports.RiskSignalFileType = {})); /** * The outcome status for the individual SMS verification. * @export * @enum {string} */ var SMSVerificationStatus; (function (SMSVerificationStatus) { SMSVerificationStatus["Pending"] = "pending"; SMSVerificationStatus["Success"] = "success"; SMSVerificationStatus["Failed"] = "failed"; SMSVerificationStatus["Canceled"] = "canceled"; })(SMSVerificationStatus = exports.SMSVerificationStatus || (exports.SMSVerificationStatus = {})); /** * The webhook codes this endpoint can be used to test * @export * @enum {string} */ var SandboxBankIncomeWebhookFireRequestWebhookCode; (function (SandboxBankIncomeWebhookFireRequestWebhookCode) { SandboxBankIncomeWebhookFireRequestWebhookCode["Update"] = "BANK_INCOME_REFRESH_UPDATE"; SandboxBankIncomeWebhookFireRequestWebhookCode["Complete"] = "BANK_INCOME_REFRESH_COMPLETE"; })(SandboxBankIncomeWebhookFireRequestWebhookCode = exports.SandboxBankIncomeWebhookFireRequestWebhookCode || (exports.SandboxBankIncomeWebhookFireRequestWebhookCode = {})); /** * @export * @enum {string} */ var SandboxIncomeFireWebhookRequestVerificationStatusEnum; (function (SandboxIncomeFireWebhookRequestVerificationStatusEnum) { SandboxIncomeFireWebhookRequestVerificationStatusEnum["ProcessingComplete"] = "VERIFICATION_STATUS_PROCESSING_COMPLETE"; SandboxIncomeFireWebhookRequestVerificationStatusEnum["ProcessingFailed"] = "VERIFICATION_STATUS_PROCESSING_FAILED"; SandboxIncomeFireWebhookRequestVerificationStatusEnum["PendingApproval"] = "VERIFICATION_STATUS_PENDING_APPROVAL"; })(SandboxIncomeFireWebhookRequestVerificationStatusEnum = exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum || (exports.SandboxIncomeFireWebhookRequestVerificationStatusEnum = {})); /** * The webhook codes that can be fired by this test endpoint. * @export * @enum {string} */ var SandboxIncomeWebhookFireRequestWebhookCode; (function (SandboxIncomeWebhookFireRequestWebhookCode) { SandboxIncomeWebhookFireRequestWebhookCode["Verification"] = "INCOME_VERIFICATION"; SandboxIncomeWebhookFireRequestWebhookCode["VerificationRiskSignals"] = "INCOME_VERIFICATION_RISK_SIGNALS"; })(SandboxIncomeWebhookFireRequestWebhookCode = exports.SandboxIncomeWebhookFireRequestWebhookCode || (exports.SandboxIncomeWebhookFireRequestWebhookCode = {})); /** * @export * @enum {string} */ var SandboxItemFireWebhookRequestWebhookCodeEnum; (function (SandboxItemFireWebhookRequestWebhookCodeEnum) { SandboxItemFireWebhookRequestWebhookCodeEnum["DefaultUpdate"] = "DEFAULT_UPDATE"; SandboxItemFireWebhookRequestWebhookCodeEnum["NewAccountsAvailable"] = "NEW_ACCOUNTS_AVAILABLE"; SandboxItemFireWebhookRequestWebhookCodeEnum["SmsMicrodepositsVerification"] = "SMS_MICRODEPOSITS_VERIFICATION"; SandboxItemFireWebhookRequestWebhookCodeEnum["AuthorizationGranted"] = "AUTHORIZATION_GRANTED"; SandboxItemFireWebhookRequestWebhookCodeEnum["PendingDisconnect"] = "PENDING_DISCONNECT"; SandboxItemFireWebhookRequestWebhookCodeEnum["RecurringTransactionsUpdate"] = "RECURRING_TRANSACTIONS_UPDATE"; SandboxItemFireWebhookRequestWebhookCodeEnum["LoginRepaired"] = "LOGIN_REPAIRED"; SandboxItemFireWebhookRequestWebhookCodeEnum["SyncUpdatesAvailable"] = "SYNC_UPDATES_AVAILABLE"; SandboxItemFireWebhookRequestWebhookCodeEnum["ProductReady"] = "PRODUCT_READY"; SandboxItemFireWebhookRequestWebhookCodeEnum["Error"] = "ERROR"; })(SandboxItemFireWebhookRequestWebhookCodeEnum = exports.SandboxItemFireWebhookRequestWebhookCodeEnum || (exports.SandboxItemFireWebhookRequestWebhookCodeEnum = {})); /** * @export * @enum {string} */ var SandboxItemSetVerificationStatusRequestVerificationStatusEnum; (function (SandboxItemSetVerificationStatusRequestVerificationStatusEnum) { SandboxItemSetVerificationStatusRequestVerificationStatusEnum["AutomaticallyVerified"] = "automatically_verified"; SandboxItemSetVerificationStatusRequestVerificationStatusEnum["VerificationExpired"] = "verification_expired"; })(SandboxItemSetVerificationStatusRequestVerificationStatusEnum = exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum || (exports.SandboxItemSetVerificationStatusRequestVerificationStatusEnum = {})); /** * An indicator for when scopes are being updated. When scopes are updated via enrollment (i.e. OAuth), the partner must send `ENROLLMENT`. When scopes are updated in a post-enrollment view, the partner must send `PORTAL`. * @export * @enum {string} */ var ScopesContext; (function (ScopesContext) { ScopesContext["Enrollment"] = "ENROLLMENT"; ScopesContext["Portal"] = "PORTAL"; })(ScopesContext = exports.ScopesContext || (exports.ScopesContext = {})); /** * Information about the comparison between the selfie and the document (if documentary verification also ran). * @export * @enum {string} */ var SelfieAnalysisDocumentComparison; (function (SelfieAnalysisDocumentComparison) { SelfieAnalysisDocumentComparison["Match"] = "match"; SelfieAnalysisDocumentComparison["NoMatch"] = "no_match"; SelfieAnalysisDocumentComparison["NoInput"] = "no_input"; })(SelfieAnalysisDocumentComparison = exports.SelfieAnalysisDocumentComparison || (exports.SelfieAnalysisDocumentComparison = {})); /** * Outcome of the facial analysis for a specific facial feature. * @export * @enum {string} */ var SelfieAnalysisFacialAnalysisOutcome; (function (SelfieAnalysisFacialAnalysisOutcome) { SelfieAnalysisFacialAnalysisOutcome["Success"] = "success"; SelfieAnalysisFacialAnalysisOutcome["Failed"] = "failed"; })(SelfieAnalysisFacialAnalysisOutcome = exports.SelfieAnalysisFacialAnalysisOutcome || (exports.SelfieAnalysisFacialAnalysisOutcome = {})); /** * Assessment of whether the selfie capture is of a real human being, as opposed to a picture of a human on a screen, a picture of a paper cut out, someone wearing a mask, or a deepfake. * @export * @enum {string} */ var SelfieAnalysisLivenessCheck; (function (SelfieAnalysisLivenessCheck) { SelfieAnalysisLivenessCheck["Success"] = "success"; SelfieAnalysisLivenessCheck["Failed"] = "failed"; })(SelfieAnalysisLivenessCheck = exports.SelfieAnalysisLivenessCheck || (exports.SelfieAnalysisLivenessCheck = {})); /** * The outcome status for the associated Identity Verification attempt\'s `selfie_check` step. This field will always have the same value as `steps.selfie_check`. * @export * @enum {string} */ var SelfieCheckStatus; (function (SelfieCheckStatus) { SelfieCheckStatus["Success"] = "success"; SelfieCheckStatus["Failed"] = "failed"; })(SelfieCheckStatus = exports.SelfieCheckStatus || (exports.SelfieCheckStatus = {})); /** * An outcome status for this specific selfie. Distinct from the overall `selfie_check.status` that summarizes the verification outcome from one or more selfies. * @export * @enum {string} */ var SelfieStatus; (function (SelfieStatus) { SelfieStatus["Success"] = "success"; SelfieStatus["Failed"] = "failed"; })(SelfieStatus = exports.SelfieStatus || (exports.SelfieStatus = {})); /** * Documentation not found in the MISMO model viewer and not provided by Freddie Mac. * @export * @enum {string} */ var ServiceProductFulfillmentIdentifier; (function (ServiceProductFulfillmentIdentifier) { ServiceProductFulfillmentIdentifier["Voa"] = "VOA"; ServiceProductFulfillmentIdentifier["Voe"] = "VOE"; })(ServiceProductFulfillmentIdentifier = exports.ServiceProductFulfillmentIdentifier || (exports.ServiceProductFulfillmentIdentifier = {})); /** * The payment decision from the risk assessment. `APPROVE`: approve the transaction without requiring further actions from your customers. For example, use this field if you are placing a standard hold for all the approved transactions before making funds available to your customers. You should also use this field if you decide to accelerate the fund availability for your customers. `REVIEW`: the transaction requires manual review `REJECT`: reject the transaction `TAKE_OTHER_RISK_MEASURES`: for example, placing a longer hold on funds than those approved transactions or introducing customer frictions such as step-up verification/authentication `NOT_EVALUATED`: if only logging the Signal results without using them Possible values: `APPROVE`, `REVIEW`, `REJECT`, `TAKE_OTHER_RISK_MEASURES`, `NOT_EVALUATED` * @export * @enum {string} */ var SignalDecisionOutcome; (function (SignalDecisionOutcome) { SignalDecisionOutcome["Approve"] = "APPROVE"; SignalDecisionOutcome["Review"] = "REVIEW"; SignalDecisionOutcome["Reject"] = "REJECT"; SignalDecisionOutcome["TakeOtherRiskMeasures"] = "TAKE_OTHER_RISK_MEASURES"; SignalDecisionOutcome["NotEvaluated"] = "NOT_EVALUATED"; })(SignalDecisionOutcome = exports.SignalDecisionOutcome || (exports.SignalDecisionOutcome = {})); /** * The payment method to complete the transaction after the risk assessment. It may be different from the default payment method. `SAME_DAY_ACH`: Same Day ACH by NACHA. The debit transaction is processed and settled on the same day `NEXT_DAY_ACH`: Next Day ACH settlement for debit transactions, offered by some payment processors `STANDARD_ACH`: standard ACH by NACHA `REAL_TIME_PAYMENTS`: real-time payments such as RTP and FedNow `DEBIT_CARD`: if the default payment is over debit card networks `MULTIPLE_PAYMENT_METHODS`: if there is no default debit rail or there are multiple payment methods Possible values: `SAME_DAY_ACH`, `NEXT_DAY_ACH`, `STANDARD_ACH`, `REAL_TIME_PAYMENTS`, `DEBIT_CARD`, `MULTIPLE_PAYMENT_METHODS` * @export * @enum {string} */ var SignalPaymentMethod; (function (SignalPaymentMethod) { SignalPaymentMethod["SameDayAch"] = "SAME_DAY_ACH"; SignalPaymentMethod["NextDayAch"] = "NEXT_DAY_ACH"; SignalPaymentMethod["StandardAch"] = "STANDARD_ACH"; SignalPaymentMethod["RealTimePayments"] = "REAL_TIME_PAYMENTS"; SignalPaymentMethod["DebitCard"] = "DEBIT_CARD"; SignalPaymentMethod["MultiplePaymentMethods"] = "MULTIPLE_PAYMENT_METHODS"; })(SignalPaymentMethod = exports.SignalPaymentMethod || (exports.SignalPaymentMethod = {})); /** * The payment method specified in the `default_payment_method` field directly impacts the timing recommendations provided by the API for submitting the debit entry to your processor or ODFI. If unspecified, Signal defaults to `STANDARD_ACH`. `SAME_DAY_ACH`: Same Day ACH (as defined by Nacha). The Signal API assumes the settlement will occur on the same business day if the `/signal/schedule` request is submitted by 6:00 PM UTC. Note: The actual cutoff time can vary depending on your payment processor or ODFI. NACHA has established three processing windows for Same Day ACH (UTC): 2:30 PM, 6:45 PM, and 8:45 PM. `STANDARD_ACH`: Standard ACH (as defined by Nacha), typically settled one to three business days after submission. `REAL_TIME_PAYMENTS`: Real-time payments via Request for Payment through networks such as RTP (The Clearing House) and FedNow, where the consumer can authorize the payment in response to a RFP, and the transaction is processed and settled immediately. `DEBIT_CARD`: Payments processed over debit card networks, leveraging the card-based infrastructure for real-time or near-real-time settlement. `MULTIPLE_PAYMENT_METHODS`: Indicates that there is no default debit rail or multiple payment methods are available, and the transaction could use any of them based on customer policy or availability. * @export * @enum {string} */ var SignalScheduleDefaultPaymentMethod; (function (SignalScheduleDefaultPaymentMethod) { SignalScheduleDefaultPaymentMethod["SameDayAch"] = "SAME_DAY_ACH"; SignalScheduleDefaultPaymentMethod["StandardAch"] = "STANDARD_ACH"; SignalScheduleDefaultPaymentMethod["RealTimePayments"] = "REAL_TIME_PAYMENTS"; SignalScheduleDefaultPaymentMethod["DebitCard"] = "DEBIT_CARD"; SignalScheduleDefaultPaymentMethod["MultiplePaymentMethods"] = "MULTIPLE_PAYMENT_METHODS"; })(SignalScheduleDefaultPaymentMethod = exports.SignalScheduleDefaultPaymentMethod || (exports.SignalScheduleDefaultPaymentMethod = {})); /** * A type indicating whether a dashboard user, an API-based user, or Plaid last touched this object. * @export * @enum {string} */ var Source; (function (Source) { Source["Dashboard"] = "dashboard"; Source["Link"] = "link"; Source["Api"] = "api"; Source["System"] = "system"; })(Source = exports.Source || (exports.Source = {})); /** * The result of the statement refresh extraction `SUCCESS`: The statements were successfully extracted and can be listed via `/statements/list/` and downloaded via `/statements/download/`. `FAILURE`: The statements failed to be extracted. * @export * @enum {string} */ var StatementsRefreshCompleteResult; (function (StatementsRefreshCompleteResult) { StatementsRefreshCompleteResult["Success"] = "SUCCESS"; StatementsRefreshCompleteResult["Failure"] = "FAILURE"; })(StatementsRefreshCompleteResult = exports.StatementsRefreshCompleteResult || (exports.StatementsRefreshCompleteResult = {})); /** * An instruction specifying what steps the new Identity Verification attempt should require the user to complete: `reset` - Restart the user at the beginning of the session, regardless of whether they successfully completed part of their previous session. `incomplete` - Start the new session at the step that the user failed in the previous session, skipping steps that have already been successfully completed. `infer` - If the most recent Identity Verification attempt associated with the given `client_user_id` has a status of `failed` or `expired`, retry using the `incomplete` strategy. Otherwise, use the `reset` strategy. `custom` - Start the new session with a custom configuration, specified by the value of the `steps` field Note: The `incomplete` strategy cannot be applied if the session\'s failing step is `screening` or `risk_check`. The `infer` strategy cannot be applied if the session\'s status is still `active` * @export * @enum {string} */ var Strategy; (function (Strategy) { Strategy["Reset"] = "reset"; Strategy["Incomplete"] = "incomplete"; Strategy["Infer"] = "infer"; Strategy["Custom"] = "custom"; })(Strategy = exports.Strategy || (exports.Strategy = {})); /** * @export * @enum {string} */ var StudentLoanStatusTypeEnum; (function (StudentLoanStatusTypeEnum) { StudentLoanStatusTypeEnum["Cancelled"] = "cancelled"; StudentLoanStatusTypeEnum["ChargedOff"] = "charged off"; StudentLoanStatusTypeEnum["Claim"] = "claim"; StudentLoanStatusTypeEnum["Consolidated"] = "consolidated"; StudentLoanStatusTypeEnum["Deferment"] = "deferment"; StudentLoanStatusTypeEnum["Delinquent"] = "delinquent"; StudentLoanStatusTypeEnum["Discharged"] = "discharged"; StudentLoanStatusTypeEnum["Extension"] = "extension"; StudentLoanStatusTypeEnum["Forbearance"] = "forbearance"; StudentLoanStatusTypeEnum["InGrace"] = "in grace"; StudentLoanStatusTypeEnum["InMilitary"] = "in military"; StudentLoanStatusTypeEnum["InSchool"] = "in school"; StudentLoanStatusTypeEnum["NotFullyDisbursed"] = "not fully disbursed"; StudentLoanStatusTypeEnum["Other"] = "other"; StudentLoanStatusTypeEnum["PaidInFull"] = "paid in full"; StudentLoanStatusTypeEnum["Refunded"] = "refunded"; StudentLoanStatusTypeEnum["Repayment"] = "repayment"; StudentLoanStatusTypeEnum["Transferred"] = "transferred"; StudentLoanStatusTypeEnum["PendingIdr"] = "pending idr"; })(StudentLoanStatusTypeEnum = exports.StudentLoanStatusTypeEnum || (exports.StudentLoanStatusTypeEnum = {})); /** * @export * @enum {string} */ var StudentRepaymentPlanTypeEnum; (function (StudentRepaymentPlanTypeEnum) { StudentRepaymentPlanTypeEnum["ExtendedGraduated"] = "extended graduated"; StudentRepaymentPlanTypeEnum["ExtendedStandard"] = "extended standard"; StudentRepaymentPlanTypeEnum["Graduated"] = "graduated"; StudentRepaymentPlanTypeEnum["IncomeContingentRepayment"] = "income-contingent repayment"; StudentRepaymentPlanTypeEnum["IncomeBasedRepayment"] = "income-based repayment"; StudentRepaymentPlanTypeEnum["IncomeSensitiveRepayment"] = "income-sensitive repayment"; StudentRepaymentPlanTypeEnum["InterestOnly"] = "interest-only"; StudentRepaymentPlanTypeEnum["Other"] = "other"; StudentRepaymentPlanTypeEnum["PayAsYouEarn"] = "pay as you earn"; StudentRepaymentPlanTypeEnum["RevisedPayAsYouEarn"] = "revised pay as you earn"; StudentRepaymentPlanTypeEnum["Standard"] = "standard"; StudentRepaymentPlanTypeEnum["SavingOnAValuableEducation"] = "saving on a valuable education"; StudentRepaymentPlanTypeEnum["Null"] = "null"; })(StudentRepaymentPlanTypeEnum = exports.StudentRepaymentPlanTypeEnum || (exports.StudentRepaymentPlanTypeEnum = {})); /** * The status of a sweep transfer `\"pending\"` - The sweep is currently pending `\"posted\"` - The sweep has been posted `\"settled\"` - The sweep has settled `\"returned\"` - The sweep has been returned `\"failed\"` - The sweep has failed * @export * @enum {string} */ var SweepStatus; (function (SweepStatus) { SweepStatus["Pending"] = "pending"; SweepStatus["Posted"] = "posted"; SweepStatus["Settled"] = "settled"; SweepStatus["Returned"] = "returned"; SweepStatus["Failed"] = "failed"; SweepStatus["Null"] = "null"; })(SweepStatus = exports.SweepStatus || (exports.SweepStatus = {})); /** * The trigger of the sweep `\"manual\"` - The sweep is created manually by the customer `\"incoming\"` - The sweep is created by incoming funds flow (e.g. Incoming Wire) `\"balance_threshold\"` - The sweep is created by balance threshold setting `\"automatic_aggregate\"` - The sweep is created by the Plaid automatic aggregation process. These funds did not pass through the Plaid Ledger balance. * @export * @enum {string} */ var SweepTrigger; (function (SweepTrigger) { SweepTrigger["Manual"] = "manual"; SweepTrigger["Incoming"] = "incoming"; SweepTrigger["BalanceThreshold"] = "balance_threshold"; SweepTrigger["AutomaticAggregate"] = "automatic_aggregate"; })(SweepTrigger = exports.SweepTrigger || (exports.SweepTrigger = {})); /** * A value from a MISMO prescribed list that classifies identification numbers used by the Internal Revenue Service (IRS) in the administration of tax laws. A Social Security number (SSN) is issued by the SSA; all other taxpayer identification numbers are issued by the IRS. * @export * @enum {string} */ var TaxpayerIdentifierType; (function (TaxpayerIdentifierType) { TaxpayerIdentifierType["IndividualTaxpayerIdentificationNumber"] = "IndividualTaxpayerIdentificationNumber"; TaxpayerIdentifierType["SocialSecurityNumber"] = "SocialSecurityNumber"; })(TaxpayerIdentifierType = exports.TaxpayerIdentifierType || (exports.TaxpayerIdentifierType = {})); /** * Commonly used term to describe the line item. * @export * @enum {string} */ var TotalCanonicalDescription; (function (TotalCanonicalDescription) { TotalCanonicalDescription["Bonus"] = "BONUS"; TotalCanonicalDescription["Commission"] = "COMMISSION"; TotalCanonicalDescription["Overtime"] = "OVERTIME"; TotalCanonicalDescription["PaidTimeOff"] = "PAID TIME OFF"; TotalCanonicalDescription["RegularPay"] = "REGULAR PAY"; TotalCanonicalDescription["Vacation"] = "VACATION"; TotalCanonicalDescription["EmployeeMedicare"] = "EMPLOYEE MEDICARE"; TotalCanonicalDescription["Fica"] = "FICA"; TotalCanonicalDescription["SocialSecurityEmployeeTax"] = "SOCIAL SECURITY EMPLOYEE TAX"; TotalCanonicalDescription["Medical"] = "MEDICAL"; TotalCanonicalDescription["Vision"] = "VISION"; TotalCanonicalDescription["Dental"] = "DENTAL"; TotalCanonicalDescription["NetPay"] = "NET PAY"; TotalCanonicalDescription["Taxes"] = "TAXES"; TotalCanonicalDescription["NotFound"] = "NOT_FOUND"; TotalCanonicalDescription["Other"] = "OTHER"; TotalCanonicalDescription["Null"] = "null"; })(TotalCanonicalDescription = exports.TotalCanonicalDescription || (exports.TotalCanonicalDescription = {})); /** * @export * @enum {string} */ var TransactionTransactionTypeEnum; (function (TransactionTransactionTypeEnum) { TransactionTransactionTypeEnum["Digital"] = "digital"; TransactionTransactionTypeEnum["Place"] = "place"; TransactionTransactionTypeEnum["Special"] = "special"; TransactionTransactionTypeEnum["Unresolved"] = "unresolved"; })(TransactionTransactionTypeEnum = exports.TransactionTransactionTypeEnum || (exports.TransactionTransactionTypeEnum = {})); /** * @export * @enum {string} */ var TransactionPaymentChannelEnum; (function (TransactionPaymentChannelEnum) { TransactionPaymentChannelEnum["Online"] = "online"; TransactionPaymentChannelEnum["InStore"] = "in store"; TransactionPaymentChannelEnum["Other"] = "other"; })(TransactionPaymentChannelEnum = exports.TransactionPaymentChannelEnum || (exports.TransactionPaymentChannelEnum = {})); /** * @export * @enum {string} */ var TransactionAllOfPaymentChannelEnum; (function (TransactionAllOfPaymentChannelEnum) { TransactionAllOfPaymentChannelEnum["Online"] = "online"; TransactionAllOfPaymentChannelEnum["InStore"] = "in store"; TransactionAllOfPaymentChannelEnum["Other"] = "other"; })(TransactionAllOfPaymentChannelEnum = exports.TransactionAllOfPaymentChannelEnum || (exports.TransactionAllOfPaymentChannelEnum = {})); /** * @export * @enum {string} */ var TransactionBaseTransactionTypeEnum; (function (TransactionBaseTransactionTypeEnum) { TransactionBaseTransactionTypeEnum["Digital"] = "digital"; TransactionBaseTransactionTypeEnum["Place"] = "place"; TransactionBaseTransactionTypeEnum["Special"] = "special"; TransactionBaseTransactionTypeEnum["Unresolved"] = "unresolved"; })(TransactionBaseTransactionTypeEnum = exports.TransactionBaseTransactionTypeEnum || (exports.TransactionBaseTransactionTypeEnum = {})); /** * An identifier classifying the transaction type. This field is only populated for European institutions. For institutions in the US and Canada, this field is set to `null`. `adjustment:` Bank adjustment `atm:` Cash deposit or withdrawal via an automated teller machine `bank charge:` Charge or fee levied by the institution `bill payment`: Payment of a bill `cash:` Cash deposit or withdrawal `cashback:` Cash withdrawal while making a debit card purchase `cheque:` Document ordering the payment of money to another person or organization `direct debit:` Automatic withdrawal of funds initiated by a third party at a regular interval `interest:` Interest earned or incurred `purchase:` Purchase made with a debit or credit card `standing order:` Payment instructed by the account holder to a third party at a regular interval `transfer:` Transfer of money between accounts * @export * @enum {string} */ var TransactionCode; (function (TransactionCode) { TransactionCode["Adjustment"] = "adjustment"; TransactionCode["Atm"] = "atm"; TransactionCode["BankCharge"] = "bank charge"; TransactionCode["BillPayment"] = "bill payment"; TransactionCode["Cash"] = "cash"; TransactionCode["Cashback"] = "cashback"; TransactionCode["Cheque"] = "cheque"; TransactionCode["DirectDebit"] = "direct debit"; TransactionCode["Interest"] = "interest"; TransactionCode["Purchase"] = "purchase"; TransactionCode["StandingOrder"] = "standing order"; TransactionCode["Transfer"] = "transfer"; TransactionCode["Null"] = "null"; })(TransactionCode = exports.TransactionCode || (exports.TransactionCode = {})); /** * The current status of the transaction stream. `MATURE`: A `MATURE` recurring stream should have at least 3 transactions and happen on a regular cadence (For Annual recurring stream, we will mark it `MATURE` after 2 instances). `EARLY_DETECTION`: When a recurring transaction first appears in the transaction history and before it fulfills the requirement of a mature stream, the status will be `EARLY_DETECTION`. `TOMBSTONED`: A stream that was previously in the `EARLY_DETECTION` status will move to the `TOMBSTONED` status when no further transactions were found at the next expected date. `UNKNOWN`: A stream is assigned an `UNKNOWN` status when none of the other statuses are applicable. * @export * @enum {string} */ var TransactionStreamStatus; (function (TransactionStreamStatus) { TransactionStreamStatus["Unknown"] = "UNKNOWN"; TransactionStreamStatus["Mature"] = "MATURE"; TransactionStreamStatus["EarlyDetection"] = "EARLY_DETECTION"; TransactionStreamStatus["Tombstoned"] = "TOMBSTONED"; })(TransactionStreamStatus = exports.TransactionStreamStatus || (exports.TransactionStreamStatus = {})); /** * Transaction field for which the rule is defined. * @export * @enum {string} */ var TransactionsRuleField; (function (TransactionsRuleField) { TransactionsRuleField["TransactionId"] = "TRANSACTION_ID"; TransactionsRuleField["Name"] = "NAME"; })(TransactionsRuleField = exports.TransactionsRuleField || (exports.TransactionsRuleField = {})); /** * Transaction rule\'s match type. For TRANSACTION_ID field, EXACT_MATCH is available. Matches are case sensitive. * @export * @enum {string} */ var TransactionsRuleType; (function (TransactionsRuleType) { TransactionsRuleType["ExactMatch"] = "EXACT_MATCH"; TransactionsRuleType["SubstringMatch"] = "SUBSTRING_MATCH"; })(TransactionsRuleType = exports.TransactionsRuleType || (exports.TransactionsRuleType = {})); /** * A description of the update status for transaction pulls of an Item. This field contains the same information provided by transactions webhooks, and may be helpful for webhook troubleshooting or when recovering from missed webhooks. `TRANSACTIONS_UPDATE_STATUS_UNKNOWN`: Unable to fetch transactions update status for Item. `NOT_READY`: The Item is pending transaction pull. `INITIAL_UPDATE_COMPLETE`: Initial pull for the Item is complete, historical pull is pending. `HISTORICAL_UPDATE_COMPLETE`: Both initial and historical pull for Item are complete. * @export * @enum {string} */ var TransactionsUpdateStatus; (function (TransactionsUpdateStatus) { TransactionsUpdateStatus["TransactionsUpdateStatusUnknown"] = "TRANSACTIONS_UPDATE_STATUS_UNKNOWN"; TransactionsUpdateStatus["NotReady"] = "NOT_READY"; TransactionsUpdateStatus["InitialUpdateComplete"] = "INITIAL_UPDATE_COMPLETE"; TransactionsUpdateStatus["HistoricalUpdateComplete"] = "HISTORICAL_UPDATE_COMPLETE"; })(TransactionsUpdateStatus = exports.TransactionsUpdateStatus || (exports.TransactionsUpdateStatus = {})); /** * The ACH networks used for the funds flow. For requests submitted as either `ach` or `same-day-ach` the cutoff for same-day is 3:30 PM Eastern Time and the cutoff for next-day transfers is 8:30 PM Eastern Time. It is recommended to submit a request at least 15 minutes before the cutoff time in order to ensure that it will be processed before the cutoff. Any request that is indicated as `same-day-ach` and that misses the same-day cutoff, but is submitted in time for the next-day cutoff, will be sent over next-day rails and will not incur same-day charges. * @export * @enum {string} */ var TransferACHNetwork; (function (TransferACHNetwork) { TransferACHNetwork["Ach"] = "ach"; TransferACHNetwork["SameDayAch"] = "same-day-ach"; })(TransferACHNetwork = exports.TransferACHNetwork || (exports.TransferACHNetwork = {})); /** * A decision regarding the proposed transfer. `approved` – The proposed transfer has received the end user\'s consent and has been approved for processing by Plaid. The `decision_rationale` field is set if Plaid was unable to fetch the account information. You may proceed with the transfer, but further review is recommended. Refer to the `code` field in the `decision_rationale` object for details. `declined` – Plaid reviewed the proposed transfer and declined processing. Refer to the `code` field in the `decision_rationale` object for details. `user_action_required` – An action is required before Plaid can assess the transfer risk and make a decision. The most common scenario is to update authentication for an Item. To complete the required action, initialize Link by setting `transfer.authorization_id` in the request of `/link/token/create`. After Link flow is completed, you may re-attempt the authorization request. * @export * @enum {string} */ var TransferAuthorizationDecision; (function (TransferAuthorizationDecision) { TransferAuthorizationDecision["Approved"] = "approved"; TransferAuthorizationDecision["Declined"] = "declined"; TransferAuthorizationDecision["UserActionRequired"] = "user_action_required"; })(TransferAuthorizationDecision = exports.TransferAuthorizationDecision || (exports.TransferAuthorizationDecision = {})); /** * A code representing the rationale for approving or declining the proposed transfer. If the `rationale_code` is `null`, the transfer passed the authorization check. Any non-`null` value for an `approved` transfer indicates that the the authorization check could not be run and that you should perform your own risk assessment on the transfer. The code will indicate why the check could not be run. Possible values for an `approved` transfer are: `MANUALLY_VERIFIED_ITEM` – Item created via a manual entry flow (i.e. Same Day Micro-deposit, Instant Micro-deposit, Database Insights, or Database Match), limited information available. `ITEM_LOGIN_REQUIRED` – Unable to collect the account information due to Item staleness. Can be resolved by using Link and setting [`transfer.authorization_id`](https://plaid.com/docs/api/link/#link-token-create-request-transfer-authorization-id) in the request to `/link/token/create`. `MIGRATED_ACCOUNT_ITEM` - Item created via `/transfer/migrate_account` endpoint, limited information available. `ERROR` – Unable to collect the account information due to an unspecified error. The following codes indicate that the authorization decision was `declined`: `NSF` – Transaction likely to result in a return due to insufficient funds. `RISK` - Transaction is high-risk. `TRANSFER_LIMIT_REACHED` - One or several transfer limits are reached, e.g. monthly transfer limit. Check the accompanying `description` field to understand which limit has been reached. * @export * @enum {string} */ var TransferAuthorizationDecisionRationaleCode; (function (TransferAuthorizationDecisionRationaleCode) { TransferAuthorizationDecisionRationaleCode["Nsf"] = "NSF"; TransferAuthorizationDecisionRationaleCode["Risk"] = "RISK"; TransferAuthorizationDecisionRationaleCode["TransferLimitReached"] = "TRANSFER_LIMIT_REACHED"; TransferAuthorizationDecisionRationaleCode["ManuallyVerifiedItem"] = "MANUALLY_VERIFIED_ITEM"; TransferAuthorizationDecisionRationaleCode["ItemLoginRequired"] = "ITEM_LOGIN_REQUIRED"; TransferAuthorizationDecisionRationaleCode["PaymentProfileLoginRequired"] = "PAYMENT_PROFILE_LOGIN_REQUIRED"; TransferAuthorizationDecisionRationaleCode["Error"] = "ERROR"; TransferAuthorizationDecisionRationaleCode["MigratedAccountItem"] = "MIGRATED_ACCOUNT_ITEM"; TransferAuthorizationDecisionRationaleCode["Null"] = "null"; })(TransferAuthorizationDecisionRationaleCode = exports.TransferAuthorizationDecisionRationaleCode || (exports.TransferAuthorizationDecisionRationaleCode = {})); /** * Indicates whether the transfer is guaranteed by Plaid (Guarantee customers only). This field will contain either `GUARANTEED` or `NOT_GUARANTEED` indicating whether Plaid will guarantee the transfer. If the transfer is not guaranteed, additional information will be provided in the `guarantee_decision_rationale` field. Refer to the `code` field in `guarantee_decision_rationale` for details. * @export * @enum {string} */ var TransferAuthorizationGuaranteeDecision; (function (TransferAuthorizationGuaranteeDecision) { TransferAuthorizationGuaranteeDecision["Guaranteed"] = "GUARANTEED"; TransferAuthorizationGuaranteeDecision["NotGuaranteed"] = "NOT_GUARANTEED"; TransferAuthorizationGuaranteeDecision["Null"] = "null"; })(TransferAuthorizationGuaranteeDecision = exports.TransferAuthorizationGuaranteeDecision || (exports.TransferAuthorizationGuaranteeDecision = {})); /** * A code representing the reason Plaid declined to guarantee this transfer: `RETURN_BANK`: The risk of a bank-initiated return (for example, an R01/NSF) is too high to guarantee this transfer. `RETURN_CUSTOMER`: The risk of a customer-initiated return (for example, a R10/Unauthorized) is too high to guarantee this transfer. `GUARANTEE_LIMIT_REACHED`: This transfer is low-risk, but Guarantee has exhausted an internal limit on the number or rate of guarantees that applies to this transfer. `RISK_ESTIMATE_UNAVAILABLE`: A risk estimate is unavailable for this Item. `REQUIRED_PARAM_MISSING`: Required fields are missing. * @export * @enum {string} */ var TransferAuthorizationGuaranteeDecisionRationaleCode; (function (TransferAuthorizationGuaranteeDecisionRationaleCode) { TransferAuthorizationGuaranteeDecisionRationaleCode["ReturnBank"] = "RETURN_BANK"; TransferAuthorizationGuaranteeDecisionRationaleCode["ReturnCustomer"] = "RETURN_CUSTOMER"; TransferAuthorizationGuaranteeDecisionRationaleCode["GuaranteeLimitReached"] = "GUARANTEE_LIMIT_REACHED"; TransferAuthorizationGuaranteeDecisionRationaleCode["RiskEstimateUnavailable"] = "RISK_ESTIMATE_UNAVAILABLE"; TransferAuthorizationGuaranteeDecisionRationaleCode["RequiredParamMissing"] = "REQUIRED_PARAM_MISSING"; })(TransferAuthorizationGuaranteeDecisionRationaleCode = exports.TransferAuthorizationGuaranteeDecisionRationaleCode || (exports.TransferAuthorizationGuaranteeDecisionRationaleCode = {})); /** * Comprises five risk categories (high risk, medium-high risk, medium risk, medium-low risk, low risk) based on the probability of return * @export * @enum {string} */ var TransferAuthorizationRiskLevel; (function (TransferAuthorizationRiskLevel) { TransferAuthorizationRiskLevel["HighRisk"] = "HIGH_RISK"; TransferAuthorizationRiskLevel["MediumHighRisk"] = "MEDIUM_HIGH_RISK"; TransferAuthorizationRiskLevel["MediumRisk"] = "MEDIUM_RISK"; TransferAuthorizationRiskLevel["MediumLowRisk"] = "MEDIUM_LOW_RISK"; TransferAuthorizationRiskLevel["LowRisk"] = "LOW_RISK"; })(TransferAuthorizationRiskLevel = exports.TransferAuthorizationRiskLevel || (exports.TransferAuthorizationRiskLevel = {})); /** * The type of balance. `prefunded_rtp_credits` - Your prefunded RTP credit balance with Plaid `prefunded_ach_credits` - Your prefunded ACH credit balance with Plaid * @export * @enum {string} */ var TransferBalanceType; (function (TransferBalanceType) { TransferBalanceType["RtpCredits"] = "prefunded_rtp_credits"; TransferBalanceType["AchCredits"] = "prefunded_ach_credits"; })(TransferBalanceType = exports.TransferBalanceType || (exports.TransferBalanceType = {})); /** * This field is now deprecated. You may ignore it for transfers created on and after 12/01/2023. Specifies the source of funds for the transfer. Only valid for `credit` transfers, and defaults to `sweep` if not specified. This field is not specified for `debit` transfers. `sweep` - Sweep funds from your funding account `prefunded_rtp_credits` - Use your prefunded RTP credit balance with Plaid `prefunded_ach_credits` - Use your prefunded ACH credit balance with Plaid * @export * @enum {string} */ var TransferCreditFundsSource; (function (TransferCreditFundsSource) { TransferCreditFundsSource["Sweep"] = "sweep"; TransferCreditFundsSource["PrefundedRtpCredits"] = "prefunded_rtp_credits"; TransferCreditFundsSource["PrefundedAchCredits"] = "prefunded_ach_credits"; TransferCreditFundsSource["Null"] = "null"; })(TransferCreditFundsSource = exports.TransferCreditFundsSource || (exports.TransferCreditFundsSource = {})); /** * Originator’s diligence status. * @export * @enum {string} */ var TransferDiligenceStatus; (function (TransferDiligenceStatus) { TransferDiligenceStatus["NotSubmitted"] = "not_submitted"; TransferDiligenceStatus["Submitted"] = "submitted"; TransferDiligenceStatus["UnderReview"] = "under_review"; TransferDiligenceStatus["Approved"] = "approved"; TransferDiligenceStatus["Denied"] = "denied"; TransferDiligenceStatus["MoreInformationRequired"] = "more_information_required"; })(TransferDiligenceStatus = exports.TransferDiligenceStatus || (exports.TransferDiligenceStatus = {})); /** * Specifies the purpose of the uploaded file. `\"DUE_DILIGENCE\"` - The transfer due diligence document of the originator. * @export * @enum {string} */ var TransferDocumentPurpose; (function (TransferDocumentPurpose) { TransferDocumentPurpose["DueDiligence"] = "DUE_DILIGENCE"; })(TransferDocumentPurpose = exports.TransferDocumentPurpose || (exports.TransferDocumentPurpose = {})); /** * The type of transfer. This will be either `debit` or `credit`. A `debit` indicates a transfer of money into your origination account; a `credit` indicates a transfer of money out of your origination account. * @export * @enum {string} */ var TransferEventListTransferType; (function (TransferEventListTransferType) { TransferEventListTransferType["Debit"] = "debit"; TransferEventListTransferType["Credit"] = "credit"; TransferEventListTransferType["Null"] = "null"; })(TransferEventListTransferType = exports.TransferEventListTransferType || (exports.TransferEventListTransferType = {})); /** * The type of event that this transfer represents. Event types with prefix `sweep` represents events for Plaid Ledger sweeps. `pending`: A new transfer was created; it is in the pending state. `cancelled`: The transfer was cancelled by the client. `failed`: The transfer failed, no funds were moved. `posted`: The transfer has been successfully submitted to the payment network. `settled`: The transfer has been successfully completed by the payment network. `funds_available`: Funds from the transfer have been released from hold and applied to the ledger\'s available balance. (Only applicable to ACH debits.) `returned`: A posted transfer was returned. `swept`: The transfer was swept to / from the sweep account. `swept_settled`: Credits are available to be withdrawn or debits have been deducted from the customer’s business checking account. `return_swept`: Due to the transfer being returned, funds were pulled from or pushed back to the sweep account. `sweep.pending`: A new ledger sweep was created; it is in the pending state. `sweep.posted`: The ledger sweep has been successfully submitted to the payment network. `sweep.settled`: The transaction has settled in the funding account. This means that funds withdrawn from Plaid Ledger balance have reached the funding account, or funds to be deposited into the Plaid Ledger Balance have been pulled, and the hold period has begun. `sweep.returned`: A posted ledger sweep was returned. `sweep.failed`: The ledger sweep failed, no funds were moved. `sweep.funds_available`: Funds from the ledger sweep have been released from hold and applied to the ledger\'s available balance. This is only applicable to debits. `refund.pending`: A new refund was created; it is in the pending state. `refund.cancelled`: The refund was cancelled. `refund.failed`: The refund failed, no funds were moved. `refund.posted`: The refund has been successfully submitted to the payment network. `refund.settled`: The refund transaction has settled in the Plaid linked account. `refund.returned`: A posted refund was returned. `refund.swept`: The refund was swept from the sweep account. `refund.return_swept`: Due to the refund being returned, funds were pushed back to the sweep account. * @export * @enum {string} */ var TransferEventType; (function (TransferEventType) { TransferEventType["Pending"] = "pending"; TransferEventType["Cancelled"] = "cancelled"; TransferEventType["Failed"] = "failed"; TransferEventType["Posted"] = "posted"; TransferEventType["Settled"] = "settled"; TransferEventType["FundsAvailable"] = "funds_available"; TransferEventType["Returned"] = "returned"; TransferEventType["Swept"] = "swept"; TransferEventType["SweptSettled"] = "swept_settled"; TransferEventType["ReturnSwept"] = "return_swept"; TransferEventType["SweepPending"] = "sweep.pending"; TransferEventType["SweepPosted"] = "sweep.posted"; TransferEventType["SweepSettled"] = "sweep.settled"; TransferEventType["SweepReturned"] = "sweep.returned"; TransferEventType["SweepFailed"] = "sweep.failed"; TransferEventType["SweepFundsAvailable"] = "sweep.funds_available"; TransferEventType["RefundPending"] = "refund.pending"; TransferEventType["RefundCancelled"] = "refund.cancelled"; TransferEventType["RefundFailed"] = "refund.failed"; TransferEventType["RefundPosted"] = "refund.posted"; TransferEventType["RefundSettled"] = "refund.settled"; TransferEventType["RefundReturned"] = "refund.returned"; TransferEventType["RefundSwept"] = "refund.swept"; TransferEventType["RefundReturnSwept"] = "refund.return_swept"; })(TransferEventType = exports.TransferEventType || (exports.TransferEventType = {})); /** * A decision regarding the proposed transfer. `APPROVED` – The proposed transfer has received the end user\'s consent and has been approved for processing by Plaid. The `decision_rationale` field is set if Plaid was unable to fetch the account information. You may proceed with the transfer, but further review is recommended (i.e., use Link in update mode to re-authenticate your user when `decision_rationale.code` is `ITEM_LOGIN_REQUIRED`). Refer to the `code` field in the `decision_rationale` object for details. `DECLINED` – Plaid reviewed the proposed transfer and declined processing. Refer to the `code` field in the `decision_rationale` object for details. * @export * @enum {string} */ var TransferIntentAuthorizationDecision; (function (TransferIntentAuthorizationDecision) { TransferIntentAuthorizationDecision["Approved"] = "APPROVED"; TransferIntentAuthorizationDecision["Declined"] = "DECLINED"; })(TransferIntentAuthorizationDecision = exports.TransferIntentAuthorizationDecision || (exports.TransferIntentAuthorizationDecision = {})); /** * The direction of the flow of transfer funds. `PAYMENT`: Transfers funds from an end user\'s account to your business account. `DISBURSEMENT`: Transfers funds from your business account to an end user\'s account. * @export * @enum {string} */ var TransferIntentCreateMode; (function (TransferIntentCreateMode) { TransferIntentCreateMode["Payment"] = "PAYMENT"; TransferIntentCreateMode["Disbursement"] = "DISBURSEMENT"; })(TransferIntentCreateMode = exports.TransferIntentCreateMode || (exports.TransferIntentCreateMode = {})); /** * The network or rails used for the transfer. Defaults to `same-day-ach`. For transfers submitted using `ach`, the next-day cutoff is 8:30 PM Eastern Time. For transfers submitted using `same-day-ach`, the same-day cutoff is 3:30 PM Eastern Time. If the transfer is submitted after this cutoff but before the next-day cutoff, it will be sent over next-day rails and will not incur same-day charges. For transfers submitted using `rtp`, in the case that the account being credited does not support RTP, the transfer will be sent over ACH as long as an `ach_class` is provided in the request. If RTP isn\'t supported by the account and no `ach_class` is provided, the transfer will fail to be submitted. * @export * @enum {string} */ var TransferIntentCreateNetwork; (function (TransferIntentCreateNetwork) { TransferIntentCreateNetwork["Ach"] = "ach"; TransferIntentCreateNetwork["SameDayAch"] = "same-day-ach"; TransferIntentCreateNetwork["Rtp"] = "rtp"; })(TransferIntentCreateNetwork = exports.TransferIntentCreateNetwork || (exports.TransferIntentCreateNetwork = {})); /** * The status of the transfer intent. `PENDING`: The transfer intent is pending. `SUCCEEDED`: The transfer intent was successfully created. `FAILED`: The transfer intent was unable to be created. * @export * @enum {string} */ var TransferIntentStatus; (function (TransferIntentStatus) { TransferIntentStatus["Pending"] = "PENDING"; TransferIntentStatus["Succeeded"] = "SUCCEEDED"; TransferIntentStatus["Failed"] = "FAILED"; })(TransferIntentStatus = exports.TransferIntentStatus || (exports.TransferIntentStatus = {})); /** * The asynchronous event to be simulated. May be: `posted`, `settled`, `failed`, or `returned`. An error will be returned if the event type is incompatible with the current ledger sweep status. Compatible status --> event type transitions include: `sweep.pending` --> `sweep.posted` `sweep.pending` --> `sweep.failed` `sweep.posted` --> `sweep.settled` `sweep.posted` --> `sweep.returned` `sweep.settled` --> `sweep.returned` * @export * @enum {string} */ var TransferLedgerSweepSimulateEventType; (function (TransferLedgerSweepSimulateEventType) { TransferLedgerSweepSimulateEventType["Posted"] = "sweep.posted"; TransferLedgerSweepSimulateEventType["Settled"] = "sweep.settled"; TransferLedgerSweepSimulateEventType["Returned"] = "sweep.returned"; TransferLedgerSweepSimulateEventType["Failed"] = "sweep.failed"; })(TransferLedgerSweepSimulateEventType = exports.TransferLedgerSweepSimulateEventType || (exports.TransferLedgerSweepSimulateEventType = {})); /** * The network or rails used for the transfer. For transfers submitted as `ach`, the next-day cutoff is 8:30 PM Eastern Time. For transfers submitted as `same-day-ach`, the same-day cutoff is 3:30 PM Eastern Time. If the transfer is submitted after this cutoff but before the next-day cutoff, it will be sent over next-day rails and will not incur same-day charges; this will apply to both legs of the transfer if applicable. For transfers submitted as `rtp`, Plaid will automatically route between Real Time Payment rail by TCH or FedNow rails as necessary. If a transfer is submitted as `rtp` and the counterparty account is not eligible for RTP, the `/transfer/authorization/create` request will fail with an `INVALID_FIELD` error code. To pre-check to determine whether a counterparty account can support RTP, call `/transfer/capabilities/get` before calling `/transfer/authorization/create`. Wire transfers are currently in early availability. To request access to `wire` as a payment network, contact your Account Manager. For transfers submitted as `wire`, the `type` must be `credit`; wire debits are not supported. The cutoff to submit a wire payment is 4:30 PM Eastern Time on a business day; wires submitted after that time will be processed on the next business day. * @export * @enum {string} */ var TransferNetwork; (function (TransferNetwork) { TransferNetwork["Ach"] = "ach"; TransferNetwork["SameDayAch"] = "same-day-ach"; TransferNetwork["Rtp"] = "rtp"; TransferNetwork["Wire"] = "wire"; })(TransferNetwork = exports.TransferNetwork || (exports.TransferNetwork = {})); /** * Networks eligible for recurring transfers. * @export * @enum {string} */ var TransferRecurringNetwork; (function (TransferRecurringNetwork) { TransferRecurringNetwork["Ach"] = "ach"; TransferRecurringNetwork["SameDayAch"] = "same-day-ach"; TransferRecurringNetwork["Rtp"] = "rtp"; })(TransferRecurringNetwork = exports.TransferRecurringNetwork || (exports.TransferRecurringNetwork = {})); /** * The status of the recurring transfer. `active`: The recurring transfer is currently active. `cancelled`: The recurring transfer was cancelled by the client or Plaid. `expired`: The recurring transfer has completed all originations according to its recurring schedule. * @export * @enum {string} */ var TransferRecurringStatus; (function (TransferRecurringStatus) { TransferRecurringStatus["Active"] = "active"; TransferRecurringStatus["Cancelled"] = "cancelled"; TransferRecurringStatus["Expired"] = "expired"; })(TransferRecurringStatus = exports.TransferRecurringStatus || (exports.TransferRecurringStatus = {})); /** * The status of the refund. `pending`: A new refund was created; it is in the pending state. `posted`: The refund has been successfully submitted to the payment network. `settled`: Credits have been refunded to the Plaid linked account. `cancelled`: The refund was cancelled by the client. `failed`: The refund has failed. `returned`: The refund was returned. * @export * @enum {string} */ var TransferRefundStatus; (function (TransferRefundStatus) { TransferRefundStatus["Pending"] = "pending"; TransferRefundStatus["Posted"] = "posted"; TransferRefundStatus["Cancelled"] = "cancelled"; TransferRefundStatus["Failed"] = "failed"; TransferRefundStatus["Settled"] = "settled"; TransferRefundStatus["Returned"] = "returned"; })(TransferRefundStatus = exports.TransferRefundStatus || (exports.TransferRefundStatus = {})); /** * The unit of the recurring interval. * @export * @enum {string} */ var TransferScheduleIntervalUnit; (function (TransferScheduleIntervalUnit) { TransferScheduleIntervalUnit["Week"] = "week"; TransferScheduleIntervalUnit["Month"] = "month"; })(TransferScheduleIntervalUnit = exports.TransferScheduleIntervalUnit || (exports.TransferScheduleIntervalUnit = {})); /** * The status of the transfer. `pending`: A new transfer was created; it is in the pending state. `posted`: The transfer has been successfully submitted to the payment network. `settled`: The transfer was successfully completed by the payment network. Note that funds from received debits are not available to be moved out of the Ledger until the transfer reaches `funds_available` status. For credit transactions, `settled` means the funds have been delivered to the receiving bank account. `funds_available`: Funds from the transfer have been released from hold and applied to the ledger\'s available balance. (Only applicable to ACH debits.) `cancelled`: The transfer was cancelled by the client. `failed`: The transfer failed, no funds were moved. `returned`: A posted transfer was returned. * @export * @enum {string} */ var TransferStatus; (function (TransferStatus) { TransferStatus["Pending"] = "pending"; TransferStatus["Posted"] = "posted"; TransferStatus["Settled"] = "settled"; TransferStatus["FundsAvailable"] = "funds_available"; TransferStatus["Cancelled"] = "cancelled"; TransferStatus["Failed"] = "failed"; TransferStatus["Returned"] = "returned"; })(TransferStatus = exports.TransferStatus || (exports.TransferStatus = {})); /** * The status of the sweep for the transfer. `unswept`: The transfer hasn\'t been swept yet. `swept`: The transfer was swept to the sweep account. `swept_settled`: Credits are available to be withdrawn or debits have been deducted from the customer’s business checking account. `return_swept`: The transfer was returned, funds were pulled back or pushed back to the sweep account. `funds_available`: Funds from the transfer have been released from hold and applied to the ledger\'s available balance. This is only applicable to debits. `null`: The transfer will never be swept (e.g. if the transfer is cancelled or returned before being swept) * @export * @enum {string} */ var TransferSweepStatus; (function (TransferSweepStatus) { TransferSweepStatus["Null"] = "null"; TransferSweepStatus["Unswept"] = "unswept"; TransferSweepStatus["Swept"] = "swept"; TransferSweepStatus["SweptSettled"] = "swept_settled"; TransferSweepStatus["ReturnSwept"] = "return_swept"; TransferSweepStatus["FundsAvailable"] = "funds_available"; })(TransferSweepStatus = exports.TransferSweepStatus || (exports.TransferSweepStatus = {})); /** * The type of transfer. This will be either `debit` or `credit`. A `debit` indicates a transfer of money into the origination account; a `credit` indicates a transfer of money out of the origination account. * @export * @enum {string} */ var TransferType; (function (TransferType) { TransferType["Debit"] = "debit"; TransferType["Credit"] = "credit"; })(TransferType = exports.TransferType || (exports.TransferType = {})); /** * The income category for a specified income source * @export * @enum {string} */ var UserStatedIncomeSourceCategory; (function (UserStatedIncomeSourceCategory) { UserStatedIncomeSourceCategory["Other"] = "OTHER"; UserStatedIncomeSourceCategory["Salary"] = "SALARY"; UserStatedIncomeSourceCategory["Unemployment"] = "UNEMPLOYMENT"; UserStatedIncomeSourceCategory["Cash"] = "CASH"; UserStatedIncomeSourceCategory["GigEconomy"] = "GIG_ECONOMY"; UserStatedIncomeSourceCategory["Rental"] = "RENTAL"; UserStatedIncomeSourceCategory["ChildSupport"] = "CHILD_SUPPORT"; UserStatedIncomeSourceCategory["Military"] = "MILITARY"; UserStatedIncomeSourceCategory["Retirement"] = "RETIREMENT"; UserStatedIncomeSourceCategory["LongTermDisability"] = "LONG_TERM_DISABILITY"; UserStatedIncomeSourceCategory["BankInterest"] = "BANK_INTEREST"; })(UserStatedIncomeSourceCategory = exports.UserStatedIncomeSourceCategory || (exports.UserStatedIncomeSourceCategory = {})); /** * The pay frequency of a specified income source * @export * @enum {string} */ var UserStatedIncomeSourceFrequency; (function (UserStatedIncomeSourceFrequency) { UserStatedIncomeSourceFrequency["Unknown"] = "UNKNOWN"; UserStatedIncomeSourceFrequency["Weekly"] = "WEEKLY"; UserStatedIncomeSourceFrequency["Biweekly"] = "BIWEEKLY"; UserStatedIncomeSourceFrequency["SemiMonthly"] = "SEMI_MONTHLY"; UserStatedIncomeSourceFrequency["Monthly"] = "MONTHLY"; })(UserStatedIncomeSourceFrequency = exports.UserStatedIncomeSourceFrequency || (exports.UserStatedIncomeSourceFrequency = {})); /** * The pay type - `GROSS`, `NET`, or `UNKNOWN` for a specified income source * @export * @enum {string} */ var UserStatedIncomeSourcePayType; (function (UserStatedIncomeSourcePayType) { UserStatedIncomeSourcePayType["Unknown"] = "UNKNOWN"; UserStatedIncomeSourcePayType["Gross"] = "GROSS"; UserStatedIncomeSourcePayType["Net"] = "NET"; })(UserStatedIncomeSourcePayType = exports.UserStatedIncomeSourcePayType || (exports.UserStatedIncomeSourcePayType = {})); /** * The verification refresh status. One of the following: `\"VERIFICATION_REFRESH_STATUS_USER_PRESENCE_REQUIRED\"` User presence is required to refresh an income verification. `\"VERIFICATION_REFRESH_SUCCESSFUL\"` The income verification refresh was successful. `\"VERIFICATION_REFRESH_NOT_FOUND\"` No new data was found after the income verification refresh. * @export * @enum {string} */ var VerificationRefreshStatus; (function (VerificationRefreshStatus) { VerificationRefreshStatus["StatusUserPresenceRequired"] = "VERIFICATION_REFRESH_STATUS_USER_PRESENCE_REQUIRED"; VerificationRefreshStatus["Successful"] = "VERIFICATION_REFRESH_SUCCESSFUL"; VerificationRefreshStatus["NotFound"] = "VERIFICATION_REFRESH_NOT_FOUND"; })(VerificationRefreshStatus = exports.VerificationRefreshStatus || (exports.VerificationRefreshStatus = {})); /** * The verification status. One of the following: `\"VERIFIED\"`: The information was successfully verified. `\"UNVERIFIED\"`: The verification has not yet been performed. `\"NEEDS_INFO\"`: The verification was attempted but could not be completed due to missing information. \"`UNABLE_TO_VERIFY`\": The verification was performed and the information could not be verified. `\"UNKNOWN\"`: The verification status is unknown. * @export * @enum {string} */ var VerificationStatus; (function (VerificationStatus) { VerificationStatus["Verified"] = "VERIFIED"; VerificationStatus["Unverified"] = "UNVERIFIED"; VerificationStatus["NeedsInfo"] = "NEEDS_INFO"; VerificationStatus["UnableToVerify"] = "UNABLE_TO_VERIFY"; VerificationStatus["Unknown"] = "UNKNOWN"; })(VerificationStatus = exports.VerificationStatus || (exports.VerificationStatus = {})); /** * The outcome status for the associated Identity Verification attempt\'s `verify_sms` step. This field will always have the same value as `steps.verify_sms`. * @export * @enum {string} */ var VerifySMSDetailsStatus; (function (VerifySMSDetailsStatus) { VerifySMSDetailsStatus["Success"] = "success"; VerifySMSDetailsStatus["Failed"] = "failed"; })(VerifySMSDetailsStatus = exports.VerifySMSDetailsStatus || (exports.VerifySMSDetailsStatus = {})); /** * An ISO-4217 currency code, used with e-wallets and transactions. * @export * @enum {string} */ var WalletISOCurrencyCode; (function (WalletISOCurrencyCode) { WalletISOCurrencyCode["Gbp"] = "GBP"; WalletISOCurrencyCode["Eur"] = "EUR"; })(WalletISOCurrencyCode = exports.WalletISOCurrencyCode || (exports.WalletISOCurrencyCode = {})); /** * The payment scheme used to execute this transaction. This is present only for transaction types `PAYOUT` and `REFUND`. `FASTER_PAYMENTS`: The standard payment scheme within the UK. `SEPA_CREDIT_TRANSFER`: The standard payment to a beneficiary within the SEPA area. `SEPA_CREDIT_TRANSFER_INSTANT`: Instant payment to a beneficiary within the SEPA area. * @export * @enum {string} */ var WalletPaymentScheme; (function (WalletPaymentScheme) { WalletPaymentScheme["Null"] = "null"; WalletPaymentScheme["FasterPayments"] = "FASTER_PAYMENTS"; WalletPaymentScheme["SepaCreditTransfer"] = "SEPA_CREDIT_TRANSFER"; WalletPaymentScheme["SepaCreditTransferInstant"] = "SEPA_CREDIT_TRANSFER_INSTANT"; })(WalletPaymentScheme = exports.WalletPaymentScheme || (exports.WalletPaymentScheme = {})); /** * The status of the wallet. `UNKNOWN`: The wallet status is unknown. `ACTIVE`: The wallet is active and ready to send money to and receive money from. `CLOSED`: The wallet is closed. Any transactions made to or from this wallet will error. * @export * @enum {string} */ var WalletStatus; (function (WalletStatus) { WalletStatus["Unknown"] = "UNKNOWN"; WalletStatus["Active"] = "ACTIVE"; WalletStatus["Closed"] = "CLOSED"; })(WalletStatus = exports.WalletStatus || (exports.WalletStatus = {})); /** * @export * @enum {string} */ var WalletTransactionTypeEnum; (function (WalletTransactionTypeEnum) { WalletTransactionTypeEnum["BankTransfer"] = "BANK_TRANSFER"; WalletTransactionTypeEnum["Payout"] = "PAYOUT"; WalletTransactionTypeEnum["PisPayIn"] = "PIS_PAY_IN"; WalletTransactionTypeEnum["Refund"] = "REFUND"; WalletTransactionTypeEnum["FundsSweep"] = "FUNDS_SWEEP"; WalletTransactionTypeEnum["Return"] = "RETURN"; WalletTransactionTypeEnum["Recall"] = "RECALL"; })(WalletTransactionTypeEnum = exports.WalletTransactionTypeEnum || (exports.WalletTransactionTypeEnum = {})); /** * The error code of a failed transaction. Error codes include: `EXTERNAL_SYSTEM`: The transaction was declined by an external system. `EXPIRED`: The transaction request has expired. `CANCELLED`: The transaction request was rescinded. `INVALID`: The transaction did not meet certain criteria, such as an inactive account or no valid counterparty, etc. `UNKNOWN`: The transaction was unsuccessful, but the exact cause is unknown. * @export * @enum {string} */ var WalletTransactionFailureReason; (function (WalletTransactionFailureReason) { WalletTransactionFailureReason["ExternalSystem"] = "EXTERNAL_SYSTEM"; WalletTransactionFailureReason["Expired"] = "EXPIRED"; WalletTransactionFailureReason["Cancelled"] = "CANCELLED"; WalletTransactionFailureReason["Invalid"] = "INVALID"; WalletTransactionFailureReason["Unknown"] = "UNKNOWN"; })(WalletTransactionFailureReason = exports.WalletTransactionFailureReason || (exports.WalletTransactionFailureReason = {})); /** * @export * @enum {string} */ var WalletTransactionGetResponseTypeEnum; (function (WalletTransactionGetResponseTypeEnum) { WalletTransactionGetResponseTypeEnum["BankTransfer"] = "BANK_TRANSFER"; WalletTransactionGetResponseTypeEnum["Payout"] = "PAYOUT"; WalletTransactionGetResponseTypeEnum["PisPayIn"] = "PIS_PAY_IN"; WalletTransactionGetResponseTypeEnum["Refund"] = "REFUND"; WalletTransactionGetResponseTypeEnum["FundsSweep"] = "FUNDS_SWEEP"; WalletTransactionGetResponseTypeEnum["Return"] = "RETURN"; WalletTransactionGetResponseTypeEnum["Recall"] = "RECALL"; })(WalletTransactionGetResponseTypeEnum = exports.WalletTransactionGetResponseTypeEnum || (exports.WalletTransactionGetResponseTypeEnum = {})); /** * @export * @enum {string} */ var WalletTransactionRelationTypeEnum; (function (WalletTransactionRelationTypeEnum) { WalletTransactionRelationTypeEnum["Payout"] = "PAYOUT"; WalletTransactionRelationTypeEnum["Return"] = "RETURN"; WalletTransactionRelationTypeEnum["Refund"] = "REFUND"; WalletTransactionRelationTypeEnum["FundsSweep"] = "FUNDS_SWEEP"; })(WalletTransactionRelationTypeEnum = exports.WalletTransactionRelationTypeEnum || (exports.WalletTransactionRelationTypeEnum = {})); /** * The status of the transaction. `AUTHORISING`: The transaction is being processed for validation and compliance. `INITIATED`: The transaction has been initiated and is currently being processed. `EXECUTED`: The transaction has been successfully executed and is considered complete. This is only applicable for debit transactions. `SETTLED`: The transaction has settled and funds are available for use. This is only applicable for credit transactions. A transaction will typically settle within seconds to several days, depending on which payment rail is used. `FAILED`: The transaction failed to process successfully. This is a terminal status. `BLOCKED`: The transaction has been blocked for violating compliance rules. This is a terminal status. * @export * @enum {string} */ var WalletTransactionStatus; (function (WalletTransactionStatus) { WalletTransactionStatus["Authorising"] = "AUTHORISING"; WalletTransactionStatus["Initiated"] = "INITIATED"; WalletTransactionStatus["Executed"] = "EXECUTED"; WalletTransactionStatus["Settled"] = "SETTLED"; WalletTransactionStatus["Blocked"] = "BLOCKED"; WalletTransactionStatus["Failed"] = "FAILED"; })(WalletTransactionStatus = exports.WalletTransactionStatus || (exports.WalletTransactionStatus = {})); /** * @export * @enum {string} */ var WarningWarningCodeEnum; (function (WarningWarningCodeEnum) { WarningWarningCodeEnum["OwnersUnavailable"] = "OWNERS_UNAVAILABLE"; WarningWarningCodeEnum["InvestmentsUnavailable"] = "INVESTMENTS_UNAVAILABLE"; WarningWarningCodeEnum["TransactionsUnavailable"] = "TRANSACTIONS_UNAVAILABLE"; })(WarningWarningCodeEnum = exports.WarningWarningCodeEnum || (exports.WarningWarningCodeEnum = {})); /** * The kind of official document represented by this object. `birth_certificate` - A certificate of birth `drivers_license` - A license to operate a motor vehicle `immigration_number` - Immigration or residence documents `military_id` - Identification issued by a military group `other` - Any document not covered by other categories `passport` - An official passport issue by a government `personal_identification` - Any generic personal identification that is not covered by other categories `ration_card` - Identification that entitles the holder to rations `ssn` - United States Social Security Number `student_id` - Identification issued by an educational institution `tax_id` - Identification issued for the purpose of collecting taxes `travel_document` - Visas, entry permits, refugee documents, etc. `voter_id` - Identification issued for the purpose of voting * @export * @enum {string} */ var WatchlistScreeningDocumentType; (function (WatchlistScreeningDocumentType) { WatchlistScreeningDocumentType["BirthCertificate"] = "birth_certificate"; WatchlistScreeningDocumentType["DriversLicense"] = "drivers_license"; WatchlistScreeningDocumentType["ImmigrationNumber"] = "immigration_number"; WatchlistScreeningDocumentType["MilitaryId"] = "military_id"; WatchlistScreeningDocumentType["Other"] = "other"; WatchlistScreeningDocumentType["Passport"] = "passport"; WatchlistScreeningDocumentType["PersonalIdentification"] = "personal_identification"; WatchlistScreeningDocumentType["RationCard"] = "ration_card"; WatchlistScreeningDocumentType["Ssn"] = "ssn"; WatchlistScreeningDocumentType["StudentId"] = "student_id"; WatchlistScreeningDocumentType["TaxId"] = "tax_id"; WatchlistScreeningDocumentType["TravelDocument"] = "travel_document"; WatchlistScreeningDocumentType["VoterId"] = "voter_id"; })(WatchlistScreeningDocumentType = exports.WatchlistScreeningDocumentType || (exports.WatchlistScreeningDocumentType = {})); /** * The name of a field that can be reset back to null * @export * @enum {string} */ var WatchlistScreeningEntityUpdateRequestResettableField; (function (WatchlistScreeningEntityUpdateRequestResettableField) { WatchlistScreeningEntityUpdateRequestResettableField["Assignee"] = "assignee"; })(WatchlistScreeningEntityUpdateRequestResettableField = exports.WatchlistScreeningEntityUpdateRequestResettableField || (exports.WatchlistScreeningEntityUpdateRequestResettableField = {})); /** * The current state of review. All watchlist screening hits begin in a `pending_review` state but can be changed by creating a review. When a hit is in the `pending_review` state, it will always show the latest version of the watchlist data Plaid has available and be compared against the latest customer information saved in the watchlist screening. Once a hit has been marked as `confirmed` or `dismissed` it will no longer be updated so that the state is as it was when the review was first conducted. * @export * @enum {string} */ var WatchlistScreeningHitStatus; (function (WatchlistScreeningHitStatus) { WatchlistScreeningHitStatus["Confirmed"] = "confirmed"; WatchlistScreeningHitStatus["PendingReview"] = "pending_review"; WatchlistScreeningHitStatus["Dismissed"] = "dismissed"; })(WatchlistScreeningHitStatus = exports.WatchlistScreeningHitStatus || (exports.WatchlistScreeningHitStatus = {})); /** * The name of a field that can be reset back to null * @export * @enum {string} */ var WatchlistScreeningIndividualUpdateRequestResettableField; (function (WatchlistScreeningIndividualUpdateRequestResettableField) { WatchlistScreeningIndividualUpdateRequestResettableField["Assignee"] = "assignee"; })(WatchlistScreeningIndividualUpdateRequestResettableField = exports.WatchlistScreeningIndividualUpdateRequestResettableField || (exports.WatchlistScreeningIndividualUpdateRequestResettableField = {})); /** * A status enum indicating whether a screening is still pending review, has been rejected, or has been cleared. * @export * @enum {string} */ var WatchlistScreeningStatus; (function (WatchlistScreeningStatus) { WatchlistScreeningStatus["Rejected"] = "rejected"; WatchlistScreeningStatus["PendingReview"] = "pending_review"; WatchlistScreeningStatus["Cleared"] = "cleared"; })(WatchlistScreeningStatus = exports.WatchlistScreeningStatus || (exports.WatchlistScreeningStatus = {})); /** * Names that are explicitly marked as low quality either by their `source` list, or by `plaid` by a series of additional checks done by Plaid. Plaid does not ever surface a hit as a result of a weak name alone. If a name has no quality issues, this value will be `none`. * @export * @enum {string} */ var WeakAliasDetermination; (function (WeakAliasDetermination) { WeakAliasDetermination["None"] = "none"; WeakAliasDetermination["Source"] = "source"; WeakAliasDetermination["Plaid"] = "plaid"; })(WeakAliasDetermination = exports.WeakAliasDetermination || (exports.WeakAliasDetermination = {})); /** * The Plaid environment the webhook was sent from * @export * @enum {string} */ var WebhookEnvironmentValues; (function (WebhookEnvironmentValues) { WebhookEnvironmentValues["Sandbox"] = "sandbox"; WebhookEnvironmentValues["Production"] = "production"; })(WebhookEnvironmentValues = exports.WebhookEnvironmentValues || (exports.WebhookEnvironmentValues = {})); /** * The webhook types that can be fired by this test endpoint. * @export * @enum {string} */ var WebhookType; (function (WebhookType) { WebhookType["Auth"] = "AUTH"; WebhookType["Holdings"] = "HOLDINGS"; WebhookType["InvestmentsTransactions"] = "INVESTMENTS_TRANSACTIONS"; WebhookType["Item"] = "ITEM"; WebhookType["Liabilities"] = "LIABILITIES"; WebhookType["Transactions"] = "TRANSACTIONS"; WebhookType["Assets"] = "ASSETS"; })(WebhookType = exports.WebhookType || (exports.WebhookType = {})); /** * The type of rate which indicates how the predicted yield was calculated. It is one of: `coupon`: the annualized interest rate for securities with a one-year term or longer, such as treasury notes and bonds. `coupon_equivalent`: the calculated equivalent for the annualized interest rate factoring in the discount rate and time to maturity, for shorter term, non-interest-bearing securities such as treasury bills. `discount`: the rate at which the present value or cost is discounted from the future value upon maturity, also known as the face value. `yield`: the total predicted rate of return factoring in both the discount rate and the coupon rate, applicable to securities such as exchange-traded bonds which can both be interest-bearing as well as sold at a discount off its face value. * @export * @enum {string} */ var YieldRateType; (function (YieldRateType) { YieldRateType["Coupon"] = "coupon"; YieldRateType["CouponEquivalent"] = "coupon_equivalent"; YieldRateType["Discount"] = "discount"; YieldRateType["Yield"] = "yield"; YieldRateType["Null"] = "null"; })(YieldRateType = exports.YieldRateType || (exports.YieldRateType = {})); /** * PlaidApi - axios parameter creator * @export */ const PlaidApiAxiosParamCreator = function (configuration) { return { /** * The `/accounts/balance/get` endpoint returns the real-time balance for each of an Item\'s accounts. While other endpoints, such as `/accounts/get`, return a balance object, only `/accounts/balance/get` forces the available and current balance fields to be refreshed rather than cached. This endpoint can be used for existing Items that were added via any of Plaid’s other products. This endpoint can be used as long as Link has been initialized with any other product, `balance` itself is not a product that can be used to initialize Link. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. * @summary Retrieve real-time balance data * @param {AccountsBalanceGetRequest} accountsBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ accountsBalanceGet: (accountsBalanceGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'accountsBalanceGetRequest' is not null or undefined common_1.assertParamExists('accountsBalanceGet', 'accountsBalanceGetRequest', accountsBalanceGetRequest); const localVarPath = `/accounts/balance/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(accountsBalanceGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/accounts/get` endpoint can be used to retrieve a list of accounts associated with any linked Item. Plaid will only return active bank accounts — that is, accounts that are not closed and are capable of carrying a balance. To return new accounts that were created after the user linked their Item, you can listen for the [`NEW_ACCOUNTS_AVAILABLE`](https://plaid.com/docs/api/items/#new_accounts_available) webhook and then use Link\'s [update mode](https://plaid.com/docs/link/update-mode/) to request that the user share this new account with you. `/accounts/get` is free to use and retrieves cached information, rather than extracting fresh information from the institution. The balance returned will reflect the balance at the time of the last successful Item update. If the Item is enabled for a regularly updating product, such as Transactions, Investments, or Liabilities, the balance will typically update about once a day, as long as the Item is healthy. If the Item is enabled only for products that do not frequently update, such as Auth or Identity, balance data may be much older. For realtime balance information, use the paid endpoint `/accounts/balance/get` instead. * @summary Retrieve accounts * @param {AccountsGetRequest} accountsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ accountsGet: (accountsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'accountsGetRequest' is not null or undefined common_1.assertParamExists('accountsGet', 'accountsGetRequest', accountsGetRequest); const localVarPath = `/accounts/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(accountsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Allows financial institutions to retrieve information about Plaid clients for the purpose of building control-tower experiences * @summary Retrieve information about a Plaid application * @param {ApplicationGetRequest} applicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ applicationGet: (applicationGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'applicationGetRequest' is not null or undefined common_1.assertParamExists('applicationGet', 'applicationGetRequest', applicationGetRequest); const localVarPath = `/application/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(applicationGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Plaid can provide an Audit Copy of any Asset Report directly to a participating third party on your behalf. For example, Plaid can supply an Audit Copy directly to Fannie Mae on your behalf if you participate in the Day 1 Certainty™ program. An Audit Copy contains the same underlying data as the Asset Report. To grant access to an Audit Copy, use the `/asset_report/audit_copy/create` endpoint to create an `audit_copy_token` and then pass that token to the third party who needs access. Each third party has its own `auditor_id`, for example `fannie_mae`. You’ll need to create a separate Audit Copy for each third party to whom you want to grant access to the Report. * @summary Create Asset Report Audit Copy * @param {AssetReportAuditCopyCreateRequest} assetReportAuditCopyCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportAuditCopyCreate: (assetReportAuditCopyCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'assetReportAuditCopyCreateRequest' is not null or undefined common_1.assertParamExists('assetReportAuditCopyCreate', 'assetReportAuditCopyCreateRequest', assetReportAuditCopyCreateRequest); const localVarPath = `/asset_report/audit_copy/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(assetReportAuditCopyCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/asset_report/audit_copy/get` allows auditors to get a copy of an Asset Report that was previously shared via the `/asset_report/audit_copy/create` endpoint. The caller of `/asset_report/audit_copy/create` must provide the `audit_copy_token` to the auditor. This token can then be used to call `/asset_report/audit_copy/create`. * @summary Retrieve an Asset Report Audit Copy * @param {AssetReportAuditCopyGetRequest} assetReportAuditCopyGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportAuditCopyGet: (assetReportAuditCopyGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'assetReportAuditCopyGetRequest' is not null or undefined common_1.assertParamExists('assetReportAuditCopyGet', 'assetReportAuditCopyGetRequest', assetReportAuditCopyGetRequest); const localVarPath = `/asset_report/audit_copy/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(assetReportAuditCopyGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/asset_report/audit_copy/remove` endpoint allows you to remove an Audit Copy. Removing an Audit Copy invalidates the `audit_copy_token` associated with it, meaning both you and any third parties holding the token will no longer be able to use it to access Report data. Items associated with the Asset Report, the Asset Report itself and other Audit Copies of it are not affected and will remain accessible after removing the given Audit Copy. * @summary Remove Asset Report Audit Copy * @param {AssetReportAuditCopyRemoveRequest} assetReportAuditCopyRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportAuditCopyRemove: (assetReportAuditCopyRemoveRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'assetReportAuditCopyRemoveRequest' is not null or undefined common_1.assertParamExists('assetReportAuditCopyRemove', 'assetReportAuditCopyRemoveRequest', assetReportAuditCopyRemoveRequest); const localVarPath = `/asset_report/audit_copy/remove`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(assetReportAuditCopyRemoveRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/asset_report/create` endpoint initiates the process of creating an Asset Report, which can then be retrieved by passing the `asset_report_token` return value to the `/asset_report/get` or `/asset_report/pdf/get` endpoints. The Asset Report takes some time to be created and is not available immediately after calling `/asset_report/create`. The exact amount of time to create the report will vary depending on how many days of history are requested and will typically range from a few seconds to about one minute. When the Asset Report is ready to be retrieved using `/asset_report/get` or `/asset_report/pdf/get`, Plaid will fire a `PRODUCT_READY` webhook. For full details of the webhook schema, see [Asset Report webhooks](https://plaid.com/docs/api/products/assets/#webhooks). The `/asset_report/create` endpoint creates an Asset Report at a moment in time. Asset Reports are immutable. To get an updated Asset Report, use the `/asset_report/refresh` endpoint. * @summary Create an Asset Report * @param {AssetReportCreateRequest} assetReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportCreate: (assetReportCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'assetReportCreateRequest' is not null or undefined common_1.assertParamExists('assetReportCreate', 'assetReportCreateRequest', assetReportCreateRequest); const localVarPath = `/asset_report/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(assetReportCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * By default, an Asset Report will contain all of the accounts on a given Item. In some cases, you may not want the Asset Report to contain all accounts. For example, you might have the end user choose which accounts are relevant in Link using the Account Select view, which you can enable in the dashboard. Or, you might always exclude certain account types or subtypes, which you can identify by using the `/accounts/get` endpoint. To narrow an Asset Report to only a subset of accounts, use the `/asset_report/filter` endpoint. To exclude certain Accounts from an Asset Report, first use the `/asset_report/create` endpoint to create the report, then send the `asset_report_token` along with a list of `account_ids` to exclude to the `/asset_report/filter` endpoint, to create a new Asset Report which contains only a subset of the original Asset Report\'s data. Because Asset Reports are immutable, calling `/asset_report/filter` does not alter the original Asset Report in any way; rather, `/asset_report/filter` creates a new Asset Report with a new token and id. Asset Reports created via `/asset_report/filter` do not contain new Asset data, and are not billed. Plaid will fire a [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook once generation of the filtered Asset Report has completed. * @summary Filter Asset Report * @param {AssetReportFilterRequest} assetReportFilterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportFilter: (assetReportFilterRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'assetReportFilterRequest' is not null or undefined common_1.assertParamExists('assetReportFilter', 'assetReportFilterRequest', assetReportFilterRequest); const localVarPath = `/asset_report/filter`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(assetReportFilterRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportGet: (assetReportGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'assetReportGetRequest' is not null or undefined common_1.assertParamExists('assetReportGet', 'assetReportGetRequest', assetReportGetRequest); const localVarPath = `/asset_report/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(assetReportGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/asset_report/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/asset_report/pdf/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/asset_report/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). * @summary Retrieve a PDF Asset Report * @param {AssetReportPDFGetRequest} assetReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportPdfGet: (assetReportPDFGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'assetReportPDFGetRequest' is not null or undefined common_1.assertParamExists('assetReportPdfGet', 'assetReportPDFGetRequest', assetReportPDFGetRequest); const localVarPath = `/asset_report/pdf/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(assetReportPDFGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * An Asset Report is an immutable snapshot of a user\'s assets. In order to \"refresh\" an Asset Report you created previously, you can use the `/asset_report/refresh` endpoint to create a new Asset Report based on the old one, but with the most recent data available. The new Asset Report will contain the same Items as the original Report, as well as the same filters applied by any call to `/asset_report/filter`. By default, the new Asset Report will also use the same parameters you submitted with your original `/asset_report/create` request, but the original `days_requested` value and the values of any parameters in the `options` object can be overridden with new values. To change these arguments, simply supply new values for them in your request to `/asset_report/refresh`. Submit an empty string (\"\") for any previously-populated fields you would like set as empty. * @summary Refresh an Asset Report * @param {AssetReportRefreshRequest} assetReportRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportRefresh: (assetReportRefreshRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'assetReportRefreshRequest' is not null or undefined common_1.assertParamExists('assetReportRefresh', 'assetReportRefreshRequest', assetReportRefreshRequest); const localVarPath = `/asset_report/refresh`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(assetReportRefreshRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/item/remove` endpoint allows you to invalidate an `access_token`, meaning you will not be able to create new Asset Reports with it. Removing an Item does not affect any Asset Reports or Audit Copies you have already created, which will remain accessible until you remove them specifically. The `/asset_report/remove` endpoint allows you to remove access to an Asset Report. Removing an Asset Report invalidates its `asset_report_token`, meaning you will no longer be able to use it to access Report data or create new Audit Copies. Removing an Asset Report does not affect the underlying Items, but does invalidate any `audit_copy_tokens` associated with the Asset Report. * @summary Delete an Asset Report * @param {AssetReportRemoveRequest} assetReportRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportRemove: (assetReportRemoveRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'assetReportRemoveRequest' is not null or undefined common_1.assertParamExists('assetReportRemove', 'assetReportRemoveRequest', assetReportRemoveRequest); const localVarPath = `/asset_report/remove`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(assetReportRemoveRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/auth/get` endpoint returns the bank account and bank identification numbers (such as routing numbers, for US accounts) associated with an Item\'s checking, savings, and cash management accounts, along with high-level account data and balances when available. Versioning note: In API version 2017-03-08, the schema of the `numbers` object returned by this endpoint is substantially different. For details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2018-05-22). * @summary Retrieve auth data * @param {AuthGetRequest} authGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ authGet: (authGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'authGetRequest' is not null or undefined common_1.assertParamExists('authGet', 'authGetRequest', authGetRequest); const localVarPath = `/auth/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(authGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. * @summary Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferBalanceGet: (bankTransferBalanceGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'bankTransferBalanceGetRequest' is not null or undefined common_1.assertParamExists('bankTransferBalanceGet', 'bankTransferBalanceGetRequest', bankTransferBalanceGetRequest); const localVarPath = `/bank_transfer/balance/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(bankTransferBalanceGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. * @summary Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferCancel: (bankTransferCancelRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'bankTransferCancelRequest' is not null or undefined common_1.assertParamExists('bankTransferCancel', 'bankTransferCancelRequest', bankTransferCancelRequest); const localVarPath = `/bank_transfer/cancel`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(bankTransferCancelRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. * @summary Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferCreate: (bankTransferCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'bankTransferCreateRequest' is not null or undefined common_1.assertParamExists('bankTransferCreate', 'bankTransferCreateRequest', bankTransferCreateRequest); const localVarPath = `/bank_transfer/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(bankTransferCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/bank_transfer/event/list` endpoint to get a list of Plaid-initiated ACH or bank transfer events based on specified filter criteria. When using Auth with micro-deposit verification enabled, this endpoint can be used to fetch status updates on ACH micro-deposits. For more details, see [micro-deposit events](https://plaid.com/docs/auth/coverage/microdeposit-events/). * @summary List bank transfer events * @param {BankTransferEventListRequest} bankTransferEventListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferEventList: (bankTransferEventListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'bankTransferEventListRequest' is not null or undefined common_1.assertParamExists('bankTransferEventList', 'bankTransferEventListRequest', bankTransferEventListRequest); const localVarPath = `/bank_transfer/event/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(bankTransferEventListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/bank_transfer/event/sync` allows you to request up to the next 25 Plaid-initiated bank transfer events that happened after a specific `event_id`. When using Auth with micro-deposit verification enabled, this endpoint can be used to fetch status updates on ACH micro-deposits. For more details, see [micro-deposit events](https://www.plaid.com/docs/auth/coverage/microdeposit-events/). * @summary Sync bank transfer events * @param {BankTransferEventSyncRequest} bankTransferEventSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferEventSync: (bankTransferEventSyncRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'bankTransferEventSyncRequest' is not null or undefined common_1.assertParamExists('bankTransferEventSync', 'bankTransferEventSyncRequest', bankTransferEventSyncRequest); const localVarPath = `/bank_transfer/event/sync`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(bankTransferEventSyncRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. * @summary Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferGet: (bankTransferGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'bankTransferGetRequest' is not null or undefined common_1.assertParamExists('bankTransferGet', 'bankTransferGetRequest', bankTransferGetRequest); const localVarPath = `/bank_transfer/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(bankTransferGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. * @summary List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferList: (bankTransferListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'bankTransferListRequest' is not null or undefined common_1.assertParamExists('bankTransferList', 'bankTransferListRequest', bankTransferListRequest); const localVarPath = `/bank_transfer/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(bankTransferListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid Account Manager. * @summary Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferMigrateAccount: (bankTransferMigrateAccountRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'bankTransferMigrateAccountRequest' is not null or undefined common_1.assertParamExists('bankTransferMigrateAccount', 'bankTransferMigrateAccountRequest', bankTransferMigrateAccountRequest); const localVarPath = `/bank_transfer/migrate_account`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(bankTransferMigrateAccountRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferSweepGet: (bankTransferSweepGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'bankTransferSweepGetRequest' is not null or undefined common_1.assertParamExists('bankTransferSweepGet', 'bankTransferSweepGetRequest', bankTransferSweepGetRequest); const localVarPath = `/bank_transfer/sweep/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(bankTransferSweepGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. * @summary List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferSweepList: (bankTransferSweepListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'bankTransferSweepListRequest' is not null or undefined common_1.assertParamExists('bankTransferSweepList', 'bankTransferSweepListRequest', bankTransferSweepListRequest); const localVarPath = `/bank_transfer/sweep/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(bankTransferSweepListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. * @summary Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconAccountRiskEvaluate: (beaconAccountRiskEvaluateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconAccountRiskEvaluateRequest' is not null or undefined common_1.assertParamExists('beaconAccountRiskEvaluate', 'beaconAccountRiskEvaluateRequest', beaconAccountRiskEvaluateRequest); const localVarPath = `/beacon/account_risk/v1/evaluate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconAccountRiskEvaluateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. * @summary Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconDuplicateGet: (beaconDuplicateGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconDuplicateGetRequest' is not null or undefined common_1.assertParamExists('beaconDuplicateGet', 'beaconDuplicateGetRequest', beaconDuplicateGetRequest); const localVarPath = `/beacon/duplicate/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconDuplicateGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Create a fraud report for a given Beacon User. * @summary Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportCreate: (beaconReportCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconReportCreateRequest' is not null or undefined common_1.assertParamExists('beaconReportCreate', 'beaconReportCreateRequest', beaconReportCreateRequest); const localVarPath = `/beacon/report/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconReportCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Returns a Beacon report for a given Beacon report id. * @summary Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportGet: (beaconReportGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconReportGetRequest' is not null or undefined common_1.assertParamExists('beaconReportGet', 'beaconReportGetRequest', beaconReportGetRequest); const localVarPath = `/beacon/report/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconReportGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. * @summary List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportList: (beaconReportListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconReportListRequest' is not null or undefined common_1.assertParamExists('beaconReportList', 'beaconReportListRequest', beaconReportListRequest); const localVarPath = `/beacon/report/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconReportListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. * @summary Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportSyndicationGet: (beaconReportSyndicationGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconReportSyndicationGetRequest' is not null or undefined common_1.assertParamExists('beaconReportSyndicationGet', 'beaconReportSyndicationGetRequest', beaconReportSyndicationGetRequest); const localVarPath = `/beacon/report_syndication/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconReportSyndicationGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. * @summary List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportSyndicationList: (beaconReportSyndicationListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconReportSyndicationListRequest' is not null or undefined common_1.assertParamExists('beaconReportSyndicationList', 'beaconReportSyndicationListRequest', beaconReportSyndicationListRequest); const localVarPath = `/beacon/report_syndication/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconReportSyndicationListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. * @summary Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserAccountInsightsGet: (beaconUserAccountInsightsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconUserAccountInsightsGetRequest' is not null or undefined common_1.assertParamExists('beaconUserAccountInsightsGet', 'beaconUserAccountInsightsGetRequest', beaconUserAccountInsightsGetRequest); const localVarPath = `/beacon/user/account_insights/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconUserAccountInsightsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. * @summary Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserCreate: (beaconUserCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconUserCreateRequest' is not null or undefined common_1.assertParamExists('beaconUserCreate', 'beaconUserCreateRequest', beaconUserCreateRequest); const localVarPath = `/beacon/user/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconUserCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. * @summary Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserGet: (beaconUserGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconUserGetRequest' is not null or undefined common_1.assertParamExists('beaconUserGet', 'beaconUserGetRequest', beaconUserGetRequest); const localVarPath = `/beacon/user/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconUserGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List all changes to the Beacon User in reverse-chronological order. * @summary List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserHistoryList: (beaconUserHistoryListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconUserHistoryListRequest' is not null or undefined common_1.assertParamExists('beaconUserHistoryList', 'beaconUserHistoryListRequest', beaconUserHistoryListRequest); const localVarPath = `/beacon/user/history/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconUserHistoryListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to \"rejected\", we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to \"cleared\", we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to \"cleared\". There are no restrictions on updating a Beacon User\'s status to \"pending_review\". If these conditions are not met, the request will be rejected with an error explaining the issue. * @summary Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserReview: (beaconUserReviewRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconUserReviewRequest' is not null or undefined common_1.assertParamExists('beaconUserReview', 'beaconUserReviewRequest', beaconUserReviewRequest); const localVarPath = `/beacon/user/review`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconUserReviewRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. * @summary Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserUpdate: (beaconUserUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'beaconUserUpdateRequest' is not null or undefined common_1.assertParamExists('beaconUserUpdate', 'beaconUserUpdateRequest', beaconUserUpdateRequest); const localVarPath = `/beacon/user/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(beaconUserUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. All implementations are recommended to use the newer `personal_finance_category` taxonomy instead of the older `category` taxonomy supported by this endpoint. The [`personal_finance_category taxonomy` CSV file](https://plaid.com/documents/transactions-personal-finance-category-taxonomy.csv) is available for download and is not accessible via API. * @summary Get categories * @param {object} body * @param {*} [options] Override http request option. * @throws {RequiredError} */ categoriesGet: (body, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'body' is not null or undefined common_1.assertParamExists('categoriesGet', 'body', body); const localVarPath = `/categories/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(body, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List a historical log of Item consent events. Consent logs are only available for events occurring on or after November 7, 2024. Up to three years of consent logs will be available via the endpoint. * @summary List a historical log of item consent events * @param {ConsentEventsGetRequest} consentEventsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ consentEventsGet: (consentEventsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'consentEventsGetRequest' is not null or undefined common_1.assertParamExists('consentEventsGet', 'consentEventsGetRequest', consentEventsGetRequest); const localVarPath = `/consent/events/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(consentEventsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Retrieves all existing CRB Bank Income and Base reports for the consumer in PDF format. Response is PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. * @summary Retrieve a PDF Reports * @param {ConsumerReportPDFGetRequest} consumerReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ consumerReportPdfGet: (consumerReportPDFGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'consumerReportPDFGetRequest' is not null or undefined common_1.assertParamExists('consumerReportPdfGet', 'consumerReportPDFGetRequest', consumerReportPDFGetRequest); const localVarPath = `/consumer_report/pdf/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(consumerReportPDFGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/cra/bank_income/create` creates a CRA report for income verification * @summary Create a CRA report for income verification * @param {CraBankIncomeCreateRequest} craBankIncomeCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craBankIncomeCreate: (craBankIncomeCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craBankIncomeCreateRequest' is not null or undefined common_1.assertParamExists('craBankIncomeCreate', 'craBankIncomeCreateRequest', craBankIncomeCreateRequest); const localVarPath = `/cra/bank_income/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craBankIncomeCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/cra/bank_income/get` returns the bank income report(s) for a specified user. * @summary Retrieve information from the bank accounts used for income verification * @param {CraBankIncomeGetRequest} craBankIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craBankIncomeGet: (craBankIncomeGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craBankIncomeGetRequest' is not null or undefined common_1.assertParamExists('craBankIncomeGet', 'craBankIncomeGetRequest', craBankIncomeGetRequest); const localVarPath = `/cra/bank_income/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craBankIncomeGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint allows you to retrieve the Base Report for your user, allowing you to receive comprehensive bank account and cash flow data. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve a Base Report * @param {CraCheckReportBaseReportGetRequest} craCheckReportBaseReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportBaseReportGet: (craCheckReportBaseReportGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craCheckReportBaseReportGetRequest' is not null or undefined common_1.assertParamExists('craCheckReportBaseReportGet', 'craCheckReportBaseReportGetRequest', craCheckReportBaseReportGetRequest); const localVarPath = `/cra/check_report/base_report/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craCheckReportBaseReportGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportCashflowInsightsGet: (craCheckReportCashflowInsightsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craCheckReportCashflowInsightsGetRequest' is not null or undefined common_1.assertParamExists('craCheckReportCashflowInsightsGet', 'craCheckReportCashflowInsightsGetRequest', craCheckReportCashflowInsightsGetRequest); const localVarPath = `/cra/check_report/cashflow_insights/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craCheckReportCashflowInsightsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report * @param {CraCheckReportCreateRequest} craCheckReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportCreate: (craCheckReportCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craCheckReportCreateRequest' is not null or undefined common_1.assertParamExists('craCheckReportCreate', 'craCheckReportCreateRequest', craCheckReportCreateRequest); const localVarPath = `/cra/check_report/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craCheckReportCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow information from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportIncomeInsightsGet: (craCheckReportIncomeInsightsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craCheckReportIncomeInsightsGetRequest' is not null or undefined common_1.assertParamExists('craCheckReportIncomeInsightsGet', 'craCheckReportIncomeInsightsGetRequest', craCheckReportIncomeInsightsGetRequest); const localVarPath = `/cra/check_report/income_insights/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craCheckReportIncomeInsightsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_attributes` product or have generated a report using `/cra/check_report/create`, we will generate the attributes when you call this endpoint. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportNetworkInsightsGet: (craCheckReportNetworkInsightsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craCheckReportNetworkInsightsGetRequest' is not null or undefined common_1.assertParamExists('craCheckReportNetworkInsightsGet', 'craCheckReportNetworkInsightsGetRequest', craCheckReportNetworkInsightsGetRequest); const localVarPath = `/cra/check_report/network_insights/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craCheckReportNetworkInsightsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportPartnerInsightsGet: (craCheckReportPartnerInsightsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craCheckReportPartnerInsightsGetRequest' is not null or undefined common_1.assertParamExists('craCheckReportPartnerInsightsGet', 'craCheckReportPartnerInsightsGetRequest', craCheckReportPartnerInsightsGetRequest); const localVarPath = `/cra/check_report/partner_insights/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craCheckReportPartnerInsightsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/cra/check_report/pdf/get` retrieves the most recent Consumer Report in PDF format. By default, the most recent Base Report (if it exists) for the user will be returned. To request that the most recent Income Insights report be included in the PDF as well, use the `add-ons` field. * @summary Retrieve Consumer Reports as a PDF * @param {CraCheckReportPDFGetRequest} craCheckReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportPdfGet: (craCheckReportPDFGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craCheckReportPDFGetRequest' is not null or undefined common_1.assertParamExists('craCheckReportPdfGet', 'craCheckReportPDFGetRequest', craCheckReportPDFGetRequest); const localVarPath = `/cra/check_report/pdf/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craCheckReportPDFGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/cra/loans/applications/register` registers loan applications and decisions. * @summary Register loan applications and decisions. * @param {CraLoansApplicationsRegisterRequest} craLoansApplicationsRegisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansApplicationsRegister: (craLoansApplicationsRegisterRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craLoansApplicationsRegisterRequest' is not null or undefined common_1.assertParamExists('craLoansApplicationsRegister', 'craLoansApplicationsRegisterRequest', craLoansApplicationsRegisterRequest); const localVarPath = `/cra/loans/applications/register`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craLoansApplicationsRegisterRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/cra/loans/register` registers a list of loans to their applicants. * @summary Register a list of loans to their applicants. * @param {CRALoansRegisterRequest} cRALoansRegisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansRegister: (cRALoansRegisterRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'cRALoansRegisterRequest' is not null or undefined common_1.assertParamExists('craLoansRegister', 'cRALoansRegisterRequest', cRALoansRegisterRequest); const localVarPath = `/cra/loans/register`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(cRALoansRegisterRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/cra/loans/unregister` indicates the loans have reached a final status and no further updates are expected. * @summary Unregister a list of loans. * @param {CraLoansUnregisterRequest} craLoansUnregisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansUnregister: (craLoansUnregisterRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craLoansUnregisterRequest' is not null or undefined common_1.assertParamExists('craLoansUnregister', 'craLoansUnregisterRequest', craLoansUnregisterRequest); const localVarPath = `/cra/loans/unregister`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craLoansUnregisterRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/cra/loans/update` updates loan information such as the status and payment history. * @summary Updates loan data. * @param {CraLoansUpdateRequest} craLoansUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansUpdate: (craLoansUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craLoansUpdateRequest' is not null or undefined common_1.assertParamExists('craLoansUpdate', 'craLoansUpdateRequest', craLoansUpdateRequest); const localVarPath = `/cra/loans/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craLoansUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint allows you to retrieve a Monitoring Insights report by passing in the `user_token` referred to in the webhook you received. * @summary Retrieve a Monitoring Insights Report * @param {CraMonitoringInsightsGetRequest} craMonitoringInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craMonitoringInsightsGet: (craMonitoringInsightsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craMonitoringInsightsGetRequest' is not null or undefined common_1.assertParamExists('craMonitoringInsightsGet', 'craMonitoringInsightsGetRequest', craMonitoringInsightsGetRequest); const localVarPath = `/cra/monitoring_insights/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craMonitoringInsightsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint allows you to subscribe to insights for a user\'s linked CRA items, which are updated every day (best-effort). * @summary Subscribe to Monitoring Insights * @param {CraMonitoringInsightsSubscribeRequest} craMonitoringInsightsSubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craMonitoringInsightsSubscribe: (craMonitoringInsightsSubscribeRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craMonitoringInsightsSubscribeRequest' is not null or undefined common_1.assertParamExists('craMonitoringInsightsSubscribe', 'craMonitoringInsightsSubscribeRequest', craMonitoringInsightsSubscribeRequest); const localVarPath = `/cra/monitoring_insights/subscribe`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craMonitoringInsightsSubscribeRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint allows you to unsubscribe from previously subscribed Monitoring Insights. * @summary Unsubscribe from Monitoring Insights * @param {CraMonitoringInsightsUnsubscribeRequest} craMonitoringInsightsUnsubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craMonitoringInsightsUnsubscribe: (craMonitoringInsightsUnsubscribeRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craMonitoringInsightsUnsubscribeRequest' is not null or undefined common_1.assertParamExists('craMonitoringInsightsUnsubscribe', 'craMonitoringInsightsUnsubscribeRequest', craMonitoringInsightsUnsubscribeRequest); const localVarPath = `/cra/monitoring_insights/unsubscribe`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craMonitoringInsightsUnsubscribeRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/cra/partner_insights/get` returns cash flow insights for a specified user. * @summary Retrieve cash flow insights from the bank accounts used for income verification * @param {CraPartnerInsightsGetRequest} craPartnerInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craPartnerInsightsGet: (craPartnerInsightsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'craPartnerInsightsGetRequest' is not null or undefined common_1.assertParamExists('craPartnerInsightsGet', 'craPartnerInsightsGetRequest', craPartnerInsightsGetRequest); const localVarPath = `/cra/partner_insights/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(craPartnerInsightsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ createPaymentToken: (paymentInitiationPaymentTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationPaymentTokenCreateRequest' is not null or undefined common_1.assertParamExists('createPaymentToken', 'paymentInitiationPaymentTokenCreateRequest', paymentInitiationPaymentTokenCreateRequest); const localVarPath = `/payment_initiation/payment/token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationPaymentTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `credit/asset_report/freddie_mac/get` endpoint retrieves the Asset Report in Freddie Mac\'s JSON format. * @summary Retrieve an Asset Report with Freddie Mac format. Only Freddie Mac can use this endpoint. * @param {{ [key: string]: object; }} requestBody * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditAssetReportFreddieMacGet: (requestBody, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'requestBody' is not null or undefined common_1.assertParamExists('creditAssetReportFreddieMacGet', 'requestBody', requestBody); const localVarPath = `/credit/asset_report/freddie_mac/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(requestBody, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Plaid can create an Audit Copy token of an Asset Report and/or Income Report to share with participating Government Sponsored Entity (GSE). If you participate in the Day 1 Certainty™ program, Plaid can supply an Audit Copy token directly to Fannie Mae on your behalf. An Audit Copy token contains the same underlying data as the Asset Report and/or Income Report (result of /credit/payroll_income/get). Use the `/credit/audit_copy_token/create` endpoint to create an `audit_copy_token` and then pass that token to the GSE who needs access. * @summary Create Asset or Income Report Audit Copy Token * @param {CreditAuditCopyTokenCreateRequest} creditAuditCopyTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditAuditCopyTokenCreate: (creditAuditCopyTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditAuditCopyTokenCreateRequest' is not null or undefined common_1.assertParamExists('creditAuditCopyTokenCreate', 'creditAuditCopyTokenCreateRequest', creditAuditCopyTokenCreateRequest); const localVarPath = `/credit/audit_copy_token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditAuditCopyTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/credit/audit_copy_token/update` endpoint updates an existing Audit Copy Token by adding the report tokens in the `report_tokens` field to the `audit_copy_token`. If the Audit Copy Token already contains a report of a certain type, it will be replaced with the token provided in the `report_tokens` field. * @summary Update an Audit Copy Token * @param {CreditAuditCopyTokenUpdateRequest} creditAuditCopyTokenUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditAuditCopyTokenUpdate: (creditAuditCopyTokenUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditAuditCopyTokenUpdateRequest' is not null or undefined common_1.assertParamExists('creditAuditCopyTokenUpdate', 'creditAuditCopyTokenUpdateRequest', creditAuditCopyTokenUpdateRequest); const localVarPath = `/credit/audit_copy_token/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditAuditCopyTokenUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/bank_employment/get` returns the employment report(s) derived from bank transaction data for a specified user. * @summary Retrieve information from the bank accounts used for employment verification * @param {CreditBankEmploymentGetRequest} creditBankEmploymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankEmploymentGet: (creditBankEmploymentGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditBankEmploymentGetRequest' is not null or undefined common_1.assertParamExists('creditBankEmploymentGet', 'creditBankEmploymentGetRequest', creditBankEmploymentGetRequest); const localVarPath = `/beta/credit/v1/bank_employment/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditBankEmploymentGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/bank_income/get` returns the bank income report(s) for a specified user. A single report corresponds to all institutions linked in a single Link session. To include multiple institutions in a single report, use [Multi-Item Link](https://plaid.com/docs/link/multi-item-link). To return older reports, use the `options.count` field. * @summary Retrieve information from the bank accounts used for income verification * @param {CreditBankIncomeGetRequest} creditBankIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomeGet: (creditBankIncomeGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditBankIncomeGetRequest' is not null or undefined common_1.assertParamExists('creditBankIncomeGet', 'creditBankIncomeGetRequest', creditBankIncomeGetRequest); const localVarPath = `/credit/bank_income/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditBankIncomeGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/bank_income/pdf/get` returns the most recent bank income report for a specified user in PDF format. A single report corresponds to all institutions linked in a single Link session. To include multiple institutions in a single report, use [Multi-Item Link](https://plaid.com/docs/link/multi-item-link). * @summary Retrieve information from the bank accounts used for income verification in PDF format * @param {CreditBankIncomePDFGetRequest} creditBankIncomePDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomePdfGet: (creditBankIncomePDFGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditBankIncomePDFGetRequest' is not null or undefined common_1.assertParamExists('creditBankIncomePdfGet', 'creditBankIncomePDFGetRequest', creditBankIncomePDFGetRequest); const localVarPath = `/credit/bank_income/pdf/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditBankIncomePDFGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/bank_income/refresh` refreshes the most recent bank income report data for a specific user. If the most recent bank income report is no longer valid (i.e. deleted), the endpoint will refresh the most recent valid report instead. * @summary Refresh a user\'s bank income information * @param {CreditBankIncomeRefreshRequest} creditBankIncomeRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomeRefresh: (creditBankIncomeRefreshRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditBankIncomeRefreshRequest' is not null or undefined common_1.assertParamExists('creditBankIncomeRefresh', 'creditBankIncomeRefreshRequest', creditBankIncomeRefreshRequest); const localVarPath = `/credit/bank_income/refresh`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditBankIncomeRefreshRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/bank_income/webhook/update` allows you to subscribe or unsubscribe a user for income webhook notifications. By default, all users start out unsubscribed. If a user is subscribed, on significant changes to the user\'s income profile, you will receive a `BANK_INCOME_REFRESH_UPDATE` webhook, prompting you to refresh bank income data for the user. * @summary Subscribe and unsubscribe to proactive notifications for a user\'s income profile * @param {CreditBankIncomeWebhookUpdateRequest} creditBankIncomeWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomeWebhookUpdate: (creditBankIncomeWebhookUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditBankIncomeWebhookUpdateRequest' is not null or undefined common_1.assertParamExists('creditBankIncomeWebhookUpdate', 'creditBankIncomeWebhookUpdateRequest', creditBankIncomeWebhookUpdateRequest); const localVarPath = `/credit/bank_income/webhook/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditBankIncomeWebhookUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/bank_statements/uploads/get` returns parsed data from bank statements uploaded by users as part of the Document Income flow. If your account is not enabled for Document Parsing, contact your account manager to request access. * @summary Retrieve data for a user\'s uploaded bank statements * @param {CreditBankStatementsUploadsGetRequest} creditBankStatementsUploadsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankStatementsUploadsGet: (creditBankStatementsUploadsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditBankStatementsUploadsGetRequest' is not null or undefined common_1.assertParamExists('creditBankStatementsUploadsGet', 'creditBankStatementsUploadsGetRequest', creditBankStatementsUploadsGetRequest); const localVarPath = `/credit/bank_statements/uploads/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditBankStatementsUploadsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/employment/get` returns a list of items with employment information from a user\'s payroll provider that was verified by an end user. * @summary Retrieve a summary of an individual\'s employment information * @param {CreditEmploymentGetRequest} creditEmploymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditEmploymentGet: (creditEmploymentGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditEmploymentGetRequest' is not null or undefined common_1.assertParamExists('creditEmploymentGet', 'creditEmploymentGetRequest', creditEmploymentGetRequest); const localVarPath = `/credit/employment/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditEmploymentGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `credit/asset_report/freddie_mac/get` endpoint retrieves the Verification of Assets and Verification of Employment reports. * @summary Retrieve an Asset Report with Freddie Mac format (aka VOA - Verification Of Assets), and a Verification Of Employment (VOE) report if this one is available. Only Freddie Mac can use this endpoint. * @param {CreditFreddieMacReportsGetRequest} creditFreddieMacReportsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditFreddieMacReportsGet: (creditFreddieMacReportsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditFreddieMacReportsGetRequest' is not null or undefined common_1.assertParamExists('creditFreddieMacReportsGet', 'creditFreddieMacReportsGetRequest', creditFreddieMacReportsGetRequest); const localVarPath = `/credit/freddie_mac/reports/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditFreddieMacReportsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint gets payroll income information for a specific user, either as a result of the user connecting to their payroll provider or uploading a pay related document. * @summary Retrieve a user\'s payroll information * @param {CreditPayrollIncomeGetRequest} creditPayrollIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeGet: (creditPayrollIncomeGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditPayrollIncomeGetRequest' is not null or undefined common_1.assertParamExists('creditPayrollIncomeGet', 'creditPayrollIncomeGetRequest', creditPayrollIncomeGetRequest); const localVarPath = `/credit/payroll_income/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditPayrollIncomeGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/payroll_income/parsing_config/update` updates the parsing configuration for a document income verification. * @summary Update the parsing configuration for a document income verification * @param {{ [key: string]: object; }} requestBody * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeParsingConfigUpdate: (requestBody, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'requestBody' is not null or undefined common_1.assertParamExists('creditPayrollIncomeParsingConfigUpdate', 'requestBody', requestBody); const localVarPath = `/credit/payroll_income/parsing_config/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(requestBody, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/payroll_income/precheck` is an optional endpoint that can be called before initializing a Link session for income verification. It evaluates whether a given user is supportable by digital income verification. If the user is eligible for digital verification, that information will be associated with the user token, and in this way will generate a Link UI optimized for the end user and their specific employer. If the user cannot be confirmed as eligible, the user can still use the income verification flow, but they may be required to manually upload a paystub to verify their income. While all request fields are optional, providing `employer` data will increase the chance of receiving a useful result. When testing in Sandbox, you can control the results by providing special test values in the `employer` and `access_tokens` fields. `employer_good` and `employer_bad` will result in `HIGH` and `LOW` confidence values, respectively. `employer_multi` will result in a `HIGH` confidence with multiple payroll options. Likewise, `access_good` and `access_bad` will result in `HIGH` and `LOW` confidence values, respectively. Any other value for `employer` and `access_tokens` in Sandbox will result in `UNKNOWN` confidence. * @summary Check income verification eligibility and optimize conversion * @param {CreditPayrollIncomePrecheckRequest} creditPayrollIncomePrecheckRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomePrecheck: (creditPayrollIncomePrecheckRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditPayrollIncomePrecheckRequest' is not null or undefined common_1.assertParamExists('creditPayrollIncomePrecheck', 'creditPayrollIncomePrecheckRequest', creditPayrollIncomePrecheckRequest); const localVarPath = `/credit/payroll_income/precheck`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditPayrollIncomePrecheckRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/payroll_income/refresh` refreshes a given digital payroll income verification. * @summary Refresh a digital payroll income verification * @param {CreditPayrollIncomeRefreshRequest} creditPayrollIncomeRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeRefresh: (creditPayrollIncomeRefreshRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditPayrollIncomeRefreshRequest' is not null or undefined common_1.assertParamExists('creditPayrollIncomeRefresh', 'creditPayrollIncomeRefreshRequest', creditPayrollIncomeRefreshRequest); const localVarPath = `/credit/payroll_income/refresh`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditPayrollIncomeRefreshRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/payroll_income/risk_signals/get` can be used as part of the Document Income flow to assess a user-uploaded document for signs of potential fraud or tampering. It returns a risk score for each uploaded document that indicates the likelihood of the document being fraudulent, in addition to details on the individual risk signals contributing to the score. To trigger risk signal generation for an Item, call `/link/token/create` with `parsing_config` set to include `risk_signals`, or call `/credit/payroll_income/parsing_config/update`. Once risk signal generation has been triggered, `/credit/payroll_income/risk_signals/get` can be called at any time after the `INCOME_VERIFICATION_RISK_SIGNALS` webhook has been fired. `/credit/payroll_income/risk_signals/get` is offered as an add-on to Document Income and is billed separately. To request access to this endpoint, submit a product access request or contact your Plaid account manager. * @summary Retrieve fraud insights for a user\'s manually uploaded document(s). * @param {CreditPayrollIncomeRiskSignalsGetRequest} creditPayrollIncomeRiskSignalsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeRiskSignalsGet: (creditPayrollIncomeRiskSignalsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditPayrollIncomeRiskSignalsGetRequest' is not null or undefined common_1.assertParamExists('creditPayrollIncomeRiskSignalsGet', 'creditPayrollIncomeRiskSignalsGetRequest', creditPayrollIncomeRiskSignalsGetRequest); const localVarPath = `/credit/payroll_income/risk_signals/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditPayrollIncomeRiskSignalsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Plaid can share an Asset Report directly with a participating third party on your behalf. The shared Asset Report is the exact same Asset Report originally created in `/asset_report/create`. To grant a third party access to an Asset Report, use the `/credit/relay/create` endpoint to create a `relay_token` and then pass that token to your third party. Each third party has its own `secondary_client_id`; for example, `ce5bd328dcd34123456`. You\'ll need to create a separate `relay_token` for each third party that needs access to the report on your behalf. * @summary Create a relay token to share an Asset Report with a partner client * @param {CreditRelayCreateRequest} creditRelayCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayCreate: (creditRelayCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditRelayCreateRequest' is not null or undefined common_1.assertParamExists('creditRelayCreate', 'creditRelayCreateRequest', creditRelayCreateRequest); const localVarPath = `/credit/relay/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditRelayCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/relay/get` allows third parties to receive a report that was shared with them, using a `relay_token` that was created by the report owner. * @summary Retrieve the reports associated with a relay token that was shared with you * @param {CreditRelayGetRequest} creditRelayGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayGet: (creditRelayGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditRelayGetRequest' is not null or undefined common_1.assertParamExists('creditRelayGet', 'creditRelayGetRequest', creditRelayGetRequest); const localVarPath = `/credit/relay/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditRelayGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayPdfGet: (creditRelayPDFGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditRelayPDFGetRequest' is not null or undefined common_1.assertParamExists('creditRelayPdfGet', 'creditRelayPDFGetRequest', creditRelayPDFGetRequest); const localVarPath = `/credit/relay/pdf/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditRelayPDFGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/credit/relay/refresh` endpoint allows third parties to refresh a report that was relayed to them, using a `relay_token` that was created by the report owner. A new report will be created with the original report parameters, but with the most recent data available based on the `days_requested` value of the original report. * @summary Refresh a report of a relay token * @param {CreditRelayRefreshRequest} creditRelayRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayRefresh: (creditRelayRefreshRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditRelayRefreshRequest' is not null or undefined common_1.assertParamExists('creditRelayRefresh', 'creditRelayRefreshRequest', creditRelayRefreshRequest); const localVarPath = `/credit/relay/refresh`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditRelayRefreshRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/credit/relay/remove` endpoint allows you to invalidate a `relay_token`. The third party holding the token will no longer be able to access or refresh the reports which the `relay_token` gives access to. The original report, associated Items, and other relay tokens that provide access to the same report are not affected and will remain accessible after removing the given `relay_token`. * @summary Remove relay token * @param {CreditRelayRemoveRequest} creditRelayRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayRemove: (creditRelayRemoveRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditRelayRemoveRequest' is not null or undefined common_1.assertParamExists('creditRelayRemove', 'creditRelayRemoveRequest', creditRelayRemoveRequest); const localVarPath = `/credit/relay/remove`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditRelayRemoveRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/credit/audit_copy_token/remove` endpoint allows you to remove an Audit Copy. Removing an Audit Copy invalidates the `audit_copy_token` associated with it, meaning both you and any third parties holding the token will no longer be able to use it to access Report data. Items associated with the Report data and other Audit Copies of it are not affected and will remain accessible after removing the given Audit Copy. * @summary Remove an Audit Copy token * @param {CreditAuditCopyTokenRemoveRequest} creditAuditCopyTokenRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditReportAuditCopyRemove: (creditAuditCopyTokenRemoveRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditAuditCopyTokenRemoveRequest' is not null or undefined common_1.assertParamExists('creditReportAuditCopyRemove', 'creditAuditCopyTokenRemoveRequest', creditAuditCopyTokenRemoveRequest); const localVarPath = `/credit/audit_copy_token/remove`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditAuditCopyTokenRemoveRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint can be used for your end users after they complete the Link flow. This endpoint returns a list of Link sessions that your user completed, where each session includes the results from the Link flow. These results include details about the Item that was created and some product related metadata (showing, for example, whether the user finished the bank income verification step). * @summary Retrieve Link sessions for your user * @param {CreditSessionsGetRequest} creditSessionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditSessionsGet: (creditSessionsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'creditSessionsGetRequest' is not null or undefined common_1.assertParamExists('creditSessionsGet', 'creditSessionsGetRequest', creditSessionsGetRequest); const localVarPath = `/credit/sessions/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(creditSessionsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/dashboard_user/get` endpoint provides details (such as email address) about a specific Dashboard user based on the `dashboard_user_id` field, which is returned in the `audit_trail` object of certain Monitor and Beacon endpoints. This can be used to identify the specific reviewer who performed a Dashboard action. * @summary Retrieve a dashboard user * @param {DashboardUserGetRequest} dashboardUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ dashboardUserGet: (dashboardUserGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'dashboardUserGetRequest' is not null or undefined common_1.assertParamExists('dashboardUserGet', 'dashboardUserGetRequest', dashboardUserGetRequest); const localVarPath = `/dashboard_user/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(dashboardUserGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/dashboard_user/list` endpoint provides details (such as email address) all Dashboard users associated with your account. This can use used to audit or track the list of reviewers for Monitor, Beacon, and Identity Verification products. * @summary List dashboard users * @param {DashboardUserListRequest} dashboardUserListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ dashboardUserList: (dashboardUserListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'dashboardUserListRequest' is not null or undefined common_1.assertParamExists('dashboardUserList', 'dashboardUserListRequest', dashboardUserListRequest); const localVarPath = `/dashboard_user/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(dashboardUserListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint provides an alternative to `/deposit_switch/create` for customers who have not yet fully integrated with Plaid Exchange. Like `/deposit_switch/create`, it creates a deposit switch entity that will be persisted throughout the lifecycle of the switch. * @summary (Deprecated) Create a deposit switch without using Plaid Exchange * @param {DepositSwitchAltCreateRequest} depositSwitchAltCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchAltCreate: (depositSwitchAltCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'depositSwitchAltCreateRequest' is not null or undefined common_1.assertParamExists('depositSwitchAltCreate', 'depositSwitchAltCreateRequest', depositSwitchAltCreateRequest); const localVarPath = `/deposit_switch/alt/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(depositSwitchAltCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint creates a deposit switch entity that will be persisted throughout the lifecycle of the switch. * @summary (Deprecated) Create a deposit switch * @param {DepositSwitchCreateRequest} depositSwitchCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchCreate: (depositSwitchCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'depositSwitchCreateRequest' is not null or undefined common_1.assertParamExists('depositSwitchCreate', 'depositSwitchCreateRequest', depositSwitchCreateRequest); const localVarPath = `/deposit_switch/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(depositSwitchCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint returns information related to how the user has configured their payroll allocation and the state of the switch. You can use this information to build logic related to the user\'s direct deposit allocation preferences. * @summary (Deprecated) Retrieve a deposit switch * @param {DepositSwitchGetRequest} depositSwitchGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchGet: (depositSwitchGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'depositSwitchGetRequest' is not null or undefined common_1.assertParamExists('depositSwitchGet', 'depositSwitchGetRequest', depositSwitchGetRequest); const localVarPath = `/deposit_switch/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(depositSwitchGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * In order for the end user to take action, you will need to create a public token representing the deposit switch. This token is used to initialize Link. It can be used one time and expires after 30 minutes. * @summary (Deprecated) Create a deposit switch token * @param {DepositSwitchTokenCreateRequest} depositSwitchTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchTokenCreate: (depositSwitchTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'depositSwitchTokenCreateRequest' is not null or undefined common_1.assertParamExists('depositSwitchTokenCreate', 'depositSwitchTokenCreateRequest', depositSwitchTokenCreateRequest); const localVarPath = `/deposit_switch/token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(depositSwitchTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/employers/search` allows you the ability to search Plaid’s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. * @summary Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ employersSearch: (employersSearchRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'employersSearchRequest' is not null or undefined common_1.assertParamExists('employersSearch', 'employersSearchRequest', employersSearchRequest); const localVarPath = `/employers/search`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(employersSearchRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/employment/verification/get` returns a list of employments through a user payroll that was verified by an end user. This endpoint has been deprecated; new integrations should use `/credit/employment/get` instead. * @summary (Deprecated) Retrieve a summary of an individual\'s employment information * @param {EmploymentVerificationGetRequest} employmentVerificationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ employmentVerificationGet: (employmentVerificationGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'employmentVerificationGetRequest' is not null or undefined common_1.assertParamExists('employmentVerificationGet', 'employmentVerificationGetRequest', employmentVerificationGetRequest); const localVarPath = `/employment/verification/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(employmentVerificationGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * A generic webhook receiver endpoint for FDX Event Notifications * @summary Webhook receiver for fdx notifications * @param {FDXNotification} fDXNotification * @param {*} [options] Override http request option. * @throws {RequiredError} */ fdxNotifications: (fDXNotification, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'fDXNotification' is not null or undefined common_1.assertParamExists('fdxNotifications', 'fDXNotification', fDXNotification); const localVarPath = `/fdx/notifications`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(fDXNotification, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Get a specific recipient * @summary Get Recipient * @param {string} recipientId Recipient Identifier. Uniquely identifies the recipient * @param {string} [oAUTHSTATEID] The value that is passed into the OAuth URI \'state\' query parameter. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRecipient: (recipientId, oAUTHSTATEID, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'recipientId' is not null or undefined common_1.assertParamExists('getRecipient', 'recipientId', recipientId); const localVarPath = `/fdx/recipient/{recipientId}` .replace(`{${"recipientId"}}`, encodeURIComponent(String(recipientId))); // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'GET' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); if (oAUTHSTATEID !== undefined && oAUTHSTATEID !== null) { localVarHeaderParameter['OAUTH-STATE-ID'] = String(oAUTHSTATEID); } common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Returns a list of Recipients * @summary Get Recipients * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRecipients: (options = {}) => __awaiter(this, void 0, void 0, function* () { const localVarPath = `/fdx/recipients`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'GET' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use `/identity/documents/uploads/get` to retrieve identity details when using [Identity Document Upload](https://plaid.com/docs/identity/identity-document-upload/). * @summary Returns uploaded document identity * @param {IdentityDocumentsUploadsGetRequest} identityDocumentsUploadsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityDocumentsUploadsGet: (identityDocumentsUploadsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'identityDocumentsUploadsGetRequest' is not null or undefined common_1.assertParamExists('identityDocumentsUploadsGet', 'identityDocumentsUploadsGetRequest', identityDocumentsUploadsGetRequest); const localVarPath = `/identity/documents/uploads/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(identityDocumentsUploadsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/identity/get` endpoint allows you to retrieve various account holder information on file with the financial institution, including names, emails, phone numbers, and addresses. Only name data is guaranteed to be returned; other fields will be empty arrays if not provided by the institution. Note: In API versions 2018-05-22 and earlier, the `owners` object is not returned, and instead identity information is returned in the top level `identity` object. For more details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2019-05-29). * @summary Retrieve identity data * @param {IdentityGetRequest} identityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityGet: (identityGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'identityGetRequest' is not null or undefined common_1.assertParamExists('identityGet', 'identityGetRequest', identityGetRequest); const localVarPath = `/identity/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(identityGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. * @summary Retrieve identity match score * @param {IdentityMatchRequest} identityMatchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityMatch: (identityMatchRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'identityMatchRequest' is not null or undefined common_1.assertParamExists('identityMatch', 'identityMatchRequest', identityMatchRequest); const localVarPath = `/identity/match`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(identityMatchRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/identity/refresh` is an optional endpoint for users of the Identity product. It initiates an on-demand extraction to fetch the most up to date Identity information from the Financial Institution. This on-demand extraction takes place in addition to the periodic extractions that automatically occur for any Identity-enabled Item. If changes to Identity are discovered after calling `/identity/refresh`, Plaid will fire a webhook [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/identity/#default_update). As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/identity/refresh` is offered as an add-on to Identity and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh identity data * @param {IdentityRefreshRequest} identityRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityRefresh: (identityRefreshRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'identityRefreshRequest' is not null or undefined common_1.assertParamExists('identityRefresh', 'identityRefreshRequest', identityRefreshRequest); const localVarPath = `/identity/refresh`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(identityRefreshRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. * @summary Create autofill for an Identity Verification * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationAutofillCreate: (identityVerificationAutofillCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'identityVerificationAutofillCreateRequest' is not null or undefined common_1.assertParamExists('identityVerificationAutofillCreate', 'identityVerificationAutofillCreateRequest', identityVerificationAutofillCreateRequest); const localVarPath = `/identity_verification/autofill/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(identityVerificationAutofillCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationCreate: (identityVerificationCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'identityVerificationCreateRequest' is not null or undefined common_1.assertParamExists('identityVerificationCreate', 'identityVerificationCreateRequest', identityVerificationCreateRequest); const localVarPath = `/identity_verification/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(identityVerificationCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationGet: (identityVerificationGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'identityVerificationGetRequest' is not null or undefined common_1.assertParamExists('identityVerificationGet', 'identityVerificationGetRequest', identityVerificationGetRequest); const localVarPath = `/identity_verification/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(identityVerificationGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Filter and list Identity Verifications created by your account * @summary List Identity Verifications * @param {IdentityVerificationListRequest} identityVerificationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationList: (identityVerificationListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'identityVerificationListRequest' is not null or undefined common_1.assertParamExists('identityVerificationList', 'identityVerificationListRequest', identityVerificationListRequest); const localVarPath = `/identity_verification/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(identityVerificationListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationRetry: (identityVerificationRetryRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'identityVerificationRetryRequest' is not null or undefined common_1.assertParamExists('identityVerificationRetry', 'identityVerificationRetryRequest', identityVerificationRetryRequest); const localVarPath = `/identity_verification/retry`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(identityVerificationRetryRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/income/verification/create` begins the income verification process by returning an `income_verification_id`. You can then provide the `income_verification_id` to `/link/token/create` under the `income_verification` parameter in order to create a Link instance that will prompt the user to go through the income verification flow. Plaid will fire an `INCOME` webhook once the user completes the Payroll Income flow, or when the uploaded documents in the Document Income flow have finished processing. * @summary (Deprecated) Create an income verification instance * @param {IncomeVerificationCreateRequest} incomeVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationCreate: (incomeVerificationCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'incomeVerificationCreateRequest' is not null or undefined common_1.assertParamExists('incomeVerificationCreate', 'incomeVerificationCreateRequest', incomeVerificationCreateRequest); const localVarPath = `/income/verification/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(incomeVerificationCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/income/verification/documents/download` provides the ability to download the source documents associated with the verification. If Document Income was used, the documents will be those the user provided in Link. For Payroll Income, the most recent files available for download from the payroll provider will be available from this endpoint. The response to `/income/verification/documents/download` is a ZIP file in binary data. If a `document_id` is passed, a single document will be contained in this file. If not, the response will contain all documents associated with the verification. The `request_id` is returned in the `Plaid-Request-ID` header. * @summary (Deprecated) Download the original documents used for income verification * @param {IncomeVerificationDocumentsDownloadRequest} incomeVerificationDocumentsDownloadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationDocumentsDownload: (incomeVerificationDocumentsDownloadRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'incomeVerificationDocumentsDownloadRequest' is not null or undefined common_1.assertParamExists('incomeVerificationDocumentsDownload', 'incomeVerificationDocumentsDownloadRequest', incomeVerificationDocumentsDownloadRequest); const localVarPath = `/income/verification/documents/download`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(incomeVerificationDocumentsDownloadRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/income/verification/paystubs/get` returns the information collected from the paystubs that were used to verify an end user\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/get` instead. * @summary (Deprecated) Retrieve information from the paystubs used for income verification * @param {IncomeVerificationPaystubsGetRequest} incomeVerificationPaystubsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationPaystubsGet: (incomeVerificationPaystubsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'incomeVerificationPaystubsGetRequest' is not null or undefined common_1.assertParamExists('incomeVerificationPaystubsGet', 'incomeVerificationPaystubsGetRequest', incomeVerificationPaystubsGetRequest); const localVarPath = `/income/verification/paystubs/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(incomeVerificationPaystubsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/income/verification/precheck` is an optional endpoint that can be called before initializing a Link session for income verification. It evaluates whether a given user is supportable by digital income verification and returns a `precheck_id` that can be provided to `/link/token/create`. If the user is eligible for digital verification, providing the `precheck_id` in this way will generate a Link UI optimized for the end user and their specific employer. If the user cannot be confirmed as eligible, the `precheck_id` can still be provided to `/link/token/create` and the user can still use the income verification flow, but they may be required to manually upload a paystub to verify their income. While all request fields are optional, providing either `employer` or `transactions_access_tokens` data will increase the chance of receiving a useful result. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/precheck` instead. * @summary (Deprecated) Check digital income verification eligibility and optimize conversion * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationPrecheck: (incomeVerificationPrecheckRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'incomeVerificationPrecheckRequest' is not null or undefined common_1.assertParamExists('incomeVerificationPrecheck', 'incomeVerificationPrecheckRequest', incomeVerificationPrecheckRequest); const localVarPath = `/income/verification/precheck`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(incomeVerificationPrecheckRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/income/verification/taxforms/get` returns the information collected from forms that were used to verify an end user\'\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/get` instead. * @summary (Deprecated) Retrieve information from the tax documents used for income verification * @param {IncomeVerificationTaxformsGetRequest} incomeVerificationTaxformsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationTaxformsGet: (incomeVerificationTaxformsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'incomeVerificationTaxformsGetRequest' is not null or undefined common_1.assertParamExists('incomeVerificationTaxformsGet', 'incomeVerificationTaxformsGetRequest', incomeVerificationTaxformsGetRequest); const localVarPath = `/income/verification/taxforms/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(incomeVerificationTaxformsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Returns a JSON response containing details on all financial institutions currently supported by Plaid. Because Plaid supports thousands of institutions, results are paginated. If there is no overlap between an institution’s enabled products and a client’s enabled products, then the institution will be filtered out from the response. As a result, the number of institutions returned may not match the count specified in the call. * @summary Get details of all supported institutions * @param {InstitutionsGetRequest} institutionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ institutionsGet: (institutionsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'institutionsGetRequest' is not null or undefined common_1.assertParamExists('institutionsGet', 'institutionsGetRequest', institutionsGetRequest); const localVarPath = `/institutions/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(institutionsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Returns a JSON response containing details on a specified financial institution currently supported by Plaid. Versioning note: API versions 2019-05-29 and earlier allow use of the `public_key` parameter instead of the `client_id` and `secret` to authenticate to this endpoint. The `public_key` has been deprecated; all customers are encouraged to use `client_id` and `secret` instead. * @summary Get details of an institution * @param {InstitutionsGetByIdRequest} institutionsGetByIdRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ institutionsGetById: (institutionsGetByIdRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'institutionsGetByIdRequest' is not null or undefined common_1.assertParamExists('institutionsGetById', 'institutionsGetByIdRequest', institutionsGetByIdRequest); const localVarPath = `/institutions/get_by_id`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(institutionsGetByIdRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Returns a JSON response containing details for institutions that match the query parameters, up to a maximum of ten institutions per query. Versioning note: API versions 2019-05-29 and earlier allow use of the `public_key` parameter instead of the `client_id` and `secret` parameters to authenticate to this endpoint. The `public_key` parameter has since been deprecated; all customers are encouraged to use `client_id` and `secret` instead. * @summary Search institutions * @param {InstitutionsSearchRequest} institutionsSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ institutionsSearch: (institutionsSearchRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'institutionsSearchRequest' is not null or undefined common_1.assertParamExists('institutionsSearch', 'institutionsSearchRequest', institutionsSearchRequest); const localVarPath = `/institutions/search`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(institutionsSearchRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/investments/auth/get` endpoint allows developers to receive user-authorized data to facilitate the transfer of holdings * @summary Get data needed to authorize an investments transfer * @param {InvestmentsAuthGetRequest} investmentsAuthGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsAuthGet: (investmentsAuthGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'investmentsAuthGetRequest' is not null or undefined common_1.assertParamExists('investmentsAuthGet', 'investmentsAuthGetRequest', investmentsAuthGetRequest); const localVarPath = `/investments/auth/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(investmentsAuthGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/investments/holdings/get` endpoint allows developers to receive user-authorized stock position data for `investment`-type accounts. * @summary Get Investment holdings * @param {InvestmentsHoldingsGetRequest} investmentsHoldingsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsHoldingsGet: (investmentsHoldingsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'investmentsHoldingsGetRequest' is not null or undefined common_1.assertParamExists('investmentsHoldingsGet', 'investmentsHoldingsGetRequest', investmentsHoldingsGetRequest); const localVarPath = `/investments/holdings/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(investmentsHoldingsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/investments/refresh` is an optional endpoint for users of the Investments product. It initiates an on-demand extraction to fetch the newest investment holdings and transactions for an Item. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Investments-enabled Item. If changes to investments are discovered after calling `/investments/refresh`, Plaid will fire webhooks: [`HOLDINGS: DEFAULT_UPDATE`](https://plaid.com/docs/api/products/investments/#holdings-default_update) if any new holdings are detected, and [`INVESTMENTS_TRANSACTIONS: DEFAULT_UPDATE`](https://plaid.com/docs/api/products/investments/#investments_transactions-default_update) if any new investment transactions are detected. This webhook will typically not fire in the Sandbox environment, due to the lack of dynamic investment transactions and holdings data. To test this webhook in Sandbox, call `/sandbox/item/fire_webhook`. Updated holdings and investment transactions can be fetched by calling `/investments/holdings/get` and `/investments/transactions/get`. Note that the `/investments/refresh` endpoint is not supported by all institutions. If called on an Item from an institution that does not support this functionality, it will return a `PRODUCT_NOT_SUPPORTED` error. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/investments/refresh` is offered as an add-on to Investments and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh investment data * @param {InvestmentsRefreshRequest} investmentsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsRefresh: (investmentsRefreshRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'investmentsRefreshRequest' is not null or undefined common_1.assertParamExists('investmentsRefresh', 'investmentsRefreshRequest', investmentsRefreshRequest); const localVarPath = `/investments/refresh`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(investmentsRefreshRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/investments/transactions/get` endpoint allows developers to retrieve up to 24 months of user-authorized transaction data for investment accounts. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Due to the potentially large number of investment transactions associated with an Item, results are paginated. Manipulate the count and offset parameters in conjunction with the `total_investment_transactions` response body field to fetch all available investment transactions. Note that Investments does not have a webhook to indicate when initial transaction data has loaded (unless you use the `async_update` option). Instead, if transactions data is not ready when `/investments/transactions/get` is first called, Plaid will wait for the data. For this reason, calling `/investments/transactions/get` immediately after Link may take up to one to two minutes to return. Data returned by the asynchronous investments extraction flow (when `async_update` is set to true) may not be immediately available to `/investments/transactions/get`. To be alerted when the data is ready to be fetched, listen for the `HISTORICAL_UPDATE` webhook. If no investments history is ready when `/investments/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get investment transactions * @param {InvestmentsTransactionsGetRequest} investmentsTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsTransactionsGet: (investmentsTransactionsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'investmentsTransactionsGetRequest' is not null or undefined common_1.assertParamExists('investmentsTransactionsGet', 'investmentsTransactionsGetRequest', investmentsTransactionsGetRequest); const localVarPath = `/investments/transactions/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(investmentsTransactionsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Retrieve detailed information about a specific `Issue`. This endpoint returns a single `Issue` object. * @summary Get an Issue * @param {IssuesGetRequest} issuesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ issuesGet: (issuesGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'issuesGetRequest' is not null or undefined common_1.assertParamExists('issuesGet', 'issuesGetRequest', issuesGetRequest); const localVarPath = `/issues/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(issuesGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Search for an issue associated with one of the following identifiers: `item_id`, `link_session_id` or Link session `request_id`. This endpoint returns a list of `Issue` objects, with an empty list indicating that no issues are associated with the provided identifier. At least one of the identifiers must be provided to perform the search. * @summary Search for an Issue * @param {IssuesSearchRequest} issuesSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ issuesSearch: (issuesSearchRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'issuesSearchRequest' is not null or undefined common_1.assertParamExists('issuesSearch', 'issuesSearchRequest', issuesSearchRequest); const localVarPath = `/issues/search`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(issuesSearchRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Allows a user to subscribe to updates on a specific `Issue` using a POST method. Subscribers will receive webhook notifications when the issue status changes, particularly when resolved. * @summary Subscribe to an Issue * @param {IssuesSubscribeRequest} issuesSubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ issuesSubscribe: (issuesSubscribeRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'issuesSubscribeRequest' is not null or undefined common_1.assertParamExists('issuesSubscribe', 'issuesSubscribeRequest', issuesSubscribeRequest); const localVarPath = `/issues/subscribe`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(issuesSubscribeRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * By default, the `access_token` associated with an Item does not expire and should be stored in a persistent, secure manner. You can use the `/item/access_token/invalidate` endpoint to rotate the `access_token` associated with an Item. The endpoint returns a new `access_token` and immediately invalidates the previous `access_token`. * @summary Invalidate access_token * @param {ItemAccessTokenInvalidateRequest} itemAccessTokenInvalidateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemAccessTokenInvalidate: (itemAccessTokenInvalidateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemAccessTokenInvalidateRequest' is not null or undefined common_1.assertParamExists('itemAccessTokenInvalidate', 'itemAccessTokenInvalidateRequest', itemAccessTokenInvalidateRequest); const localVarPath = `/item/access_token/invalidate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemAccessTokenInvalidateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List a historical log of user consent events * @summary List a historical log of user consent events * @param {ItemActivityListRequest} itemActivityListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemActivityList: (itemActivityListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemActivityListRequest' is not null or undefined common_1.assertParamExists('itemActivityList', 'itemActivityListRequest', itemActivityListRequest); const localVarPath = `/item/activity/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemActivityListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List a user’s connected applications * @summary List a user’s connected applications * @param {ItemApplicationListRequest} itemApplicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemApplicationList: (itemApplicationListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemApplicationListRequest' is not null or undefined common_1.assertParamExists('itemApplicationList', 'itemApplicationListRequest', itemApplicationListRequest); const localVarPath = `/item/application/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemApplicationListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Enable consumers to update product access on selected accounts for an application. * @summary Update the scopes of access for a particular application * @param {ItemApplicationScopesUpdateRequest} itemApplicationScopesUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemApplicationScopesUpdate: (itemApplicationScopesUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemApplicationScopesUpdateRequest' is not null or undefined common_1.assertParamExists('itemApplicationScopesUpdate', 'itemApplicationScopesUpdateRequest', itemApplicationScopesUpdateRequest); const localVarPath = `/item/application/scopes/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemApplicationScopesUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Unlink a user’s connected application. On an unlink request, Plaid will immediately revoke the Application’s access to the User’s data. The User will have to redo the OAuth authentication process in order to restore functionality. This endpoint only removes ongoing data access permissions, therefore the User will need to reach out to the Application itself in order to disable and delete their account and delete any data that the Application already received (if the Application does not do so by default). This endpoint should be called in real time as the User is unlinking an Application, and should not be batched in order to ensure that the change is reflected as soon as possible. * @summary Unlink a user’s connected application * @param {ItemApplicationUnlinkRequest} itemApplicationUnlinkRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemApplicationUnlink: (itemApplicationUnlinkRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemApplicationUnlinkRequest' is not null or undefined common_1.assertParamExists('itemApplicationUnlink', 'itemApplicationUnlinkRequest', itemApplicationUnlinkRequest); const localVarPath = `/item/application/unlink`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemApplicationUnlinkRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. * @summary Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemCreatePublicToken: (itemPublicTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemPublicTokenCreateRequest' is not null or undefined common_1.assertParamExists('itemCreatePublicToken', 'itemPublicTokenCreateRequest', itemPublicTokenCreateRequest); const localVarPath = `/item/public_token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemPublicTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Returns information about the status of an Item. * @summary Retrieve an Item * @param {ItemGetRequest} itemGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemGet: (itemGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemGetRequest' is not null or undefined common_1.assertParamExists('itemGet', 'itemGetRequest', itemGetRequest); const localVarPath = `/item/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/item/import` creates an Item via your Plaid Exchange Integration and returns an `access_token`. As part of an `/item/import` request, you will include a User ID (`user_auth.user_id`) and Authentication Token (`user_auth.auth_token`) that enable data aggregation through your Plaid Exchange API endpoints. These authentication principals are to be chosen by you. Upon creating an Item via `/item/import`, Plaid will automatically begin an extraction of that Item through the Plaid Exchange infrastructure you have already integrated. * @summary Import Item * @param {ItemImportRequest} itemImportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemImport: (itemImportRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemImportRequest' is not null or undefined common_1.assertParamExists('itemImport', 'itemImportRequest', itemImportRequest); const localVarPath = `/item/import`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemImportRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Exchange a Link `public_token` for an API `access_token`. Link hands off the `public_token` client-side via the `onSuccess` callback once a user has successfully created an Item. The `public_token` is ephemeral and expires after 30 minutes. An `access_token` does not expire, but can be revoked by calling `/item/remove`. The response also includes an `item_id` that should be stored with the `access_token`. The `item_id` is used to identify an Item in a webhook. The `item_id` can also be retrieved by making an `/item/get` request. * @summary Exchange public token for an access token * @param {ItemPublicTokenExchangeRequest} itemPublicTokenExchangeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemPublicTokenExchange: (itemPublicTokenExchangeRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemPublicTokenExchangeRequest' is not null or undefined common_1.assertParamExists('itemPublicTokenExchange', 'itemPublicTokenExchangeRequest', itemPublicTokenExchangeRequest); const localVarPath = `/item/public_token/exchange`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemPublicTokenExchangeRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/item/remove` endpoint allows you to remove an Item. Once removed, the `access_token`, as well as any processor tokens or bank account tokens associated with the Item, is no longer valid and cannot be used to access any data that was associated with the Item. Calling `/item/remove` is a recommended best practice when offboarding users or if a user chooses to disconnect an account linked via Plaid. For subscription products, such as Transactions, Liabilities, and Investments, calling `/item/remove` is required to end subscription billing for the Item. For money movement products such as Auth and Transfer, if the Item is at an institution that uses Tokenized Account Numbers (TANs), such as Chase or PNC, calling `/item/remove` will invalidate the TAN, and subsequent ACH transfer attempts using that TAN will be returned. In Limited Production, calling `/item/remove` does not impact the number of remaining Limited Production Items you have available. Removing an Item does not affect any Asset Reports or Audit Copies you have already created, which will remain accessible until you remove access to them specifically using the `/asset_report/remove` endpoint. Also note that for certain OAuth-based institutions, an Item removed via `/item/remove` may still show as an active connection in the institution\'s OAuth permission manager. API versions 2019-05-29 and earlier return a `removed` boolean as part of the response. * @summary Remove an Item * @param {ItemRemoveRequest} itemRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemRemove: (itemRemoveRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemRemoveRequest' is not null or undefined common_1.assertParamExists('itemRemove', 'itemRemoveRequest', itemRemoveRequest); const localVarPath = `/item/remove`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemRemoveRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The POST `/item/webhook/update` allows you to update the webhook URL associated with an Item. This request triggers a [`WEBHOOK_UPDATE_ACKNOWLEDGED`](https://plaid.com/docs/api/items/#webhook_update_acknowledged) webhook to the newly specified webhook URL. * @summary Update Webhook URL * @param {ItemWebhookUpdateRequest} itemWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemWebhookUpdate: (itemWebhookUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'itemWebhookUpdateRequest' is not null or undefined common_1.assertParamExists('itemWebhookUpdate', 'itemWebhookUpdateRequest', itemWebhookUpdateRequest); const localVarPath = `/item/webhook/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(itemWebhookUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/liabilities/get` endpoint returns various details about an Item with loan or credit accounts. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. To limit accounts listed in Link to types and subtypes supported by Liabilities, you can use the `account_filters` parameter when [creating a Link token](https://plaid.com/docs/api/link/#linktokencreate). The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/liabilities/get`. * @summary Retrieve Liabilities data * @param {LiabilitiesGetRequest} liabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ liabilitiesGet: (liabilitiesGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'liabilitiesGetRequest' is not null or undefined common_1.assertParamExists('liabilitiesGet', 'liabilitiesGetRequest', liabilitiesGetRequest); const localVarPath = `/liabilities/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(liabilitiesGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/link_delivery/create` endpoint to create a Hosted Link session. * @summary Create Hosted Link session * @param {LinkDeliveryCreateRequest} linkDeliveryCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkDeliveryCreate: (linkDeliveryCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'linkDeliveryCreateRequest' is not null or undefined common_1.assertParamExists('linkDeliveryCreate', 'linkDeliveryCreateRequest', linkDeliveryCreateRequest); const localVarPath = `/link_delivery/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(linkDeliveryCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/link_delivery/get` endpoint to get the status of a Hosted Link session. * @summary Get Hosted Link session * @param {LinkDeliveryGetRequest} linkDeliveryGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkDeliveryGet: (linkDeliveryGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'linkDeliveryGetRequest' is not null or undefined common_1.assertParamExists('linkDeliveryGet', 'linkDeliveryGetRequest', linkDeliveryGetRequest); const localVarPath = `/link_delivery/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(linkDeliveryGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Exchange an OAuth `link_correlation_id` for the corresponding `link_token`. The `link_correlation_id` is only available for \'payment_initiation\' products and is provided to the client via the OAuth `redirect_uri` as a query parameter. The `link_correlation_id` is ephemeral and expires in a brief period, after which it can no longer be exchanged for the \'link_token\'. * @summary Exchange the Link Correlation Id for a Link Token * @param {LinkOAuthCorrelationIdExchangeRequest} linkOAuthCorrelationIdExchangeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkOauthCorrelationIdExchange: (linkOAuthCorrelationIdExchangeRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'linkOAuthCorrelationIdExchangeRequest' is not null or undefined common_1.assertParamExists('linkOauthCorrelationIdExchange', 'linkOAuthCorrelationIdExchangeRequest', linkOAuthCorrelationIdExchangeRequest); const localVarPath = `/link/oauth/correlation_id/exchange`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(linkOAuthCorrelationIdExchangeRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/link/token/create` endpoint creates a `link_token`, which is required as a parameter when initializing Link. Once Link has been initialized, it returns a `public_token`. For most Plaid products, the `public_token` is saved and exchanged for an `access_token` via `/item/public_token/exchange` as part of the main Link flow. For more details, see the [Link flow overview](https://plaid.com/docs/link/#link-flow-overview). A `link_token` generated by `/link/token/create` is also used to initialize other Link flows, such as the [update mode](https://plaid.com/docs/link/update-mode) flow for tokens with expired credentials, or the Identity Verification flow. * @summary Create Link Token * @param {LinkTokenCreateRequest} linkTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkTokenCreate: (linkTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'linkTokenCreateRequest' is not null or undefined common_1.assertParamExists('linkTokenCreate', 'linkTokenCreateRequest', linkTokenCreateRequest); const localVarPath = `/link/token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(linkTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/link/token/get` endpoint gets information about a Link session, including all callbacks fired during the session along with their metadata, including the public token. This endpoint is used with Link flows that don\'t provide a public token via frontend callbacks, such as the [Hosted Link flow](https://plaid.com/docs/link/hosted-link/) and the [Multi-Item Link flow](https://plaid.com/docs/link/multi-item-link/). It also can be useful for debugging purposes. * @summary Get Link Token * @param {LinkTokenGetRequest} linkTokenGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkTokenGet: (linkTokenGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'linkTokenGetRequest' is not null or undefined common_1.assertParamExists('linkTokenGet', 'linkTokenGetRequest', linkTokenGetRequest); const localVarPath = `/link/token/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(linkTokenGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint allows you to retrieve the Network Insights from a list of `access_tokens`. * @summary Retrieve network insights for the provided `access_tokens` * @param {NetworkInsightsReportGetRequest} networkInsightsReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ networkInsightsReportGet: (networkInsightsReportGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'networkInsightsReportGetRequest' is not null or undefined common_1.assertParamExists('networkInsightsReportGet', 'networkInsightsReportGetRequest', networkInsightsReportGetRequest); const localVarPath = `/network_insights/report/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(networkInsightsReportGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/network/status/get` endpoint can be used to check whether Plaid has a matching profile for the user. This is useful for determining if a user is eligible for a streamlined experience, such as Layer. Note: it is strongly recommended to check for Layer eligibility in the frontend. `/network/status/get` should only be used for checking Layer eligibility if a frontend check is not possible for your use case. For instructions on performing a frontend eligibility check, see the [Layer documentation](https://plaid.com/docs/layer/#integration-overview). * @summary Check a user\'s Plaid Network status * @param {NetworkStatusGetRequest} networkStatusGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ networkStatusGet: (networkStatusGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'networkStatusGetRequest' is not null or undefined common_1.assertParamExists('networkStatusGet', 'networkStatusGetRequest', networkStatusGetRequest); const localVarPath = `/network/status/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(networkStatusGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/partner/customer/create` endpoint is used by reseller partners to create end customers. To create end customers, it should be called in the Production environment only, even when creating Sandbox API keys. If called in the Sandbox environment, it will return a sample response, but no customer will be created and the API keys will not be valid. * @summary Creates a new end customer for a Plaid reseller. * @param {PartnerCustomerCreateRequest} partnerCustomerCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerCreate: (partnerCustomerCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'partnerCustomerCreateRequest' is not null or undefined common_1.assertParamExists('partnerCustomerCreate', 'partnerCustomerCreateRequest', partnerCustomerCreateRequest); const localVarPath = `/partner/customer/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(partnerCustomerCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/partner/customer/enable` endpoint is used by reseller partners to enable an end customer in the full Production environment. * @summary Enables a Plaid reseller\'s end customer in the Production environment. * @param {PartnerCustomerEnableRequest} partnerCustomerEnableRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerEnable: (partnerCustomerEnableRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'partnerCustomerEnableRequest' is not null or undefined common_1.assertParamExists('partnerCustomerEnable', 'partnerCustomerEnableRequest', partnerCustomerEnableRequest); const localVarPath = `/partner/customer/enable`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(partnerCustomerEnableRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/partner/customer/get` endpoint is used by reseller partners to retrieve data about a single end customer. * @summary Returns a Plaid reseller\'s end customer. * @param {PartnerCustomerGetRequest} partnerCustomerGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerGet: (partnerCustomerGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'partnerCustomerGetRequest' is not null or undefined common_1.assertParamExists('partnerCustomerGet', 'partnerCustomerGetRequest', partnerCustomerGetRequest); const localVarPath = `/partner/customer/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(partnerCustomerGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/partner/customer/oauth_institutions/get` endpoint is used by reseller partners to retrieve OAuth-institution registration information about a single end customer. To learn how to set up a webhook to listen to status update events, visit the [reseller documentation](https://plaid.com/docs/account/resellers/#enabling-end-customers). * @summary Returns OAuth-institution registration information for a given end customer. * @param {PartnerCustomerOAuthInstitutionsGetRequest} partnerCustomerOAuthInstitutionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerOauthInstitutionsGet: (partnerCustomerOAuthInstitutionsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'partnerCustomerOAuthInstitutionsGetRequest' is not null or undefined common_1.assertParamExists('partnerCustomerOauthInstitutionsGet', 'partnerCustomerOAuthInstitutionsGetRequest', partnerCustomerOAuthInstitutionsGetRequest); const localVarPath = `/partner/customer/oauth_institutions/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(partnerCustomerOAuthInstitutionsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/partner/customer/remove` endpoint is used by reseller partners to remove an end customer. Removing an end customer will remove it from view in the Plaid Dashboard and deactivate its API keys. This endpoint can only be used to remove an end customer that has not yet been enabled in full Production. * @summary Removes a Plaid reseller\'s end customer. * @param {PartnerCustomerRemoveRequest} partnerCustomerRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerRemove: (partnerCustomerRemoveRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'partnerCustomerRemoveRequest' is not null or undefined common_1.assertParamExists('partnerCustomerRemove', 'partnerCustomerRemoveRequest', partnerCustomerRemoveRequest); const localVarPath = `/partner/customer/remove`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(partnerCustomerRemoveRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/payment_initiation/consent/create` endpoint is used to create a payment consent, which can be used to initiate payments on behalf of the user. Payment consents are created with `UNAUTHORISED` status by default and must be authorised by the user before payments can be initiated. Consents can be limited in time and scope, and have constraints that describe limitations for payments. * @summary Create payment consent * @param {PaymentInitiationConsentCreateRequest} paymentInitiationConsentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentCreate: (paymentInitiationConsentCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationConsentCreateRequest' is not null or undefined common_1.assertParamExists('paymentInitiationConsentCreate', 'paymentInitiationConsentCreateRequest', paymentInitiationConsentCreateRequest); const localVarPath = `/payment_initiation/consent/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationConsentCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/payment_initiation/consent/get` endpoint can be used to check the status of a payment consent, as well as to receive basic information such as recipient and constraints. * @summary Get payment consent * @param {PaymentInitiationConsentGetRequest} paymentInitiationConsentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentGet: (paymentInitiationConsentGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationConsentGetRequest' is not null or undefined common_1.assertParamExists('paymentInitiationConsentGet', 'paymentInitiationConsentGetRequest', paymentInitiationConsentGetRequest); const localVarPath = `/payment_initiation/consent/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationConsentGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/payment_initiation/consent/payment/execute` endpoint can be used to execute payments using payment consent. * @summary Execute a single payment using consent * @param {PaymentInitiationConsentPaymentExecuteRequest} paymentInitiationConsentPaymentExecuteRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentPaymentExecute: (paymentInitiationConsentPaymentExecuteRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationConsentPaymentExecuteRequest' is not null or undefined common_1.assertParamExists('paymentInitiationConsentPaymentExecute', 'paymentInitiationConsentPaymentExecuteRequest', paymentInitiationConsentPaymentExecuteRequest); const localVarPath = `/payment_initiation/consent/payment/execute`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationConsentPaymentExecuteRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/payment_initiation/consent/revoke` endpoint can be used to revoke the payment consent. Once the consent is revoked, it is not possible to initiate payments using it. * @summary Revoke payment consent * @param {PaymentInitiationConsentRevokeRequest} paymentInitiationConsentRevokeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentRevoke: (paymentInitiationConsentRevokeRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationConsentRevokeRequest' is not null or undefined common_1.assertParamExists('paymentInitiationConsentRevoke', 'paymentInitiationConsentRevokeRequest', paymentInitiationConsentRevokeRequest); const localVarPath = `/payment_initiation/consent/revoke`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationConsentRevokeRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with BACS numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient’s account, although at least 90% of standing order payments are sent by 6am. In Limited Production, payments must be below 5 GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency), and standing orders, variable recurring payments, and Virtual Accounts are not supported. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentCreate: (paymentInitiationPaymentCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationPaymentCreateRequest' is not null or undefined common_1.assertParamExists('paymentInitiationPaymentCreate', 'paymentInitiationPaymentCreateRequest', paymentInitiationPaymentCreateRequest); const localVarPath = `/payment_initiation/payment/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationPaymentCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentGet: (paymentInitiationPaymentGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationPaymentGetRequest' is not null or undefined common_1.assertParamExists('paymentInitiationPaymentGet', 'paymentInitiationPaymentGetRequest', paymentInitiationPaymentGetRequest); const localVarPath = `/payment_initiation/payment/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationPaymentGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/payment_initiation/payment/list` endpoint can be used to retrieve all created payments. By default, the 10 most recent payments are returned. You can request more payments and paginate through the results using the optional `count` and `cursor` parameters. * @summary List payments * @param {PaymentInitiationPaymentListRequest} paymentInitiationPaymentListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentList: (paymentInitiationPaymentListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationPaymentListRequest' is not null or undefined common_1.assertParamExists('paymentInitiationPaymentList', 'paymentInitiationPaymentListRequest', paymentInitiationPaymentListRequest); const localVarPath = `/payment_initiation/payment/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationPaymentListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Reverse a settled payment from a Plaid virtual account. The original payment must be in a settled state to be refunded. To refund partially, specify the amount as part of the request. If the amount is not specified, the refund amount will be equal to all of the remaining payment amount that has not been refunded yet. The refund will go back to the source account that initiated the payment. The original payment must have been initiated to a Plaid virtual account so that this account can be used to initiate the refund. Providing counterparty information such as date of birth and address increases the likelihood of refund being successful without human intervention. * @summary Reverse an existing payment * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentReverse: (paymentInitiationPaymentReverseRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationPaymentReverseRequest' is not null or undefined common_1.assertParamExists('paymentInitiationPaymentReverse', 'paymentInitiationPaymentReverseRequest', paymentInitiationPaymentReverseRequest); const localVarPath = `/payment_initiation/payment/reverse`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationPaymentReverseRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA) or a non-Eurozone country [supported](https://plaid.com/global) by Plaid. For a standing order (recurring) payment, the recipient must be in the UK. It is recommended to use `bacs` in the UK and `iban` in EU. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient * @param {PaymentInitiationRecipientCreateRequest} paymentInitiationRecipientCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationRecipientCreate: (paymentInitiationRecipientCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationRecipientCreateRequest' is not null or undefined common_1.assertParamExists('paymentInitiationRecipientCreate', 'paymentInitiationRecipientCreateRequest', paymentInitiationRecipientCreateRequest); const localVarPath = `/payment_initiation/recipient/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationRecipientCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Get details about a payment recipient you have previously created. * @summary Get payment recipient * @param {PaymentInitiationRecipientGetRequest} paymentInitiationRecipientGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationRecipientGet: (paymentInitiationRecipientGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationRecipientGetRequest' is not null or undefined common_1.assertParamExists('paymentInitiationRecipientGet', 'paymentInitiationRecipientGetRequest', paymentInitiationRecipientGetRequest); const localVarPath = `/payment_initiation/recipient/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationRecipientGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationRecipientList: (paymentInitiationRecipientListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentInitiationRecipientListRequest' is not null or undefined common_1.assertParamExists('paymentInitiationRecipientList', 'paymentInitiationRecipientListRequest', paymentInitiationRecipientListRequest); const localVarPath = `/payment_initiation/recipient/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentInitiationRecipientListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use `/payment_profile/create` endpoint to create a new payment profile. To initiate the account linking experience, call `/link/token/create` and provide the `payment_profile_token` in the `transfer.payment_profile_token` field. You can then use the `payment_profile_token` when creating transfers using `/transfer/authorization/create` and `/transfer/create`. * @summary Create payment profile * @param {PaymentProfileCreateRequest} paymentProfileCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentProfileCreate: (paymentProfileCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentProfileCreateRequest' is not null or undefined common_1.assertParamExists('paymentProfileCreate', 'paymentProfileCreateRequest', paymentProfileCreateRequest); const localVarPath = `/payment_profile/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentProfileCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use `/payment_profile/get` endpoint to get the status of a given Payment Profile. * @summary Get payment profile * @param {PaymentProfileGetRequest} paymentProfileGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentProfileGet: (paymentProfileGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentProfileGetRequest' is not null or undefined common_1.assertParamExists('paymentProfileGet', 'paymentProfileGetRequest', paymentProfileGetRequest); const localVarPath = `/payment_profile/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentProfileGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/payment_profile/remove` endpoint to remove a given Payment Profile. Once it’s removed, it can no longer be used to create transfers. * @summary Remove payment profile * @param {PaymentProfileRemoveRequest} paymentProfileRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentProfileRemove: (paymentProfileRemoveRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'paymentProfileRemoveRequest' is not null or undefined common_1.assertParamExists('paymentProfileRemove', 'paymentProfileRemoveRequest', paymentProfileRemoveRequest); const localVarPath = `/payment_profile/remove`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(paymentProfileRemoveRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint returns the account associated with a given processor token. This endpoint retrieves cached information, rather than extracting fresh information from the institution. As a result, the account balance returned may not be up-to-date; for realtime balance information, use `/processor/balance/get` instead. Note that some information is nullable. * @summary Retrieve the account associated with a processor token * @param {ProcessorAccountGetRequest} processorAccountGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorAccountGet: (processorAccountGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorAccountGetRequest' is not null or undefined common_1.assertParamExists('processorAccountGet', 'processorAccountGetRequest', processorAccountGetRequest); const localVarPath = `/processor/account/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorAccountGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. * @summary Create Apex bank account token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorApexProcessorTokenCreate: (processorApexProcessorTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorApexProcessorTokenCreateRequest' is not null or undefined common_1.assertParamExists('processorApexProcessorTokenCreate', 'processorApexProcessorTokenCreateRequest', processorApexProcessorTokenCreateRequest); const localVarPath = `/processor/apex/processor_token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorApexProcessorTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/processor/auth/get` endpoint returns the bank account and bank identification number (such as the routing number, for US accounts), for a checking, savings, or cash management account that\'\'s associated with a given `processor_token`. The endpoint also returns high-level account data and balances when available. Versioning note: API versions 2019-05-29 and earlier use a different schema for the `numbers` object returned by this endpoint. For details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2020-09-14). * @summary Retrieve Auth data * @param {ProcessorAuthGetRequest} processorAuthGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorAuthGet: (processorAuthGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorAuthGetRequest' is not null or undefined common_1.assertParamExists('processorAuthGet', 'processorAuthGetRequest', processorAuthGetRequest); const localVarPath = `/processor/auth/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorAuthGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/processor/balance/get` endpoint returns the real-time balance for each of an Item\'s accounts. While other endpoints may return a balance object, only `/processor/balance/get` forces the available and current balance fields to be refreshed rather than cached. * @summary Retrieve Balance data * @param {ProcessorBalanceGetRequest} processorBalanceGetRequest The `/processor/balance/get` endpoint returns the real-time balance for the account associated with a given `processor_token`. The current balance is the total amount of funds in the account. The available balance is the current balance less any outstanding holds or debits that have not yet posted to the account. Note that not all institutions calculate the available balance. In the event that available balance is unavailable from the institution, Plaid will return an available balance value of `null`. * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorBalanceGet: (processorBalanceGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorBalanceGetRequest' is not null or undefined common_1.assertParamExists('processorBalanceGet', 'processorBalanceGetRequest', processorBalanceGetRequest); const localVarPath = `/processor/balance/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorBalanceGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor * @summary Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorBankTransferCreate: (processorBankTransferCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorBankTransferCreateRequest' is not null or undefined common_1.assertParamExists('processorBankTransferCreate', 'processorBankTransferCreateRequest', processorBankTransferCreateRequest); const localVarPath = `/processor/bank_transfer/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorBankTransferCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/processor/identity/get` endpoint allows you to retrieve various account holder information on file with the financial institution, including names, emails, phone numbers, and addresses. * @summary Retrieve Identity data * @param {ProcessorIdentityGetRequest} processorIdentityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorIdentityGet: (processorIdentityGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorIdentityGetRequest' is not null or undefined common_1.assertParamExists('processorIdentityGet', 'processorIdentityGetRequest', processorIdentityGetRequest); const localVarPath = `/processor/identity/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorIdentityGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorIdentityMatch: (processorIdentityMatchRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorIdentityMatchRequest' is not null or undefined common_1.assertParamExists('processorIdentityMatch', 'processorIdentityMatchRequest', processorIdentityMatchRequest); const localVarPath = `/processor/identity/match`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorIdentityMatchRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint returns the stock position data of the account associated with a given processor token. * @summary Retrieve Investment Holdings * @param {ProcessorInvestmentsHoldingsGetRequest} processorInvestmentsHoldingsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorInvestmentsHoldingsGet: (processorInvestmentsHoldingsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorInvestmentsHoldingsGetRequest' is not null or undefined common_1.assertParamExists('processorInvestmentsHoldingsGet', 'processorInvestmentsHoldingsGetRequest', processorInvestmentsHoldingsGetRequest); const localVarPath = `/processor/investments/holdings/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorInvestmentsHoldingsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/processor/investments/transactions/get` endpoint allows developers to retrieve up to 24 months of user-authorized transaction data for the investment account associated with the processor token. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Due to the potentially large number of investment transactions associated with the account, results are paginated. Manipulate the count and offset parameters in conjunction with the `total_investment_transactions` response body field to fetch all available investment transactions. Note that Investments does not have a webhook to indicate when initial transaction data has loaded (unless you use the `async_update` option). Instead, if transactions data is not ready when `/processor/investments/transactions/get` is first called, Plaid will wait for the data. For this reason, calling `/processor/investments/transactions/get` immediately after Link may take up to one to two minutes to return. Data returned by the asynchronous investments extraction flow (when `async_update` is set to true) may not be immediately available to `/processor/investments/transactions/get`. To be alerted when the data is ready to be fetched, listen for the `HISTORICAL_UPDATE` webhook. If no investments history is ready when `/processor/investments/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Investments Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get investment transactions data * @param {ProcessorInvestmentsTransactionsGetRequest} processorInvestmentsTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorInvestmentsTransactionsGet: (processorInvestmentsTransactionsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorInvestmentsTransactionsGetRequest' is not null or undefined common_1.assertParamExists('processorInvestmentsTransactionsGet', 'processorInvestmentsTransactionsGetRequest', processorInvestmentsTransactionsGetRequest); const localVarPath = `/processor/investments/transactions/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorInvestmentsTransactionsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. * @summary Retrieve Liabilities data * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorLiabilitiesGet: (processorLiabilitiesGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorLiabilitiesGetRequest' is not null or undefined common_1.assertParamExists('processorLiabilitiesGet', 'processorLiabilitiesGetRequest', processorLiabilitiesGetRequest); const localVarPath = `/processor/liabilities/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorLiabilitiesGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. If you are using the [Plaid Transfer product](https://www.plaid.com/docs/transfer) to create transfers, it is not necessary to use this endpoint, as Plaid already knows whether the transfer was initiated. * @summary Report whether you initiated an ACH transaction * @param {ProcessorSignalDecisionReportRequest} processorSignalDecisionReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalDecisionReport: (processorSignalDecisionReportRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorSignalDecisionReportRequest' is not null or undefined common_1.assertParamExists('processorSignalDecisionReport', 'processorSignalDecisionReportRequest', processorSignalDecisionReportRequest); const localVarPath = `/processor/signal/decision/report`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorSignalDecisionReportRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use `/processor/signal/evaluate` to evaluate a planned ACH transaction as a processor to get a return risk assessment (such as a risk score and risk tier) and additional risk signals. In order to obtain a valid score for an ACH transaction, Plaid must have an access token for the account, and the Item must be healthy (receiving product updates) or have recently been in a healthy state. If the transaction does not meet eligibility requirements, an error will be returned corresponding to the underlying cause. If `/processor/signal/evaluate` is called on the same transaction multiple times within a 24-hour period, cached results may be returned. For more information please refer to our error documentation on [item errors](/docs/errors/item/) and [Link in Update Mode](/docs/link/update-mode/). Note: This request may take some time to complete if Signal is being added to an existing Item. This is because Plaid must communicate directly with the institution when retrieving the data for the first time. To reduce this latency, you can call `/signal/prepare` on the Item before you need to request Signal data. * @summary Evaluate a planned ACH transaction * @param {ProcessorSignalEvaluateRequest} processorSignalEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalEvaluate: (processorSignalEvaluateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorSignalEvaluateRequest' is not null or undefined common_1.assertParamExists('processorSignalEvaluate', 'processorSignalEvaluateRequest', processorSignalEvaluateRequest); const localVarPath = `/processor/signal/evaluate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorSignalEvaluateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * When a processor token is not initialized with Signal, call `/processor/signal/prepare` to opt-in that processor token to the Signal data collection process, which will improve the accuracy of the Signal score. If this endpoint is called with a processor token that is already initialized with Signal, it will return a 200 response and will not modify the processor token. * @summary Opt-in a processor token to Signal * @param {ProcessorSignalPrepareRequest} processorSignalPrepareRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalPrepare: (processorSignalPrepareRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorSignalPrepareRequest' is not null or undefined common_1.assertParamExists('processorSignalPrepare', 'processorSignalPrepareRequest', processorSignalPrepareRequest); const localVarPath = `/processor/signal/prepare`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorSignalPrepareRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Call the `/processor/signal/return/report` endpoint to report a returned transaction that was previously sent to the `/processor/signal/evaluate` endpoint. Your feedback will be used by the model to incorporate the latest risk trend in your portfolio. If you are using the [Plaid Transfer product](https://www.plaid.com/docs/transfer) to create transfers, it is not necessary to use this endpoint, as Plaid already knows whether the transfer was returned. * @summary Report a return for an ACH transaction * @param {ProcessorSignalReturnReportRequest} processorSignalReturnReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalReturnReport: (processorSignalReturnReportRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorSignalReturnReportRequest' is not null or undefined common_1.assertParamExists('processorSignalReturnReport', 'processorSignalReturnReportRequest', processorSignalReturnReportRequest); const localVarPath = `/processor/signal/return/report`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorSignalReturnReportRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Used to create a token suitable for sending to Stripe to enable Plaid-Stripe integrations. For a detailed guide on integrating Stripe, see [Add Stripe to your app](https://plaid.com/docs/auth/partnerships/stripe/). Note that the Stripe bank account token is a one-time use token. To store bank account information for later use, you can use a Stripe customer object and create an associated bank account from the token, or you can use a Stripe Custom account and create an associated external bank account from the token. This bank account information should work indefinitely, unless the user\'s bank account information changes or they revoke Plaid\'s permissions to access their account. Stripe bank account information cannot be modified once the bank account token has been created. If you ever need to change the bank account details used by Stripe for a specific customer, have the user go through Link again and create a new bank account token from the new `access_token`. To revoke a bank account token, the entire underlying access token must be revoked using `/item/remove`. * @summary Create Stripe bank account token * @param {ProcessorStripeBankAccountTokenCreateRequest} processorStripeBankAccountTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorStripeBankAccountTokenCreate: (processorStripeBankAccountTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorStripeBankAccountTokenCreateRequest' is not null or undefined common_1.assertParamExists('processorStripeBankAccountTokenCreate', 'processorStripeBankAccountTokenCreateRequest', processorStripeBankAccountTokenCreateRequest); const localVarPath = `/processor/stripe/bank_account_token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorStripeBankAccountTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Used to create a token suitable for sending to one of Plaid\'s partners to enable integrations. Note that Stripe partnerships use bank account tokens instead; see `/processor/stripe/bank_account_token/create` for creating tokens for use with Stripe integrations. If using multiple processors, multiple different processor tokens can be created for a single access token. Once created, a processor token for a given Item cannot be modified or updated. To revoke the processor\'s access, the entire Item must be deleted by calling `/item/remove`. * @summary Create processor token * @param {ProcessorTokenCreateRequest} processorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenCreate: (processorTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorTokenCreateRequest' is not null or undefined common_1.assertParamExists('processorTokenCreate', 'processorTokenCreateRequest', processorTokenCreateRequest); const localVarPath = `/processor/token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Used to get a processor token\'s product permissions. The `products` field will be an empty list if the processor can access all available products. * @summary Get a processor token\'s product permissions * @param {ProcessorTokenPermissionsGetRequest} processorTokenPermissionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenPermissionsGet: (processorTokenPermissionsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorTokenPermissionsGetRequest' is not null or undefined common_1.assertParamExists('processorTokenPermissionsGet', 'processorTokenPermissionsGetRequest', processorTokenPermissionsGetRequest); const localVarPath = `/processor/token/permissions/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorTokenPermissionsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Used to control a processor\'s access to products on the given processor token. By default, a processor will have access to all available products on the corresponding item. To restrict access to a particular set of products, call this endpoint with the desired products. To restore access to all available products, call this endpoint with an empty list. This endpoint can be called multiple times as your needs and your processor\'s needs change. * @summary Control a processor\'s access to products * @param {ProcessorTokenPermissionsSetRequest} processorTokenPermissionsSetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenPermissionsSet: (processorTokenPermissionsSetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorTokenPermissionsSetRequest' is not null or undefined common_1.assertParamExists('processorTokenPermissionsSet', 'processorTokenPermissionsSetRequest', processorTokenPermissionsSetRequest); const localVarPath = `/processor/token/permissions/set`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorTokenPermissionsSetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint allows you, the processor, to update the webhook URL associated with a processor token. This request triggers a `WEBHOOK_UPDATE_ACKNOWLEDGED` webhook to the newly specified webhook URL. * @summary Update a processor token\'s webhook URL * @param {ProcessorTokenWebhookUpdateRequest} processorTokenWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenWebhookUpdate: (processorTokenWebhookUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorTokenWebhookUpdateRequest' is not null or undefined common_1.assertParamExists('processorTokenWebhookUpdate', 'processorTokenWebhookUpdateRequest', processorTokenWebhookUpdateRequest); const localVarPath = `/processor/token/webhook/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorTokenWebhookUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsGet: (processorTransactionsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorTransactionsGetRequest' is not null or undefined common_1.assertParamExists('processorTransactionsGet', 'processorTransactionsGetRequest', processorTransactionsGetRequest); const localVarPath = `/processor/transactions/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorTransactionsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user’s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsRecurringGet: (processorTransactionsRecurringGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorTransactionsRecurringGetRequest' is not null or undefined common_1.assertParamExists('processorTransactionsRecurringGet', 'processorTransactionsRecurringGetRequest', processorTransactionsRecurringGetRequest); const localVarPath = `/processor/transactions/recurring/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorTransactionsRecurringGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsRefresh: (processorTransactionsRefreshRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorTransactionsRefreshRequest' is not null or undefined common_1.assertParamExists('processorTransactionsRefresh', 'processorTransactionsRefreshRequest', processorTransactionsRefreshRequest); const localVarPath = `/processor/transactions/refresh`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorTransactionsRefreshRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsSync: (processorTransactionsSyncRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'processorTransactionsSyncRequest' is not null or undefined common_1.assertParamExists('processorTransactionsSync', 'processorTransactionsSyncRequest', processorTransactionsSyncRequest); const localVarPath = `/processor/transactions/sync`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(processorTransactionsSyncRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/profile/network_status/get` endpoint can be used to check whether Plaid has a matching profile for the user. * @summary Check a user\'s Plaid Network status * @param {ProfileNetworkStatusGetRequest} profileNetworkStatusGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ profileNetworkStatusGet: (profileNetworkStatusGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'profileNetworkStatusGetRequest' is not null or undefined common_1.assertParamExists('profileNetworkStatusGet', 'profileNetworkStatusGetRequest', profileNetworkStatusGetRequest); const localVarPath = `/profile/network_status/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(profileNetworkStatusGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. * @summary Manually fire a bank income webhook in sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxBankIncomeFireWebhook: (sandboxBankIncomeFireWebhookRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxBankIncomeFireWebhookRequest' is not null or undefined common_1.assertParamExists('sandboxBankIncomeFireWebhook', 'sandboxBankIncomeFireWebhookRequest', sandboxBankIncomeFireWebhookRequest); const localVarPath = `/sandbox/bank_income/fire_webhook`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxBankIncomeFireWebhookRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. * @summary Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxBankTransferFireWebhook: (sandboxBankTransferFireWebhookRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxBankTransferFireWebhookRequest' is not null or undefined common_1.assertParamExists('sandboxBankTransferFireWebhook', 'sandboxBankTransferFireWebhookRequest', sandboxBankTransferFireWebhookRequest); const localVarPath = `/sandbox/bank_transfer/fire_webhook`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxBankTransferFireWebhookRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxBankTransferSimulate: (sandboxBankTransferSimulateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxBankTransferSimulateRequest' is not null or undefined common_1.assertParamExists('sandboxBankTransferSimulate', 'sandboxBankTransferSimulateRequest', sandboxBankTransferSimulateRequest); const localVarPath = `/sandbox/bank_transfer/simulate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxBankTransferSimulateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/cra/cashflow_updates/update` endpoint to manually trigger an update for cashflow updates (Monitoring) in the Sandbox environment. * @summary Trigger an update for Cashflow Updates * @param {SandboxCraCashflowUpdatesUpdateRequest} sandboxCraCashflowUpdatesUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxCraCashflowUpdatesUpdate: (sandboxCraCashflowUpdatesUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxCraCashflowUpdatesUpdateRequest' is not null or undefined common_1.assertParamExists('sandboxCraCashflowUpdatesUpdate', 'sandboxCraCashflowUpdatesUpdateRequest', sandboxCraCashflowUpdatesUpdateRequest); const localVarPath = `/sandbox/cra/cashflow_updates/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxCraCashflowUpdatesUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook * @param {SandboxIncomeFireWebhookRequest} sandboxIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxIncomeFireWebhook: (sandboxIncomeFireWebhookRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxIncomeFireWebhookRequest' is not null or undefined common_1.assertParamExists('sandboxIncomeFireWebhook', 'sandboxIncomeFireWebhookRequest', sandboxIncomeFireWebhookRequest); const localVarPath = `/sandbox/income/fire_webhook`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxIncomeFireWebhookRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/sandbox/item/fire_webhook` endpoint is used to test that code correctly handles webhooks. This endpoint can trigger the following webhooks: `DEFAULT_UPDATE`: Webhook to be fired for a given Sandbox Item simulating a default update event for the respective product as specified with the `webhook_type` in the request body. Valid Sandbox `DEFAULT_UPDATE` webhook types include: `AUTH`, `IDENTITY`, `TRANSACTIONS`, `INVESTMENTS_TRANSACTIONS`, `LIABILITIES`, `HOLDINGS`. If the Item does not support the product, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `NEW_ACCOUNTS_AVAILABLE`: Fired to indicate that a new account is available on the Item and you can launch update mode to request access to it. `SMS_MICRODEPOSITS_VERIFICATION`: Fired when a given same day micro-deposit item is verified via SMS verification. `LOGIN_REPAIRED`: Fired when an Item recovers from the `ITEM_LOGIN_REQUIRED` without the user going through update mode in your app. `PENDING_DISCONNECT`: Fired when an Item will stop working in the near future (e.g. due to a planned bank migration) and must be sent through update mode to continue working. `RECURRING_TRANSACTIONS_UPDATE`: Recurring Transactions webhook to be fired for a given Sandbox Item. If the Item does not support Recurring Transactions, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `SYNC_UPDATES_AVAILABLE`: Transactions webhook to be fired for a given Sandbox Item. If the Item does not support Transactions, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `PRODUCT_READY`: Assets webhook to be fired when a given asset report has been successfully generated. If the Item does not support Assets, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `ERROR`: Assets webhook to be fired when asset report generation has failed. If the Item does not support Assets, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `USER_PERMISSION_REVOKED`: Indicates an end user has revoked the permission that they previously granted to access an Item. May not always fire upon revocation, as some institutions’ consent portals do not trigger this webhook. Upon receiving this webhook, it is recommended to delete any stored data from Plaid associated with the account or Item. `USER_ACCOUNT_REVOKED`: Fired when an end user has revoked access to their account on the Data Provider\'s portal. This webhook is currently sent only for Chase and PNC Items, but may be sent in the future for other financial institutions. Upon receiving this webhook, it is recommended to delete any stored data from Plaid associated with the account or Item. Note that this endpoint is provided for developer ease-of-use and is not required for testing webhooks; webhooks will also fire in Sandbox under the same conditions that they would in Production (except for webhooks of type `TRANSFER`). * @summary Fire a test webhook * @param {SandboxItemFireWebhookRequest} sandboxItemFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxItemFireWebhook: (sandboxItemFireWebhookRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxItemFireWebhookRequest' is not null or undefined common_1.assertParamExists('sandboxItemFireWebhook', 'sandboxItemFireWebhookRequest', sandboxItemFireWebhookRequest); const localVarPath = `/sandbox/item/fire_webhook`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxItemFireWebhookRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, You can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxItemResetLogin: (sandboxItemResetLoginRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxItemResetLoginRequest' is not null or undefined common_1.assertParamExists('sandboxItemResetLogin', 'sandboxItemResetLoginRequest', sandboxItemResetLoginRequest); const localVarPath = `/sandbox/item/reset_login`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxItemResetLoginRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/sandbox/item/set_verification_status` endpoint can be used to change the verification status of an Item in in the Sandbox in order to simulate the Automated Micro-deposit flow. For more information on testing Automated Micro-deposits in Sandbox, see [Auth full coverage testing](https://plaid.com/docs/auth/coverage/testing#). * @summary Set verification status for Sandbox account * @param {SandboxItemSetVerificationStatusRequest} sandboxItemSetVerificationStatusRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxItemSetVerificationStatus: (sandboxItemSetVerificationStatusRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxItemSetVerificationStatusRequest' is not null or undefined common_1.assertParamExists('sandboxItemSetVerificationStatus', 'sandboxItemSetVerificationStatusRequest', sandboxItemSetVerificationStatusRequest); const localVarPath = `/sandbox/item/set_verification_status`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxItemSetVerificationStatusRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Save the selected accounts when connecting to the Platypus Oauth institution * @summary Save the selected accounts when connecting to the Platypus Oauth institution * @param {SandboxOauthSelectAccountsRequest} sandboxOauthSelectAccountsRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxOauthSelectAccounts: (sandboxOauthSelectAccountsRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxOauthSelectAccountsRequest' is not null or undefined common_1.assertParamExists('sandboxOauthSelectAccounts', 'sandboxOauthSelectAccountsRequest', sandboxOauthSelectAccountsRequest); const localVarPath = `/sandbox/oauth/select_accounts`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxOauthSelectAccountsRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxPaymentProfileResetLogin: (sandboxPaymentProfileResetLoginRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxPaymentProfileResetLoginRequest' is not null or undefined common_1.assertParamExists('sandboxPaymentProfileResetLogin', 'sandboxPaymentProfileResetLoginRequest', sandboxPaymentProfileResetLoginRequest); const localVarPath = `/sandbox/payment_profile/reset_login`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxPaymentProfileResetLoginRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/payment/simulate` endpoint to simulate various payment events in the Sandbox environment. This endpoint will trigger the corresponding payment status webhook. * @summary Simulate a payment event in Sandbox * @param {SandboxPaymentSimulateRequest} sandboxPaymentSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxPaymentSimulate: (sandboxPaymentSimulateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxPaymentSimulateRequest' is not null or undefined common_1.assertParamExists('sandboxPaymentSimulate', 'sandboxPaymentSimulateRequest', sandboxPaymentSimulateRequest); const localVarPath = `/sandbox/payment/simulate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxPaymentSimulateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/processor_token/create` endpoint to create a valid `processor_token` for an arbitrary institution ID and test credentials. The created `processor_token` corresponds to a new Sandbox Item. You can then use this `processor_token` with the `/processor/` API endpoints in Sandbox. You can also use `/sandbox/processor_token/create` with the [`user_custom` test username](https://plaid.com/docs/sandbox/user-custom) to generate a test account with custom data. * @summary Create a test Item and processor token * @param {SandboxProcessorTokenCreateRequest} sandboxProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxProcessorTokenCreate: (sandboxProcessorTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxProcessorTokenCreateRequest' is not null or undefined common_1.assertParamExists('sandboxProcessorTokenCreate', 'sandboxProcessorTokenCreateRequest', sandboxProcessorTokenCreateRequest); const localVarPath = `/sandbox/processor_token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxProcessorTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/public_token/create` endpoint to create a valid `public_token` for an arbitrary institution ID, initial products, and test credentials. The created `public_token` maps to a new Sandbox Item. You can then call `/item/public_token/exchange` to exchange the `public_token` for an `access_token` and perform all API actions. `/sandbox/public_token/create` can also be used with the [`user_custom` test username](https://plaid.com/docs/sandbox/user-custom) to generate a test account with custom data, or with Plaid\'s [pre-populated Sandbox test accounts](https://plaid.com/docs/sandbox/test-credentials/). * @summary Create a test Item * @param {SandboxPublicTokenCreateRequest} sandboxPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxPublicTokenCreate: (sandboxPublicTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxPublicTokenCreateRequest' is not null or undefined common_1.assertParamExists('sandboxPublicTokenCreate', 'sandboxPublicTokenCreateRequest', sandboxPublicTokenCreateRequest); const localVarPath = `/sandbox/public_token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxPublicTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/fire_webhook` endpoint to manually trigger a `TRANSFER_EVENTS_UPDATE` webhook in the Sandbox environment. * @summary Manually fire a Transfer webhook * @param {SandboxTransferFireWebhookRequest} sandboxTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferFireWebhook: (sandboxTransferFireWebhookRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferFireWebhookRequest' is not null or undefined common_1.assertParamExists('sandboxTransferFireWebhook', 'sandboxTransferFireWebhookRequest', sandboxTransferFireWebhookRequest); const localVarPath = `/sandbox/transfer/fire_webhook`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferFireWebhookRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/ledger/deposit/simulate` endpoint to simulate a ledger deposit event in the Sandbox environment. * @summary Simulate a ledger deposit event in Sandbox * @param {SandboxTransferLedgerDepositSimulateRequest} sandboxTransferLedgerDepositSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferLedgerDepositSimulate: (sandboxTransferLedgerDepositSimulateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferLedgerDepositSimulateRequest' is not null or undefined common_1.assertParamExists('sandboxTransferLedgerDepositSimulate', 'sandboxTransferLedgerDepositSimulateRequest', sandboxTransferLedgerDepositSimulateRequest); const localVarPath = `/sandbox/transfer/ledger/deposit/simulate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferLedgerDepositSimulateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/ledger/simulate_available` endpoint to simulate converting pending balance to available balance for all originators in the Sandbox environment. * @summary Simulate converting pending balance to available balance * @param {SandboxTransferLedgerSimulateAvailableRequest} sandboxTransferLedgerSimulateAvailableRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferLedgerSimulateAvailable: (sandboxTransferLedgerSimulateAvailableRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferLedgerSimulateAvailableRequest' is not null or undefined common_1.assertParamExists('sandboxTransferLedgerSimulateAvailable', 'sandboxTransferLedgerSimulateAvailableRequest', sandboxTransferLedgerSimulateAvailableRequest); const localVarPath = `/sandbox/transfer/ledger/simulate_available`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferLedgerSimulateAvailableRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/ledger/withdraw/simulate` endpoint to simulate a ledger withdraw event in the Sandbox environment. * @summary Simulate a ledger withdraw event in Sandbox * @param {SandboxTransferLedgerWithdrawSimulateRequest} sandboxTransferLedgerWithdrawSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferLedgerWithdrawSimulate: (sandboxTransferLedgerWithdrawSimulateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferLedgerWithdrawSimulateRequest' is not null or undefined common_1.assertParamExists('sandboxTransferLedgerWithdrawSimulate', 'sandboxTransferLedgerWithdrawSimulateRequest', sandboxTransferLedgerWithdrawSimulateRequest); const localVarPath = `/sandbox/transfer/ledger/withdraw/simulate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferLedgerWithdrawSimulateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/refund/simulate` endpoint to simulate a refund event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/transfer/event/sync` or `/transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a refund event in Sandbox * @param {SandboxTransferRefundSimulateRequest} sandboxTransferRefundSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferRefundSimulate: (sandboxTransferRefundSimulateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferRefundSimulateRequest' is not null or undefined common_1.assertParamExists('sandboxTransferRefundSimulate', 'sandboxTransferRefundSimulateRequest', sandboxTransferRefundSimulateRequest); const localVarPath = `/sandbox/transfer/refund/simulate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferRefundSimulateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferRepaymentSimulate: (sandboxTransferRepaymentSimulateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferRepaymentSimulateRequest' is not null or undefined common_1.assertParamExists('sandboxTransferRepaymentSimulate', 'sandboxTransferRepaymentSimulateRequest', sandboxTransferRepaymentSimulateRequest); const localVarPath = `/sandbox/transfer/repayment/simulate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferRepaymentSimulateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/simulate` endpoint to simulate a transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/transfer/event/sync` or `/transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a transfer event in Sandbox * @param {SandboxTransferSimulateRequest} sandboxTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferSimulate: (sandboxTransferSimulateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferSimulateRequest' is not null or undefined common_1.assertParamExists('sandboxTransferSimulate', 'sandboxTransferSimulateRequest', sandboxTransferSimulateRequest); const localVarPath = `/sandbox/transfer/simulate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferSimulateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/sweep/simulate` endpoint to create a sweep and associated events in the Sandbox environment. Upon calling this endpoint, all transfers with a sweep status of `swept` will become `swept_settled`, all `posted` or `pending` transfers with a sweep status of `unswept` will become `swept`, and all `returned` transfers with a sweep status of `swept` will become `return_swept`. * @summary Simulate creating a sweep * @param {SandboxTransferSweepSimulateRequest} sandboxTransferSweepSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferSweepSimulate: (sandboxTransferSweepSimulateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferSweepSimulateRequest' is not null or undefined common_1.assertParamExists('sandboxTransferSweepSimulate', 'sandboxTransferSweepSimulateRequest', sandboxTransferSweepSimulateRequest); const localVarPath = `/sandbox/transfer/sweep/simulate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferSweepSimulateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/test_clock/advance` endpoint to advance a `test_clock` in the Sandbox environment. A test clock object represents an independent timeline and has a `virtual_time` field indicating the current timestamp of the timeline. A test clock can be advanced by incrementing `virtual_time`, but may never go back to a lower `virtual_time`. If a test clock is advanced, we will simulate the changes that ought to occur during the time that elapsed. For example, a client creates a weekly recurring transfer with a test clock set at t. When the client advances the test clock by setting `virtual_time` = t + 15 days, 2 new originations should be created, along with the webhook events. The advancement of the test clock from its current `virtual_time` should be limited such that there are no more than 20 originations resulting from the advance operation on each `recurring_transfer` associated with the `test_clock`. For example, if the recurring transfer associated with this test clock originates once every 4 weeks, you can advance the `virtual_time` up to 80 weeks on each API call. * @summary Advance a test clock * @param {SandboxTransferTestClockAdvanceRequest} sandboxTransferTestClockAdvanceRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockAdvance: (sandboxTransferTestClockAdvanceRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferTestClockAdvanceRequest' is not null or undefined common_1.assertParamExists('sandboxTransferTestClockAdvance', 'sandboxTransferTestClockAdvanceRequest', sandboxTransferTestClockAdvanceRequest); const localVarPath = `/sandbox/transfer/test_clock/advance`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferTestClockAdvanceRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/test_clock/create` endpoint to create a `test_clock` in the Sandbox environment. A test clock object represents an independent timeline and has a `virtual_time` field indicating the current timestamp of the timeline. Test clocks are used for testing recurring transfers in Sandbox. A test clock can be associated with up to 5 recurring transfers. * @summary Create a test clock * @param {SandboxTransferTestClockCreateRequest} sandboxTransferTestClockCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockCreate: (sandboxTransferTestClockCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferTestClockCreateRequest' is not null or undefined common_1.assertParamExists('sandboxTransferTestClockCreate', 'sandboxTransferTestClockCreateRequest', sandboxTransferTestClockCreateRequest); const localVarPath = `/sandbox/transfer/test_clock/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferTestClockCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/test_clock/get` endpoint to get a `test_clock` in the Sandbox environment. * @summary Get a test clock * @param {SandboxTransferTestClockGetRequest} sandboxTransferTestClockGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockGet: (sandboxTransferTestClockGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferTestClockGetRequest' is not null or undefined common_1.assertParamExists('sandboxTransferTestClockGet', 'sandboxTransferTestClockGetRequest', sandboxTransferTestClockGetRequest); const localVarPath = `/sandbox/transfer/test_clock/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferTestClockGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/sandbox/transfer/test_clock/list` endpoint to see a list of all your test clocks in the Sandbox environment, by ascending `virtual_time`. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired test clocks. * @summary List test clocks * @param {SandboxTransferTestClockListRequest} sandboxTransferTestClockListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockList: (sandboxTransferTestClockListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxTransferTestClockListRequest' is not null or undefined common_1.assertParamExists('sandboxTransferTestClockList', 'sandboxTransferTestClockListRequest', sandboxTransferTestClockListRequest); const localVarPath = `/sandbox/transfer/test_clock/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxTransferTestClockListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, You can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxUserResetLogin: (sandboxUserResetLoginRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'sandboxUserResetLoginRequest' is not null or undefined common_1.assertParamExists('sandboxUserResetLogin', 'sandboxUserResetLoginRequest', sandboxUserResetLoginRequest); const localVarPath = `/sandbox/user/reset_login`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(sandboxUserResetLoginRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * After calling `/signal/evaluate`, call `/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction * @param {SignalDecisionReportRequest} signalDecisionReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalDecisionReport: (signalDecisionReportRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'signalDecisionReportRequest' is not null or undefined common_1.assertParamExists('signalDecisionReport', 'signalDecisionReportRequest', signalDecisionReportRequest); const localVarPath = `/signal/decision/report`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(signalDecisionReportRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use `/signal/evaluate` to evaluate a planned ACH transaction to get a return risk assessment (such as a risk score and risk tier) and additional risk signals. In order to obtain a valid score for an ACH transaction, Plaid must have an access token for the account, and the Item must be healthy (receiving product updates) or have recently been in a healthy state. If the transaction does not meet eligibility requirements, an error will be returned corresponding to the underlying cause. If `/signal/evaluate` is called on the same transaction multiple times within a 24-hour period, cached results may be returned. For more information please refer to the error documentation on [Item errors](/docs/errors/item/) and [Link in Update Mode](/docs/link/update-mode/). Note: This request may take some time to complete if Signal is being added to an existing Item. This is because Plaid must communicate directly with the institution when retrieving the data for the first time. * @summary Evaluate a planned ACH transaction * @param {SignalEvaluateRequest} signalEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalEvaluate: (signalEvaluateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'signalEvaluateRequest' is not null or undefined common_1.assertParamExists('signalEvaluate', 'signalEvaluateRequest', signalEvaluateRequest); const localVarPath = `/signal/evaluate`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(signalEvaluateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * When an Item is not initialized with Signal, call `/signal/prepare` to opt-in that Item to the Signal data collection process, developing a Signal score. This should be done on Items where Signal was added in the `additional_consented_products` array but not in the `products`, `optional_products`, or `required_if_supported_products` array. If `/signal/prepare` is skipped on an Item that is not initialized with Signal, the initial call to `/signal/evaluate` on that Item will be less accurate, because Signal will have access to less data for computing the Signal score. If run on an Item that is already initialized with Signal, this endpoint will return a 200 response and will not modify the Item. * @summary Opt-in an Item to Signal * @param {SignalPrepareRequest} signalPrepareRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalPrepare: (signalPrepareRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'signalPrepareRequest' is not null or undefined common_1.assertParamExists('signalPrepare', 'signalPrepareRequest', signalPrepareRequest); const localVarPath = `/signal/prepare`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(signalPrepareRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Call the `/signal/return/report` endpoint to report a returned transaction that was previously sent to the `/signal/evaluate` endpoint. Your feedback will be used by the model to incorporate the latest risk trend in your portfolio. * @summary Report a return for an ACH transaction * @param {SignalReturnReportRequest} signalReturnReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalReturnReport: (signalReturnReportRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'signalReturnReportRequest' is not null or undefined common_1.assertParamExists('signalReturnReport', 'signalReturnReportRequest', signalReturnReportRequest); const localVarPath = `/signal/return/report`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(signalReturnReportRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use `/signal/schedule` to schedule a planned ACH transaction. * @summary Schedule a planned ACH transaction * @param {SignalScheduleRequest} signalScheduleRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalSchedule: (signalScheduleRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'signalScheduleRequest' is not null or undefined common_1.assertParamExists('signalSchedule', 'signalScheduleRequest', signalScheduleRequest); const localVarPath = `/signal/schedule`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(signalScheduleRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. * @param {StatementsDownloadRequest} statementsDownloadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ statementsDownload: (statementsDownloadRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'statementsDownloadRequest' is not null or undefined common_1.assertParamExists('statementsDownload', 'statementsDownloadRequest', statementsDownloadRequest); const localVarPath = `/statements/download`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(statementsDownloadRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/statements/list` endpoint retrieves a list of all statements associated with an item. * @summary Retrieve a list of all statements associated with an item. * @param {StatementsListRequest} statementsListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ statementsList: (statementsListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'statementsListRequest' is not null or undefined common_1.assertParamExists('statementsList', 'statementsListRequest', statementsListRequest); const localVarPath = `/statements/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(statementsListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. * @summary Refresh statements data. * @param {StatementsRefreshRequest} statementsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ statementsRefresh: (statementsRefreshRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'statementsRefreshRequest' is not null or undefined common_1.assertParamExists('statementsRefresh', 'statementsRefreshRequest', statementsRefreshRequest); const localVarPath = `/statements/refresh`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(statementsRefreshRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data * @param {TransactionsEnhanceGetRequest} transactionsEnhanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsEnhance: (transactionsEnhanceGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transactionsEnhanceGetRequest' is not null or undefined common_1.assertParamExists('transactionsEnhance', 'transactionsEnhanceGetRequest', transactionsEnhanceGetRequest); const localVarPath = `/beta/transactions/v1/enhance`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transactionsEnhanceGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transactions/enrich` endpoint enriches raw transaction data generated by your own banking products or retrieved from other non-Plaid sources. * @summary Enrich locally-held transaction data * @param {TransactionsEnrichRequest} transactionsEnrichRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsEnrich: (transactionsEnrichRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transactionsEnrichRequest' is not null or undefined common_1.assertParamExists('transactionsEnrich', 'transactionsEnrichRequest', transactionsEnrichRequest); const localVarPath = `/transactions/enrich`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transactionsEnrichRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsGet: (transactionsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transactionsGetRequest' is not null or undefined common_1.assertParamExists('transactionsGet', 'transactionsGetRequest', transactionsGetRequest); const localVarPath = `/transactions/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transactionsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user’s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRecurringGet: (transactionsRecurringGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transactionsRecurringGetRequest' is not null or undefined common_1.assertParamExists('transactionsRecurringGet', 'transactionsRecurringGetRequest', transactionsRecurringGetRequest); const localVarPath = `/transactions/recurring/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transactionsRecurringGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/transactions/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for an Item. The on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled Item. The Item must already have Transactions added as a product in order to call `/transactions/refresh`. If changes to transactions are discovered after calling `/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/transactions/sync` and `/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/transactions/get` or `/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/transactions/refresh` is offered as an optional add-on to Transactions and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {TransactionsRefreshRequest} transactionsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRefresh: (transactionsRefreshRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transactionsRefreshRequest' is not null or undefined common_1.assertParamExists('transactionsRefresh', 'transactionsRefreshRequest', transactionsRefreshRequest); const localVarPath = `/transactions/refresh`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transactionsRefreshRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transactions/rules/v1/create` endpoint creates transaction categorization rules. Rules will be applied on the Item\'s transactions returned in `/transactions/get` response. The product is currently in beta. To request access, contact transactions-feedback@plaid.com. * @summary Create transaction category rule * @param {TransactionsRulesCreateRequest} transactionsRulesCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRulesCreate: (transactionsRulesCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transactionsRulesCreateRequest' is not null or undefined common_1.assertParamExists('transactionsRulesCreate', 'transactionsRulesCreateRequest', transactionsRulesCreateRequest); const localVarPath = `/beta/transactions/rules/v1/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transactionsRulesCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transactions/rules/v1/list` returns a list of transaction rules created for the Item associated with the access token. * @summary Return a list of rules created for the Item associated with the access token. * @param {TransactionsRulesListRequest} transactionsRulesListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRulesList: (transactionsRulesListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transactionsRulesListRequest' is not null or undefined common_1.assertParamExists('transactionsRulesList', 'transactionsRulesListRequest', transactionsRulesListRequest); const localVarPath = `/beta/transactions/rules/v1/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transactionsRulesListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transactions/rules/v1/remove` endpoint is used to remove a transaction rule. * @summary Remove transaction rule * @param {TransactionsRulesRemoveRequest} transactionsRulesRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRulesRemove: (transactionsRulesRemoveRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transactionsRulesRemoveRequest' is not null or undefined common_1.assertParamExists('transactionsRulesRemove', 'transactionsRulesRemoveRequest', transactionsRulesRemoveRequest); const localVarPath = `/beta/transactions/rules/v1/remove`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transactionsRulesRemoveRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsSync: (transactionsSyncRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transactionsSyncRequest' is not null or undefined common_1.assertParamExists('transactionsSync', 'transactionsSyncRequest', transactionsSyncRequest); const localVarPath = `/transactions/sync`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transactionsSyncRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/beta/transactions/user_insights/v1/get` gets user insights for clients who have enriched data with `/transactions/enrich`. The product is currently in beta. * @summary Obtain user insights based on transactions sent through /transactions/enrich * @param {TransactionsUserInsightsGetRequest} transactionsUserInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsUserInsightsGet: (transactionsUserInsightsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transactionsUserInsightsGetRequest' is not null or undefined common_1.assertParamExists('transactionsUserInsightsGet', 'transactionsUserInsightsGetRequest', transactionsUserInsightsGetRequest); const localVarPath = `/beta/transactions/user_insights/v1/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transactionsUserInsightsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/authorization/cancel` endpoint to cancel a transfer authorization. A transfer authorization is eligible for cancellation if it has not yet been used to create a transfer. * @summary Cancel a transfer authorization * @param {TransferAuthorizationCancelRequest} transferAuthorizationCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferAuthorizationCancel: (transferAuthorizationCancelRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferAuthorizationCancelRequest' is not null or undefined common_1.assertParamExists('transferAuthorizationCancel', 'transferAuthorizationCancelRequest', transferAuthorizationCancelRequest); const localVarPath = `/transfer/authorization/cancel`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferAuthorizationCancelRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/authorization/create` endpoint to authorize a transfer. This endpoint must be called prior to calling `/transfer/create`. The transfer authorization will expire if not used after one hour. (You can contact your account manager to change the default authorization lifetime.) There are four possible outcomes to calling this endpoint: - If the `authorization.decision` in the response is `declined`, the proposed transfer has failed the risk check and you cannot proceed with the transfer. - If the `authorization.decision` is `user_action_required`, additional user input is needed, usually to fix a broken bank connection, before Plaid can properly assess the risk. You need to launch Link in update mode to complete the required user action. When calling `/link/token/create` to get a new Link token, instead of providing `access_token` in the request, you should set [`transfer.authorization_id`](https://plaid.com/docs/api/link/#link-token-create-request-transfer-authorization-id) as the `authorization.id`. After the Link flow is completed, you may re-attempt the authorization. - If the `authorization.decision` is `approved`, and the `authorization.rationale_code` is `null`, the transfer has passed the risk check and you can proceed to call `/transfer/create`. - If the `authorization.decision` is `approved` and the `authorization.rationale_code` is non-`null`, the risk check could not be run: you may proceed with the transfer, but should perform your own risk evaluation. For more details, see the response schema. In Plaid\'s Sandbox environment the decisions will be returned as follows: - To approve a transfer with `null` rationale code, make an authorization request with an `amount` less than the available balance in the account. - To approve a transfer with the rationale code `MANUALLY_VERIFIED_ITEM`, create an Item in Link through the [Same Day Micro-deposits flow](https://plaid.com/docs/auth/coverage/testing/#testing-same-day-micro-deposits). - To get an authorization decision of `user_action_required`, [reset the login for an Item](https://plaid.com/docs/sandbox/#item_login_required). - To decline a transfer with the rationale code `NSF`, the available balance on the account must be less than the authorization `amount`. See [Create Sandbox test data](https://plaid.com/docs/sandbox/user-custom/) for details on how to customize data in Sandbox. - To decline a transfer with the rationale code `RISK`, the available balance on the account must be exactly $0. See [Create Sandbox test data](https://plaid.com/docs/sandbox/user-custom/) for details on how to customize data in Sandbox. * @summary Create a transfer authorization * @param {TransferAuthorizationCreateRequest} transferAuthorizationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferAuthorizationCreate: (transferAuthorizationCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferAuthorizationCreateRequest' is not null or undefined common_1.assertParamExists('transferAuthorizationCreate', 'transferAuthorizationCreateRequest', transferAuthorizationCreateRequest); const localVarPath = `/transfer/authorization/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferAuthorizationCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferBalanceGet: (transferBalanceGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferBalanceGetRequest' is not null or undefined common_1.assertParamExists('transferBalanceGet', 'transferBalanceGetRequest', transferBalanceGetRequest); const localVarPath = `/transfer/balance/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferBalanceGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/cancel` endpoint to cancel a transfer. A transfer is eligible for cancellation if the `cancellable` property returned by `/transfer/get` is `true`. * @summary Cancel a transfer * @param {TransferCancelRequest} transferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferCancel: (transferCancelRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferCancelRequest' is not null or undefined common_1.assertParamExists('transferCancel', 'transferCancelRequest', transferCancelRequest); const localVarPath = `/transfer/cancel`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferCancelRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/capabilities/get` endpoint to determine the RTP eligibility information of an account to be used with Transfer. This endpoint works on all Transfer-capable Items, including those created by `/transfer/migrate_account`. To simulate RTP eligibility in Sandbox, log in using the username `user_good` and password `pass_good` and use the first two checking and savings accounts in the \"First Platypus Bank\" institution (ending in 0000 or 1111), which will return `true`. Any other account will return `false`. * @summary Get RTP eligibility information of a transfer * @param {TransferCapabilitiesGetRequest} transferCapabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferCapabilitiesGet: (transferCapabilitiesGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferCapabilitiesGetRequest' is not null or undefined common_1.assertParamExists('transferCapabilitiesGet', 'transferCapabilitiesGetRequest', transferCapabilitiesGetRequest); const localVarPath = `/transfer/capabilities/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferCapabilitiesGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/configuration/get` endpoint to view your transfer product configurations. * @summary Get transfer product configuration * @param {TransferConfigurationGetRequest} transferConfigurationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferConfigurationGet: (transferConfigurationGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferConfigurationGetRequest' is not null or undefined common_1.assertParamExists('transferConfigurationGet', 'transferConfigurationGetRequest', transferConfigurationGetRequest); const localVarPath = `/transfer/configuration/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferConfigurationGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/create` endpoint to initiate a new transfer. This endpoint is retryable and idempotent; if a transfer with the provided `transfer_id` has already been created, it will return the transfer details without creating a new transfer. A transfer may still be created if a 500 error is returned; to detect this scenario, use [Transfer events](https://plaid.com/docs/transfer/reconciling-transfers/). * @summary Create a transfer * @param {TransferCreateRequest} transferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferCreate: (transferCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferCreateRequest' is not null or undefined common_1.assertParamExists('transferCreate', 'transferCreateRequest', transferCreateRequest); const localVarPath = `/transfer/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You’ll need to send a request of type multipart/form-data. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferDiligenceDocumentUpload: (transferDiligenceDocumentUploadRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferDiligenceDocumentUploadRequest' is not null or undefined common_1.assertParamExists('transferDiligenceDocumentUpload', 'transferDiligenceDocumentUploadRequest', transferDiligenceDocumentUploadRequest); const localVarPath = `/transfer/diligence/document/upload`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferDiligenceDocumentUploadRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/diligence/submit` endpoint to submit transfer diligence on behalf of the originator (i.e., the end customer). * @summary Submit transfer diligence on behalf of the originator * @param {TransferDiligenceSubmitRequest} transferDiligenceSubmitRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferDiligenceSubmit: (transferDiligenceSubmitRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferDiligenceSubmitRequest' is not null or undefined common_1.assertParamExists('transferDiligenceSubmit', 'transferDiligenceSubmitRequest', transferDiligenceSubmitRequest); const localVarPath = `/transfer/diligence/submit`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferDiligenceSubmitRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/event/list` endpoint to get a list of transfer events based on specified filter criteria. * @summary List transfer events * @param {TransferEventListRequest} transferEventListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferEventList: (transferEventListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferEventListRequest' is not null or undefined common_1.assertParamExists('transferEventList', 'transferEventListRequest', transferEventListRequest); const localVarPath = `/transfer/event/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferEventListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/transfer/event/sync` allows you to request up to the next 25 transfer events that happened after a specific `event_id`. Use the `/transfer/event/sync` endpoint to guarantee you have seen all transfer events. * @summary Sync transfer events * @param {TransferEventSyncRequest} transferEventSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferEventSync: (transferEventSyncRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferEventSyncRequest' is not null or undefined common_1.assertParamExists('transferEventSync', 'transferEventSyncRequest', transferEventSyncRequest); const localVarPath = `/transfer/event/sync`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferEventSyncRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/get` endpoint fetches information about the transfer corresponding to the given `transfer_id` or `authorization_id`. One of `transfer_id` or `authorization_id` must be populated but not both. * @summary Retrieve a transfer * @param {TransferGetRequest} transferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferGet: (transferGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferGetRequest' is not null or undefined common_1.assertParamExists('transferGet', 'transferGetRequest', transferGetRequest); const localVarPath = `/transfer/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/intent/create` endpoint to generate a transfer intent object and invoke the Transfer UI. * @summary Create a transfer intent object to invoke the Transfer UI * @param {TransferIntentCreateRequest} transferIntentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferIntentCreate: (transferIntentCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferIntentCreateRequest' is not null or undefined common_1.assertParamExists('transferIntentCreate', 'transferIntentCreateRequest', transferIntentCreateRequest); const localVarPath = `/transfer/intent/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferIntentCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/intent/get` endpoint to retrieve more information about a transfer intent. * @summary Retrieve more information about a transfer intent * @param {TransferIntentGetRequest} transferIntentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferIntentGet: (transferIntentGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferIntentGetRequest' is not null or undefined common_1.assertParamExists('transferIntentGet', 'transferIntentGetRequest', transferIntentGetRequest); const localVarPath = `/transfer/intent/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferIntentGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/ledger/deposit` endpoint to deposit funds into Plaid Ledger. * @summary Deposit funds into a Plaid Ledger balance * @param {TransferLedgerDepositRequest} transferLedgerDepositRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerDeposit: (transferLedgerDepositRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferLedgerDepositRequest' is not null or undefined common_1.assertParamExists('transferLedgerDeposit', 'transferLedgerDepositRequest', transferLedgerDepositRequest); const localVarPath = `/transfer/ledger/deposit`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferLedgerDepositRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/ledger/distribute` endpoint to move available balance between the ledgers of the platform and one of its originators. * @summary Move available balance between the ledgers of the platform and one of its originators * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerDistribute: (transferLedgerDistributeRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferLedgerDistributeRequest' is not null or undefined common_1.assertParamExists('transferLedgerDistribute', 'transferLedgerDistributeRequest', transferLedgerDistributeRequest); const localVarPath = `/transfer/ledger/distribute`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferLedgerDistributeRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/ledger/get` endpoint to view a balance on the ledger held with Plaid. * @summary Retrieve Plaid Ledger balance * @param {TransferLedgerGetRequest} transferLedgerGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerGet: (transferLedgerGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferLedgerGetRequest' is not null or undefined common_1.assertParamExists('transferLedgerGet', 'transferLedgerGetRequest', transferLedgerGetRequest); const localVarPath = `/transfer/ledger/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferLedgerGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/ledger/withdraw` endpoint to withdraw funds from a Plaid Ledger balance. * @summary Withdraw funds from a Plaid Ledger balance * @param {TransferLedgerWithdrawRequest} transferLedgerWithdrawRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerWithdraw: (transferLedgerWithdrawRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferLedgerWithdrawRequest' is not null or undefined common_1.assertParamExists('transferLedgerWithdraw', 'transferLedgerWithdrawRequest', transferLedgerWithdrawRequest); const localVarPath = `/transfer/ledger/withdraw`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferLedgerWithdrawRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/list` endpoint to see a list of all your transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired transfers. * @summary List transfers * @param {TransferListRequest} transferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferList: (transferListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferListRequest' is not null or undefined common_1.assertParamExists('transferList', 'transferListRequest', transferListRequest); const localVarPath = `/transfer/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/metrics/get` endpoint to view your transfer product usage metrics. * @summary Get transfer product usage metrics * @param {TransferMetricsGetRequest} transferMetricsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferMetricsGet: (transferMetricsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferMetricsGetRequest' is not null or undefined common_1.assertParamExists('transferMetricsGet', 'transferMetricsGetRequest', transferMetricsGetRequest); const localVarPath = `/transfer/metrics/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferMetricsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * As an alternative to adding Items via Link, you can also use the `/transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. This endpoint is also required when adding an Item for use with wire transfers; if you intend to create wire transfers on this account, you must provide `wire_routing_number`. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid Account Manager. * @summary Migrate account into Transfers * @param {TransferMigrateAccountRequest} transferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferMigrateAccount: (transferMigrateAccountRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferMigrateAccountRequest' is not null or undefined common_1.assertParamExists('transferMigrateAccount', 'transferMigrateAccountRequest', transferMigrateAccountRequest); const localVarPath = `/transfer/migrate_account`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferMigrateAccountRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/originator/create` endpoint to create a new originator and return an `originator_client_id`. * @summary Create a new originator * @param {TransferOriginatorCreateRequest} transferOriginatorCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorCreate: (transferOriginatorCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferOriginatorCreateRequest' is not null or undefined common_1.assertParamExists('transferOriginatorCreate', 'transferOriginatorCreateRequest', transferOriginatorCreateRequest); const localVarPath = `/transfer/originator/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferOriginatorCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/originator/funding_account/update` endpoint to update the funding account associated with the originator. * @summary Update the funding account associated with the originator * @param {TransferOriginatorFundingAccountUpdateRequest} transferOriginatorFundingAccountUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorFundingAccountUpdate: (transferOriginatorFundingAccountUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferOriginatorFundingAccountUpdateRequest' is not null or undefined common_1.assertParamExists('transferOriginatorFundingAccountUpdate', 'transferOriginatorFundingAccountUpdateRequest', transferOriginatorFundingAccountUpdateRequest); const localVarPath = `/transfer/originator/funding_account/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferOriginatorFundingAccountUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/originator/get` endpoint gets status updates for an originator\'s onboarding process. This information is also available via the Transfer page on the Plaid dashboard. * @summary Get status of an originator\'s onboarding * @param {TransferOriginatorGetRequest} transferOriginatorGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorGet: (transferOriginatorGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferOriginatorGetRequest' is not null or undefined common_1.assertParamExists('transferOriginatorGet', 'transferOriginatorGetRequest', transferOriginatorGetRequest); const localVarPath = `/transfer/originator/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferOriginatorGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/originator/list` endpoint gets status updates for all of your originators\' onboarding. This information is also available via the Plaid dashboard. * @summary Get status of all originators\' onboarding * @param {TransferOriginatorListRequest} transferOriginatorListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorList: (transferOriginatorListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferOriginatorListRequest' is not null or undefined common_1.assertParamExists('transferOriginatorList', 'transferOriginatorListRequest', transferOriginatorListRequest); const localVarPath = `/transfer/originator/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferOriginatorListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/platform/originator/create` endpoint allows gathering information about the originator specific to the Scaled Platform Transfer offering, including the originator\'s agreement to legal terms required before accepting any further information related to the originator. * @summary Create an originator for scaled platform customers * @param {TransferPlatformOriginatorCreateRequest} transferPlatformOriginatorCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferPlatformOriginatorCreate: (transferPlatformOriginatorCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferPlatformOriginatorCreateRequest' is not null or undefined common_1.assertParamExists('transferPlatformOriginatorCreate', 'transferPlatformOriginatorCreateRequest', transferPlatformOriginatorCreateRequest); const localVarPath = `/transfer/platform/originator/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferPlatformOriginatorCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/platform/person/create` endpoint to create a person record associated with an originator and optionally submit person-specific requirements. * @summary Create a person associated with an originator * @param {TransferPlatformPersonCreateRequest} transferPlatformPersonCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferPlatformPersonCreate: (transferPlatformPersonCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferPlatformPersonCreateRequest' is not null or undefined common_1.assertParamExists('transferPlatformPersonCreate', 'transferPlatformPersonCreateRequest', transferPlatformPersonCreateRequest); const localVarPath = `/transfer/platform/person/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferPlatformPersonCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/platform/requirement/submit` endpoint allows platforms to submit onboarding requirements for an originator as part of the Scaled Platform Transfer offering. * @summary Submit onboarding requirements for Scaled Platform originators * @param {TransferPlatformRequirementSubmitRequest} transferPlatformRequirementSubmitRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferPlatformRequirementSubmit: (transferPlatformRequirementSubmitRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferPlatformRequirementSubmitRequest' is not null or undefined common_1.assertParamExists('transferPlatformRequirementSubmit', 'transferPlatformRequirementSubmitRequest', transferPlatformRequirementSubmitRequest); const localVarPath = `/transfer/platform/requirement/submit`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferPlatformRequirementSubmitRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/questionnaire/create` endpoint generates a Plaid-hosted onboarding UI URL. Redirect the originator to this URL to provide their due diligence information and agree to Plaid’s terms for ACH money movement. * @summary Generate a Plaid-hosted onboarding UI URL. * @param {TransferQuestionnaireCreateRequest} transferQuestionnaireCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferQuestionnaireCreate: (transferQuestionnaireCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferQuestionnaireCreateRequest' is not null or undefined common_1.assertParamExists('transferQuestionnaireCreate', 'transferQuestionnaireCreateRequest', transferQuestionnaireCreateRequest); const localVarPath = `/transfer/questionnaire/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferQuestionnaireCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringCancel: (transferRecurringCancelRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferRecurringCancelRequest' is not null or undefined common_1.assertParamExists('transferRecurringCancel', 'transferRecurringCancelRequest', transferRecurringCancelRequest); const localVarPath = `/transfer/recurring/cancel`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferRecurringCancelRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/recurring/create` endpoint to initiate a new recurring transfer. This capability is not currently supported for Transfer UI or Platform Payments (beta) customers. * @summary Create a recurring transfer * @param {TransferRecurringCreateRequest} transferRecurringCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringCreate: (transferRecurringCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferRecurringCreateRequest' is not null or undefined common_1.assertParamExists('transferRecurringCreate', 'transferRecurringCreateRequest', transferRecurringCreateRequest); const localVarPath = `/transfer/recurring/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferRecurringCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/recurring/get` fetches information about the recurring transfer corresponding to the given `recurring_transfer_id`. * @summary Retrieve a recurring transfer * @param {TransferRecurringGetRequest} transferRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringGet: (transferRecurringGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferRecurringGetRequest' is not null or undefined common_1.assertParamExists('transferRecurringGet', 'transferRecurringGetRequest', transferRecurringGetRequest); const localVarPath = `/transfer/recurring/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferRecurringGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/recurring/list` endpoint to see a list of all your recurring transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired recurring transfers. * @summary List recurring transfers * @param {TransferRecurringListRequest} transferRecurringListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringList: (transferRecurringListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferRecurringListRequest' is not null or undefined common_1.assertParamExists('transferRecurringList', 'transferRecurringListRequest', transferRecurringListRequest); const localVarPath = `/transfer/recurring/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferRecurringListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/refund/cancel` endpoint to cancel a refund. A refund is eligible for cancellation if it has not yet been submitted to the payment network. * @summary Cancel a refund * @param {TransferRefundCancelRequest} transferRefundCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRefundCancel: (transferRefundCancelRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferRefundCancelRequest' is not null or undefined common_1.assertParamExists('transferRefundCancel', 'transferRefundCancelRequest', transferRefundCancelRequest); const localVarPath = `/transfer/refund/cancel`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferRefundCancelRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Use the `/transfer/refund/create` endpoint to create a refund for a transfer. A transfer can be refunded if the transfer was initiated in the past 180 days. Refunds come out of the available balance of the ledger used for the original debit transfer. If there are not enough funds in the available balance to cover the refund amount, the refund will be rejected. You can create a refund at any time. Plaid does not impose any hold time on refunds. * @summary Create a refund * @param {TransferRefundCreateRequest} transferRefundCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRefundCreate: (transferRefundCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferRefundCreateRequest' is not null or undefined common_1.assertParamExists('transferRefundCreate', 'transferRefundCreateRequest', transferRefundCreateRequest); const localVarPath = `/transfer/refund/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferRefundCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/refund/get` endpoint fetches information about the refund corresponding to the given `refund_id`. * @summary Retrieve a refund * @param {TransferRefundGetRequest} transferRefundGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRefundGet: (transferRefundGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferRefundGetRequest' is not null or undefined common_1.assertParamExists('transferRefundGet', 'transferRefundGetRequest', transferRefundGetRequest); const localVarPath = `/transfer/refund/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferRefundGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/repayment/list` endpoint fetches repayments matching the given filters. Repayments are returned in reverse-chronological order (most recent first) starting at the given `start_time`. * @summary Lists historical repayments * @param {TransferRepaymentListRequest} transferRepaymentListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRepaymentList: (transferRepaymentListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferRepaymentListRequest' is not null or undefined common_1.assertParamExists('transferRepaymentList', 'transferRepaymentListRequest', transferRepaymentListRequest); const localVarPath = `/transfer/repayment/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferRepaymentListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/repayment/return/list` endpoint retrieves the set of returns that were batched together into the specified repayment. The sum of amounts of returns retrieved by this request equals the amount of the repayment. * @summary List the returns included in a repayment * @param {TransferRepaymentReturnListRequest} transferRepaymentReturnListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRepaymentReturnList: (transferRepaymentReturnListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferRepaymentReturnListRequest' is not null or undefined common_1.assertParamExists('transferRepaymentReturnList', 'transferRepaymentReturnListRequest', transferRepaymentReturnListRequest); const localVarPath = `/transfer/repayment/return/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferRepaymentReturnListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep * @param {TransferSweepGetRequest} transferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferSweepGet: (transferSweepGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferSweepGetRequest' is not null or undefined common_1.assertParamExists('transferSweepGet', 'transferSweepGetRequest', transferSweepGetRequest); const localVarPath = `/transfer/sweep/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferSweepGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * The `/transfer/sweep/list` endpoint fetches sweeps matching the given filters. * @summary List sweeps * @param {TransferSweepListRequest} transferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferSweepList: (transferSweepListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'transferSweepListRequest' is not null or undefined common_1.assertParamExists('transferSweepList', 'transferSweepListRequest', transferSweepListRequest); const localVarPath = `/transfer/sweep/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(transferSweepListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Returns user permissioned account data including identity and Item access tokens. * @summary Retrieve User Account * @param {UserAccountSessionGetRequest} userAccountSessionGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userAccountSessionGet: (userAccountSessionGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'userAccountSessionGetRequest' is not null or undefined common_1.assertParamExists('userAccountSessionGet', 'userAccountSessionGetRequest', userAccountSessionGetRequest); const localVarPath = `/user_account/session/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(userAccountSessionGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint should be called for each of your end users before they begin a Plaid Check or Income flow, or a Multi-Item Link flow. This provides you a single token to access all data associated with the user. You should only create one per end user. The `consumer_report_user_identity` object must be present in order to create a Plaid Check Consumer Report for a user. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If you call the endpoint multiple times with the same `client_user_id`, the first creation call will succeed and the rest will fail with an error message indicating that the user has been created for the given `client_user_id`. Ensure that you store the `user_token` along with your user\'s identifier in your database, as it is not possible to retrieve a previously created `user_token`. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userCreate: (userCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'userCreateRequest' is not null or undefined common_1.assertParamExists('userCreate', 'userCreateRequest', userCreateRequest); const localVarPath = `/user/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(userCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Returns Items associated with a User along with their corresponding statuses. * @summary Get Items associated with a User * @param {UserItemsGetRequest} userItemsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userItemsGet: (userItemsGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'userItemsGetRequest' is not null or undefined common_1.assertParamExists('userItemsGet', 'userItemsGetRequest', userItemsGetRequest); const localVarPath = `/user/items/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(userItemsGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * `/user/remove` deletes a user token and and associated information, including any Items associated with the token. Any subsequent calls to retrieve information using the same user token will result in an error stating the user does not exist. * @summary Remove user * @param {UserRemoveRequest} userRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userRemove: (userRemoveRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'userRemoveRequest' is not null or undefined common_1.assertParamExists('userRemove', 'userRemoveRequest', userRemoveRequest); const localVarPath = `/user/remove`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(userRemoveRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint is used to create a third-party user token. This token can be shared with and used by a specified third-party client to access data associated with the user through supported endpoints. Ensure you store the `third_party_user_token` along with the `user_token` and `third_party_client_id`, as it is not possible to retrieve a previously created `third_party_user_token`. * @summary Create a third-party user token * @param {UserThirdPartyTokenCreateRequest} userThirdPartyTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userThirdPartyTokenCreate: (userThirdPartyTokenCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'userThirdPartyTokenCreateRequest' is not null or undefined common_1.assertParamExists('userThirdPartyTokenCreate', 'userThirdPartyTokenCreateRequest', userThirdPartyTokenCreateRequest); const localVarPath = `/user/third_party_token/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(userThirdPartyTokenCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userThirdPartyTokenRemove: (userThirdPartyTokenRemoveRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'userThirdPartyTokenRemoveRequest' is not null or undefined common_1.assertParamExists('userThirdPartyTokenRemove', 'userThirdPartyTokenRemoveRequest', userThirdPartyTokenRemoveRequest); const localVarPath = `/user/third_party_token/remove`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(userThirdPartyTokenRemoveRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint is used to update user information associated with an existing `user_token`. It can also be used to enable an existing `user_token` for use with Consumer Reports by Plaid Check, by adding a `consumer_report_user_identity` object to the user. Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. * @summary Update user information * @param {UserUpdateRequest} userUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userUpdate: (userUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'userUpdateRequest' is not null or undefined common_1.assertParamExists('userUpdate', 'userUpdateRequest', userUpdateRequest); const localVarPath = `/user/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(userUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Create an e-wallet. The response is the newly created e-wallet object. * @summary Create an e-wallet * @param {WalletCreateRequest} walletCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletCreate: (walletCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'walletCreateRequest' is not null or undefined common_1.assertParamExists('walletCreate', 'walletCreateRequest', walletCreateRequest); const localVarPath = `/wallet/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(walletCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Fetch an e-wallet. The response includes the current balance. * @summary Fetch an e-wallet * @param {WalletGetRequest} walletGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletGet: (walletGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'walletGetRequest' is not null or undefined common_1.assertParamExists('walletGet', 'walletGetRequest', walletGetRequest); const localVarPath = `/wallet/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(walletGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint lists all e-wallets in descending order of creation. * @summary Fetch a list of e-wallets * @param {WalletListRequest} walletListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletList: (walletListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'walletListRequest' is not null or undefined common_1.assertParamExists('walletList', 'walletListRequest', walletListRequest); const localVarPath = `/wallet/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(walletListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Execute a transaction using the specified e-wallet. Specify the e-wallet to debit from, the counterparty to credit to, the idempotency key to prevent duplicate transactions, the amount and reference for the transaction. Transactions will settle in seconds to several days, depending on the underlying payment rail. * @summary Execute a transaction using an e-wallet * @param {WalletTransactionExecuteRequest} walletTransactionExecuteRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletTransactionExecute: (walletTransactionExecuteRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'walletTransactionExecuteRequest' is not null or undefined common_1.assertParamExists('walletTransactionExecute', 'walletTransactionExecuteRequest', walletTransactionExecuteRequest); const localVarPath = `/wallet/transaction/execute`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(walletTransactionExecuteRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Fetch a specific e-wallet transaction * @summary Fetch an e-wallet transaction * @param {WalletTransactionGetRequest} walletTransactionGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletTransactionGet: (walletTransactionGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'walletTransactionGetRequest' is not null or undefined common_1.assertParamExists('walletTransactionGet', 'walletTransactionGetRequest', walletTransactionGetRequest); const localVarPath = `/wallet/transaction/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(walletTransactionGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * This endpoint lists the latest transactions of the specified e-wallet. Transactions are returned in descending order by the `created_at` time. * @summary List e-wallet transactions * @param {WalletTransactionListRequest} walletTransactionListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletTransactionList: (walletTransactionListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'walletTransactionListRequest' is not null or undefined common_1.assertParamExists('walletTransactionList', 'walletTransactionListRequest', walletTransactionListRequest); const localVarPath = `/wallet/transaction/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(walletTransactionListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Create a new entity watchlist screening to check your customer against watchlists defined in the associated entity watchlist program. If your associated program has ongoing screening enabled, this is the profile information that will be used to monitor your customer over time. * @summary Create a watchlist screening for an entity * @param {WatchlistScreeningEntityCreateRequest} watchlistScreeningEntityCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityCreate: (watchlistScreeningEntityCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningEntityCreateRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningEntityCreate', 'watchlistScreeningEntityCreateRequest', watchlistScreeningEntityCreateRequest); const localVarPath = `/watchlist_screening/entity/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningEntityCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Retrieve an entity watchlist screening. * @summary Get an entity screening * @param {WatchlistScreeningEntityGetRequest} watchlistScreeningEntityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityGet: (watchlistScreeningEntityGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningEntityGetRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningEntityGet', 'watchlistScreeningEntityGetRequest', watchlistScreeningEntityGetRequest); const localVarPath = `/watchlist_screening/entity/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningEntityGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List all changes to the entity watchlist screening in reverse-chronological order. If the watchlist screening has not been edited, no history will be returned. * @summary List history for entity watchlist screenings * @param {WatchlistScreeningEntityHistoryListRequest} watchlistScreeningEntityHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityHistoryList: (watchlistScreeningEntityHistoryListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningEntityHistoryListRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningEntityHistoryList', 'watchlistScreeningEntityHistoryListRequest', watchlistScreeningEntityHistoryListRequest); const localVarPath = `/watchlist_screening/entity/history/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningEntityHistoryListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List all hits for the entity watchlist screening. * @summary List hits for entity watchlist screenings * @param {WatchlistScreeningEntityHitListRequest} watchlistScreeningEntityHitListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityHitList: (watchlistScreeningEntityHitListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningEntityHitListRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningEntityHitList', 'watchlistScreeningEntityHitListRequest', watchlistScreeningEntityHitListRequest); const localVarPath = `/watchlist_screening/entity/hit/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningEntityHitListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List all entity screenings. * @summary List entity watchlist screenings * @param {WatchlistScreeningEntityListRequest} watchlistScreeningEntityListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityList: (watchlistScreeningEntityListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningEntityListRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningEntityList', 'watchlistScreeningEntityListRequest', watchlistScreeningEntityListRequest); const localVarPath = `/watchlist_screening/entity/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningEntityListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Get an entity watchlist screening program * @summary Get entity watchlist screening program * @param {WatchlistScreeningEntityProgramGetRequest} watchlistScreeningEntityProgramGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityProgramGet: (watchlistScreeningEntityProgramGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningEntityProgramGetRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningEntityProgramGet', 'watchlistScreeningEntityProgramGetRequest', watchlistScreeningEntityProgramGetRequest); const localVarPath = `/watchlist_screening/entity/program/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningEntityProgramGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List all entity watchlist screening programs * @summary List entity watchlist screening programs * @param {WatchlistScreeningEntityProgramListRequest} watchlistScreeningEntityProgramListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityProgramList: (watchlistScreeningEntityProgramListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningEntityProgramListRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningEntityProgramList', 'watchlistScreeningEntityProgramListRequest', watchlistScreeningEntityProgramListRequest); const localVarPath = `/watchlist_screening/entity/program/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningEntityProgramListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Create a review for an entity watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary Create a review for an entity watchlist screening * @param {WatchlistScreeningEntityReviewCreateRequest} watchlistScreeningEntityReviewCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityReviewCreate: (watchlistScreeningEntityReviewCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningEntityReviewCreateRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningEntityReviewCreate', 'watchlistScreeningEntityReviewCreateRequest', watchlistScreeningEntityReviewCreateRequest); const localVarPath = `/watchlist_screening/entity/review/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningEntityReviewCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List all reviews for a particular entity watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary List reviews for entity watchlist screenings * @param {WatchlistScreeningEntityReviewListRequest} watchlistScreeningEntityReviewListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityReviewList: (watchlistScreeningEntityReviewListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningEntityReviewListRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningEntityReviewList', 'watchlistScreeningEntityReviewListRequest', watchlistScreeningEntityReviewListRequest); const localVarPath = `/watchlist_screening/entity/review/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningEntityReviewListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Update an entity watchlist screening. * @summary Update an entity screening * @param {WatchlistScreeningEntityUpdateRequest} watchlistScreeningEntityUpdateRequest The entity screening was successfully updated. * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityUpdate: (watchlistScreeningEntityUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningEntityUpdateRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningEntityUpdate', 'watchlistScreeningEntityUpdateRequest', watchlistScreeningEntityUpdateRequest); const localVarPath = `/watchlist_screening/entity/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningEntityUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Create a new Watchlist Screening to check your customer against watchlists defined in the associated Watchlist Program. If your associated program has ongoing screening enabled, this is the profile information that will be used to monitor your customer over time. * @summary Create a watchlist screening for a person * @param {WatchlistScreeningIndividualCreateRequest} watchlistScreeningIndividualCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualCreate: (watchlistScreeningIndividualCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningIndividualCreateRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningIndividualCreate', 'watchlistScreeningIndividualCreateRequest', watchlistScreeningIndividualCreateRequest); const localVarPath = `/watchlist_screening/individual/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningIndividualCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Retrieve a previously created individual watchlist screening * @summary Retrieve an individual watchlist screening * @param {WatchlistScreeningIndividualGetRequest} watchlistScreeningIndividualGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualGet: (watchlistScreeningIndividualGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningIndividualGetRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningIndividualGet', 'watchlistScreeningIndividualGetRequest', watchlistScreeningIndividualGetRequest); const localVarPath = `/watchlist_screening/individual/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningIndividualGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List all changes to the individual watchlist screening in reverse-chronological order. If the watchlist screening has not been edited, no history will be returned. * @summary List history for individual watchlist screenings * @param {WatchlistScreeningIndividualHistoryListRequest} watchlistScreeningIndividualHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualHistoryList: (watchlistScreeningIndividualHistoryListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningIndividualHistoryListRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningIndividualHistoryList', 'watchlistScreeningIndividualHistoryListRequest', watchlistScreeningIndividualHistoryListRequest); const localVarPath = `/watchlist_screening/individual/history/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningIndividualHistoryListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List all hits found by Plaid for a particular individual watchlist screening. * @summary List hits for individual watchlist screening * @param {WatchlistScreeningIndividualHitListRequest} watchlistScreeningIndividualHitListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualHitList: (watchlistScreeningIndividualHitListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningIndividualHitListRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningIndividualHitList', 'watchlistScreeningIndividualHitListRequest', watchlistScreeningIndividualHitListRequest); const localVarPath = `/watchlist_screening/individual/hit/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningIndividualHitListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List previously created watchlist screenings for individuals * @summary List Individual Watchlist Screenings * @param {WatchlistScreeningIndividualListRequest} watchlistScreeningIndividualListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualList: (watchlistScreeningIndividualListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningIndividualListRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningIndividualList', 'watchlistScreeningIndividualListRequest', watchlistScreeningIndividualListRequest); const localVarPath = `/watchlist_screening/individual/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningIndividualListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Get an individual watchlist screening program * @summary Get individual watchlist screening program * @param {WatchlistScreeningIndividualProgramGetRequest} watchlistScreeningIndividualProgramGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualProgramGet: (watchlistScreeningIndividualProgramGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningIndividualProgramGetRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningIndividualProgramGet', 'watchlistScreeningIndividualProgramGetRequest', watchlistScreeningIndividualProgramGetRequest); const localVarPath = `/watchlist_screening/individual/program/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningIndividualProgramGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List all individual watchlist screening programs * @summary List individual watchlist screening programs * @param {WatchlistScreeningIndividualProgramListRequest} watchlistScreeningIndividualProgramListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualProgramList: (watchlistScreeningIndividualProgramListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningIndividualProgramListRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningIndividualProgramList', 'watchlistScreeningIndividualProgramListRequest', watchlistScreeningIndividualProgramListRequest); const localVarPath = `/watchlist_screening/individual/program/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningIndividualProgramListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Create a review for the individual watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary Create a review for an individual watchlist screening * @param {WatchlistScreeningIndividualReviewCreateRequest} watchlistScreeningIndividualReviewCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualReviewCreate: (watchlistScreeningIndividualReviewCreateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningIndividualReviewCreateRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningIndividualReviewCreate', 'watchlistScreeningIndividualReviewCreateRequest', watchlistScreeningIndividualReviewCreateRequest); const localVarPath = `/watchlist_screening/individual/review/create`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningIndividualReviewCreateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * List all reviews for the individual watchlist screening. * @summary List reviews for individual watchlist screenings * @param {WatchlistScreeningIndividualReviewListRequest} watchlistScreeningIndividualReviewListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualReviewList: (watchlistScreeningIndividualReviewListRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningIndividualReviewListRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningIndividualReviewList', 'watchlistScreeningIndividualReviewListRequest', watchlistScreeningIndividualReviewListRequest); const localVarPath = `/watchlist_screening/individual/review/list`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningIndividualReviewListRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Update a specific individual watchlist screening. This endpoint can be used to add additional customer information, correct outdated information, add a reference id, assign the individual to a reviewer, and update which program it is associated with. Please note that you may not update `search_terms` and `status` at the same time since editing `search_terms` may trigger an automatic `status` change. * @summary Update individual watchlist screening * @param {WatchlistScreeningIndividualUpdateRequest} watchlistScreeningIndividualUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualUpdate: (watchlistScreeningIndividualUpdateRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'watchlistScreeningIndividualUpdateRequest' is not null or undefined common_1.assertParamExists('watchlistScreeningIndividualUpdate', 'watchlistScreeningIndividualUpdateRequest', watchlistScreeningIndividualUpdateRequest); const localVarPath = `/watchlist_screening/individual/update`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(watchlistScreeningIndividualUpdateRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), /** * Plaid signs all outgoing webhooks and provides JSON Web Tokens (JWTs) so that you can verify the authenticity of any incoming webhooks to your application. A message signature is included in the `Plaid-Verification` header. The `/webhook_verification_key/get` endpoint provides a JSON Web Key (JWK) that can be used to verify a JWT. * @summary Get webhook verification key * @param {WebhookVerificationKeyGetRequest} webhookVerificationKeyGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ webhookVerificationKeyGet: (webhookVerificationKeyGetRequest, options = {}) => __awaiter(this, void 0, void 0, function* () { // verify required parameter 'webhookVerificationKeyGetRequest' is not null or undefined common_1.assertParamExists('webhookVerificationKeyGet', 'webhookVerificationKeyGetRequest', webhookVerificationKeyGetRequest); const localVarPath = `/webhook_verification_key/get`; // use dummy base URL string because the URL constructor only accepts absolute URLs. const localVarUrlObj = new URL(localVarPath, common_1.DUMMY_BASE_URL); let baseOptions; if (configuration) { baseOptions = configuration.baseOptions; } const localVarRequestOptions = Object.assign(Object.assign({ method: 'POST' }, baseOptions), options); const localVarHeaderParameter = {}; const localVarQueryParameter = {}; // authentication clientId required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-CLIENT-ID", configuration); // authentication plaidVersion required yield common_1.setApiKeyToObject(localVarHeaderParameter, "Plaid-Version", configuration); // authentication secret required yield common_1.setApiKeyToObject(localVarHeaderParameter, "PLAID-SECRET", configuration); localVarHeaderParameter['Content-Type'] = 'application/json'; common_1.setSearchParams(localVarUrlObj, localVarQueryParameter, options.query); let headersFromBaseOptions = baseOptions && baseOptions.headers ? baseOptions.headers : {}; localVarRequestOptions.headers = Object.assign(Object.assign(Object.assign({}, localVarHeaderParameter), headersFromBaseOptions), options.headers); localVarRequestOptions.data = common_1.serializeDataIfNeeded(webhookVerificationKeyGetRequest, localVarRequestOptions, configuration); return { url: common_1.toPathString(localVarUrlObj), options: localVarRequestOptions, }; }), }; }; exports.PlaidApiAxiosParamCreator = PlaidApiAxiosParamCreator; /** * PlaidApi - functional programming interface * @export */ const PlaidApiFp = function (configuration) { const localVarAxiosParamCreator = exports.PlaidApiAxiosParamCreator(configuration); return { /** * The `/accounts/balance/get` endpoint returns the real-time balance for each of an Item\'s accounts. While other endpoints, such as `/accounts/get`, return a balance object, only `/accounts/balance/get` forces the available and current balance fields to be refreshed rather than cached. This endpoint can be used for existing Items that were added via any of Plaid’s other products. This endpoint can be used as long as Link has been initialized with any other product, `balance` itself is not a product that can be used to initialize Link. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. * @summary Retrieve real-time balance data * @param {AccountsBalanceGetRequest} accountsBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ accountsBalanceGet(accountsBalanceGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.accountsBalanceGet(accountsBalanceGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/accounts/get` endpoint can be used to retrieve a list of accounts associated with any linked Item. Plaid will only return active bank accounts — that is, accounts that are not closed and are capable of carrying a balance. To return new accounts that were created after the user linked their Item, you can listen for the [`NEW_ACCOUNTS_AVAILABLE`](https://plaid.com/docs/api/items/#new_accounts_available) webhook and then use Link\'s [update mode](https://plaid.com/docs/link/update-mode/) to request that the user share this new account with you. `/accounts/get` is free to use and retrieves cached information, rather than extracting fresh information from the institution. The balance returned will reflect the balance at the time of the last successful Item update. If the Item is enabled for a regularly updating product, such as Transactions, Investments, or Liabilities, the balance will typically update about once a day, as long as the Item is healthy. If the Item is enabled only for products that do not frequently update, such as Auth or Identity, balance data may be much older. For realtime balance information, use the paid endpoint `/accounts/balance/get` instead. * @summary Retrieve accounts * @param {AccountsGetRequest} accountsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ accountsGet(accountsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.accountsGet(accountsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Allows financial institutions to retrieve information about Plaid clients for the purpose of building control-tower experiences * @summary Retrieve information about a Plaid application * @param {ApplicationGetRequest} applicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ applicationGet(applicationGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.applicationGet(applicationGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Plaid can provide an Audit Copy of any Asset Report directly to a participating third party on your behalf. For example, Plaid can supply an Audit Copy directly to Fannie Mae on your behalf if you participate in the Day 1 Certainty™ program. An Audit Copy contains the same underlying data as the Asset Report. To grant access to an Audit Copy, use the `/asset_report/audit_copy/create` endpoint to create an `audit_copy_token` and then pass that token to the third party who needs access. Each third party has its own `auditor_id`, for example `fannie_mae`. You’ll need to create a separate Audit Copy for each third party to whom you want to grant access to the Report. * @summary Create Asset Report Audit Copy * @param {AssetReportAuditCopyCreateRequest} assetReportAuditCopyCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportAuditCopyCreate(assetReportAuditCopyCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.assetReportAuditCopyCreate(assetReportAuditCopyCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/asset_report/audit_copy/get` allows auditors to get a copy of an Asset Report that was previously shared via the `/asset_report/audit_copy/create` endpoint. The caller of `/asset_report/audit_copy/create` must provide the `audit_copy_token` to the auditor. This token can then be used to call `/asset_report/audit_copy/create`. * @summary Retrieve an Asset Report Audit Copy * @param {AssetReportAuditCopyGetRequest} assetReportAuditCopyGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportAuditCopyGet(assetReportAuditCopyGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.assetReportAuditCopyGet(assetReportAuditCopyGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/asset_report/audit_copy/remove` endpoint allows you to remove an Audit Copy. Removing an Audit Copy invalidates the `audit_copy_token` associated with it, meaning both you and any third parties holding the token will no longer be able to use it to access Report data. Items associated with the Asset Report, the Asset Report itself and other Audit Copies of it are not affected and will remain accessible after removing the given Audit Copy. * @summary Remove Asset Report Audit Copy * @param {AssetReportAuditCopyRemoveRequest} assetReportAuditCopyRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportAuditCopyRemove(assetReportAuditCopyRemoveRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.assetReportAuditCopyRemove(assetReportAuditCopyRemoveRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/asset_report/create` endpoint initiates the process of creating an Asset Report, which can then be retrieved by passing the `asset_report_token` return value to the `/asset_report/get` or `/asset_report/pdf/get` endpoints. The Asset Report takes some time to be created and is not available immediately after calling `/asset_report/create`. The exact amount of time to create the report will vary depending on how many days of history are requested and will typically range from a few seconds to about one minute. When the Asset Report is ready to be retrieved using `/asset_report/get` or `/asset_report/pdf/get`, Plaid will fire a `PRODUCT_READY` webhook. For full details of the webhook schema, see [Asset Report webhooks](https://plaid.com/docs/api/products/assets/#webhooks). The `/asset_report/create` endpoint creates an Asset Report at a moment in time. Asset Reports are immutable. To get an updated Asset Report, use the `/asset_report/refresh` endpoint. * @summary Create an Asset Report * @param {AssetReportCreateRequest} assetReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportCreate(assetReportCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.assetReportCreate(assetReportCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * By default, an Asset Report will contain all of the accounts on a given Item. In some cases, you may not want the Asset Report to contain all accounts. For example, you might have the end user choose which accounts are relevant in Link using the Account Select view, which you can enable in the dashboard. Or, you might always exclude certain account types or subtypes, which you can identify by using the `/accounts/get` endpoint. To narrow an Asset Report to only a subset of accounts, use the `/asset_report/filter` endpoint. To exclude certain Accounts from an Asset Report, first use the `/asset_report/create` endpoint to create the report, then send the `asset_report_token` along with a list of `account_ids` to exclude to the `/asset_report/filter` endpoint, to create a new Asset Report which contains only a subset of the original Asset Report\'s data. Because Asset Reports are immutable, calling `/asset_report/filter` does not alter the original Asset Report in any way; rather, `/asset_report/filter` creates a new Asset Report with a new token and id. Asset Reports created via `/asset_report/filter` do not contain new Asset data, and are not billed. Plaid will fire a [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook once generation of the filtered Asset Report has completed. * @summary Filter Asset Report * @param {AssetReportFilterRequest} assetReportFilterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportFilter(assetReportFilterRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.assetReportFilter(assetReportFilterRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportGet(assetReportGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.assetReportGet(assetReportGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/asset_report/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/asset_report/pdf/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/asset_report/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). * @summary Retrieve a PDF Asset Report * @param {AssetReportPDFGetRequest} assetReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportPdfGet(assetReportPDFGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.assetReportPdfGet(assetReportPDFGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * An Asset Report is an immutable snapshot of a user\'s assets. In order to \"refresh\" an Asset Report you created previously, you can use the `/asset_report/refresh` endpoint to create a new Asset Report based on the old one, but with the most recent data available. The new Asset Report will contain the same Items as the original Report, as well as the same filters applied by any call to `/asset_report/filter`. By default, the new Asset Report will also use the same parameters you submitted with your original `/asset_report/create` request, but the original `days_requested` value and the values of any parameters in the `options` object can be overridden with new values. To change these arguments, simply supply new values for them in your request to `/asset_report/refresh`. Submit an empty string (\"\") for any previously-populated fields you would like set as empty. * @summary Refresh an Asset Report * @param {AssetReportRefreshRequest} assetReportRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportRefresh(assetReportRefreshRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.assetReportRefresh(assetReportRefreshRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/item/remove` endpoint allows you to invalidate an `access_token`, meaning you will not be able to create new Asset Reports with it. Removing an Item does not affect any Asset Reports or Audit Copies you have already created, which will remain accessible until you remove them specifically. The `/asset_report/remove` endpoint allows you to remove access to an Asset Report. Removing an Asset Report invalidates its `asset_report_token`, meaning you will no longer be able to use it to access Report data or create new Audit Copies. Removing an Asset Report does not affect the underlying Items, but does invalidate any `audit_copy_tokens` associated with the Asset Report. * @summary Delete an Asset Report * @param {AssetReportRemoveRequest} assetReportRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportRemove(assetReportRemoveRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.assetReportRemove(assetReportRemoveRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/auth/get` endpoint returns the bank account and bank identification numbers (such as routing numbers, for US accounts) associated with an Item\'s checking, savings, and cash management accounts, along with high-level account data and balances when available. Versioning note: In API version 2017-03-08, the schema of the `numbers` object returned by this endpoint is substantially different. For details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2018-05-22). * @summary Retrieve auth data * @param {AuthGetRequest} authGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ authGet(authGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.authGet(authGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. * @summary Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferBalanceGet(bankTransferBalanceGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferBalanceGet(bankTransferBalanceGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. * @summary Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferCancel(bankTransferCancelRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferCancel(bankTransferCancelRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. * @summary Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferCreate(bankTransferCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferCreate(bankTransferCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/bank_transfer/event/list` endpoint to get a list of Plaid-initiated ACH or bank transfer events based on specified filter criteria. When using Auth with micro-deposit verification enabled, this endpoint can be used to fetch status updates on ACH micro-deposits. For more details, see [micro-deposit events](https://plaid.com/docs/auth/coverage/microdeposit-events/). * @summary List bank transfer events * @param {BankTransferEventListRequest} bankTransferEventListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferEventList(bankTransferEventListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferEventList(bankTransferEventListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/bank_transfer/event/sync` allows you to request up to the next 25 Plaid-initiated bank transfer events that happened after a specific `event_id`. When using Auth with micro-deposit verification enabled, this endpoint can be used to fetch status updates on ACH micro-deposits. For more details, see [micro-deposit events](https://www.plaid.com/docs/auth/coverage/microdeposit-events/). * @summary Sync bank transfer events * @param {BankTransferEventSyncRequest} bankTransferEventSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferEventSync(bankTransferEventSyncRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferEventSync(bankTransferEventSyncRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. * @summary Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferGet(bankTransferGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferGet(bankTransferGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. * @summary List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferList(bankTransferListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferList(bankTransferListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid Account Manager. * @summary Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferMigrateAccount(bankTransferMigrateAccountRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferMigrateAccount(bankTransferMigrateAccountRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferSweepGet(bankTransferSweepGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferSweepGet(bankTransferSweepGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. * @summary List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferSweepList(bankTransferSweepListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.bankTransferSweepList(bankTransferSweepListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. * @summary Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconAccountRiskEvaluate(beaconAccountRiskEvaluateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconAccountRiskEvaluate(beaconAccountRiskEvaluateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. * @summary Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconDuplicateGet(beaconDuplicateGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconDuplicateGet(beaconDuplicateGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Create a fraud report for a given Beacon User. * @summary Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportCreate(beaconReportCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconReportCreate(beaconReportCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Returns a Beacon report for a given Beacon report id. * @summary Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportGet(beaconReportGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconReportGet(beaconReportGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. * @summary List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportList(beaconReportListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconReportList(beaconReportListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. * @summary Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportSyndicationGet(beaconReportSyndicationGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconReportSyndicationGet(beaconReportSyndicationGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. * @summary List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportSyndicationList(beaconReportSyndicationListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconReportSyndicationList(beaconReportSyndicationListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. * @summary Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. * @summary Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserCreate(beaconUserCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconUserCreate(beaconUserCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. * @summary Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserGet(beaconUserGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconUserGet(beaconUserGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List all changes to the Beacon User in reverse-chronological order. * @summary List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserHistoryList(beaconUserHistoryListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconUserHistoryList(beaconUserHistoryListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to \"rejected\", we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to \"cleared\", we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to \"cleared\". There are no restrictions on updating a Beacon User\'s status to \"pending_review\". If these conditions are not met, the request will be rejected with an error explaining the issue. * @summary Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserReview(beaconUserReviewRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconUserReview(beaconUserReviewRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. * @summary Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserUpdate(beaconUserUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.beaconUserUpdate(beaconUserUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. All implementations are recommended to use the newer `personal_finance_category` taxonomy instead of the older `category` taxonomy supported by this endpoint. The [`personal_finance_category taxonomy` CSV file](https://plaid.com/documents/transactions-personal-finance-category-taxonomy.csv) is available for download and is not accessible via API. * @summary Get categories * @param {object} body * @param {*} [options] Override http request option. * @throws {RequiredError} */ categoriesGet(body, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.categoriesGet(body, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List a historical log of Item consent events. Consent logs are only available for events occurring on or after November 7, 2024. Up to three years of consent logs will be available via the endpoint. * @summary List a historical log of item consent events * @param {ConsentEventsGetRequest} consentEventsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ consentEventsGet(consentEventsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.consentEventsGet(consentEventsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Retrieves all existing CRB Bank Income and Base reports for the consumer in PDF format. Response is PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. * @summary Retrieve a PDF Reports * @param {ConsumerReportPDFGetRequest} consumerReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ consumerReportPdfGet(consumerReportPDFGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.consumerReportPdfGet(consumerReportPDFGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/cra/bank_income/create` creates a CRA report for income verification * @summary Create a CRA report for income verification * @param {CraBankIncomeCreateRequest} craBankIncomeCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craBankIncomeCreate(craBankIncomeCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craBankIncomeCreate(craBankIncomeCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/cra/bank_income/get` returns the bank income report(s) for a specified user. * @summary Retrieve information from the bank accounts used for income verification * @param {CraBankIncomeGetRequest} craBankIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craBankIncomeGet(craBankIncomeGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craBankIncomeGet(craBankIncomeGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint allows you to retrieve the Base Report for your user, allowing you to receive comprehensive bank account and cash flow data. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve a Base Report * @param {CraCheckReportBaseReportGetRequest} craCheckReportBaseReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report * @param {CraCheckReportCreateRequest} craCheckReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportCreate(craCheckReportCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craCheckReportCreate(craCheckReportCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow information from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_attributes` product or have generated a report using `/cra/check_report/create`, we will generate the attributes when you call this endpoint. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportPartnerInsightsGet(craCheckReportPartnerInsightsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craCheckReportPartnerInsightsGet(craCheckReportPartnerInsightsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/cra/check_report/pdf/get` retrieves the most recent Consumer Report in PDF format. By default, the most recent Base Report (if it exists) for the user will be returned. To request that the most recent Income Insights report be included in the PDF as well, use the `add-ons` field. * @summary Retrieve Consumer Reports as a PDF * @param {CraCheckReportPDFGetRequest} craCheckReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportPdfGet(craCheckReportPDFGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craCheckReportPdfGet(craCheckReportPDFGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/cra/loans/applications/register` registers loan applications and decisions. * @summary Register loan applications and decisions. * @param {CraLoansApplicationsRegisterRequest} craLoansApplicationsRegisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansApplicationsRegister(craLoansApplicationsRegisterRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craLoansApplicationsRegister(craLoansApplicationsRegisterRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/cra/loans/register` registers a list of loans to their applicants. * @summary Register a list of loans to their applicants. * @param {CRALoansRegisterRequest} cRALoansRegisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansRegister(cRALoansRegisterRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craLoansRegister(cRALoansRegisterRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/cra/loans/unregister` indicates the loans have reached a final status and no further updates are expected. * @summary Unregister a list of loans. * @param {CraLoansUnregisterRequest} craLoansUnregisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansUnregister(craLoansUnregisterRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craLoansUnregister(craLoansUnregisterRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/cra/loans/update` updates loan information such as the status and payment history. * @summary Updates loan data. * @param {CraLoansUpdateRequest} craLoansUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansUpdate(craLoansUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craLoansUpdate(craLoansUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint allows you to retrieve a Monitoring Insights report by passing in the `user_token` referred to in the webhook you received. * @summary Retrieve a Monitoring Insights Report * @param {CraMonitoringInsightsGetRequest} craMonitoringInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craMonitoringInsightsGet(craMonitoringInsightsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craMonitoringInsightsGet(craMonitoringInsightsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint allows you to subscribe to insights for a user\'s linked CRA items, which are updated every day (best-effort). * @summary Subscribe to Monitoring Insights * @param {CraMonitoringInsightsSubscribeRequest} craMonitoringInsightsSubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craMonitoringInsightsSubscribe(craMonitoringInsightsSubscribeRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craMonitoringInsightsSubscribe(craMonitoringInsightsSubscribeRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint allows you to unsubscribe from previously subscribed Monitoring Insights. * @summary Unsubscribe from Monitoring Insights * @param {CraMonitoringInsightsUnsubscribeRequest} craMonitoringInsightsUnsubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craMonitoringInsightsUnsubscribe(craMonitoringInsightsUnsubscribeRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craMonitoringInsightsUnsubscribe(craMonitoringInsightsUnsubscribeRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/cra/partner_insights/get` returns cash flow insights for a specified user. * @summary Retrieve cash flow insights from the bank accounts used for income verification * @param {CraPartnerInsightsGetRequest} craPartnerInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craPartnerInsightsGet(craPartnerInsightsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.craPartnerInsightsGet(craPartnerInsightsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ createPaymentToken(paymentInitiationPaymentTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.createPaymentToken(paymentInitiationPaymentTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `credit/asset_report/freddie_mac/get` endpoint retrieves the Asset Report in Freddie Mac\'s JSON format. * @summary Retrieve an Asset Report with Freddie Mac format. Only Freddie Mac can use this endpoint. * @param {{ [key: string]: object; }} requestBody * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditAssetReportFreddieMacGet(requestBody, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditAssetReportFreddieMacGet(requestBody, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Plaid can create an Audit Copy token of an Asset Report and/or Income Report to share with participating Government Sponsored Entity (GSE). If you participate in the Day 1 Certainty™ program, Plaid can supply an Audit Copy token directly to Fannie Mae on your behalf. An Audit Copy token contains the same underlying data as the Asset Report and/or Income Report (result of /credit/payroll_income/get). Use the `/credit/audit_copy_token/create` endpoint to create an `audit_copy_token` and then pass that token to the GSE who needs access. * @summary Create Asset or Income Report Audit Copy Token * @param {CreditAuditCopyTokenCreateRequest} creditAuditCopyTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditAuditCopyTokenCreate(creditAuditCopyTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditAuditCopyTokenCreate(creditAuditCopyTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/credit/audit_copy_token/update` endpoint updates an existing Audit Copy Token by adding the report tokens in the `report_tokens` field to the `audit_copy_token`. If the Audit Copy Token already contains a report of a certain type, it will be replaced with the token provided in the `report_tokens` field. * @summary Update an Audit Copy Token * @param {CreditAuditCopyTokenUpdateRequest} creditAuditCopyTokenUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditAuditCopyTokenUpdate(creditAuditCopyTokenUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditAuditCopyTokenUpdate(creditAuditCopyTokenUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/bank_employment/get` returns the employment report(s) derived from bank transaction data for a specified user. * @summary Retrieve information from the bank accounts used for employment verification * @param {CreditBankEmploymentGetRequest} creditBankEmploymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankEmploymentGet(creditBankEmploymentGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditBankEmploymentGet(creditBankEmploymentGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/bank_income/get` returns the bank income report(s) for a specified user. A single report corresponds to all institutions linked in a single Link session. To include multiple institutions in a single report, use [Multi-Item Link](https://plaid.com/docs/link/multi-item-link). To return older reports, use the `options.count` field. * @summary Retrieve information from the bank accounts used for income verification * @param {CreditBankIncomeGetRequest} creditBankIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomeGet(creditBankIncomeGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditBankIncomeGet(creditBankIncomeGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/bank_income/pdf/get` returns the most recent bank income report for a specified user in PDF format. A single report corresponds to all institutions linked in a single Link session. To include multiple institutions in a single report, use [Multi-Item Link](https://plaid.com/docs/link/multi-item-link). * @summary Retrieve information from the bank accounts used for income verification in PDF format * @param {CreditBankIncomePDFGetRequest} creditBankIncomePDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomePdfGet(creditBankIncomePDFGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditBankIncomePdfGet(creditBankIncomePDFGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/bank_income/refresh` refreshes the most recent bank income report data for a specific user. If the most recent bank income report is no longer valid (i.e. deleted), the endpoint will refresh the most recent valid report instead. * @summary Refresh a user\'s bank income information * @param {CreditBankIncomeRefreshRequest} creditBankIncomeRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomeRefresh(creditBankIncomeRefreshRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditBankIncomeRefresh(creditBankIncomeRefreshRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/bank_income/webhook/update` allows you to subscribe or unsubscribe a user for income webhook notifications. By default, all users start out unsubscribed. If a user is subscribed, on significant changes to the user\'s income profile, you will receive a `BANK_INCOME_REFRESH_UPDATE` webhook, prompting you to refresh bank income data for the user. * @summary Subscribe and unsubscribe to proactive notifications for a user\'s income profile * @param {CreditBankIncomeWebhookUpdateRequest} creditBankIncomeWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomeWebhookUpdate(creditBankIncomeWebhookUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditBankIncomeWebhookUpdate(creditBankIncomeWebhookUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/bank_statements/uploads/get` returns parsed data from bank statements uploaded by users as part of the Document Income flow. If your account is not enabled for Document Parsing, contact your account manager to request access. * @summary Retrieve data for a user\'s uploaded bank statements * @param {CreditBankStatementsUploadsGetRequest} creditBankStatementsUploadsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankStatementsUploadsGet(creditBankStatementsUploadsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditBankStatementsUploadsGet(creditBankStatementsUploadsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/employment/get` returns a list of items with employment information from a user\'s payroll provider that was verified by an end user. * @summary Retrieve a summary of an individual\'s employment information * @param {CreditEmploymentGetRequest} creditEmploymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditEmploymentGet(creditEmploymentGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditEmploymentGet(creditEmploymentGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `credit/asset_report/freddie_mac/get` endpoint retrieves the Verification of Assets and Verification of Employment reports. * @summary Retrieve an Asset Report with Freddie Mac format (aka VOA - Verification Of Assets), and a Verification Of Employment (VOE) report if this one is available. Only Freddie Mac can use this endpoint. * @param {CreditFreddieMacReportsGetRequest} creditFreddieMacReportsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditFreddieMacReportsGet(creditFreddieMacReportsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditFreddieMacReportsGet(creditFreddieMacReportsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint gets payroll income information for a specific user, either as a result of the user connecting to their payroll provider or uploading a pay related document. * @summary Retrieve a user\'s payroll information * @param {CreditPayrollIncomeGetRequest} creditPayrollIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeGet(creditPayrollIncomeGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditPayrollIncomeGet(creditPayrollIncomeGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/payroll_income/parsing_config/update` updates the parsing configuration for a document income verification. * @summary Update the parsing configuration for a document income verification * @param {{ [key: string]: object; }} requestBody * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeParsingConfigUpdate(requestBody, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditPayrollIncomeParsingConfigUpdate(requestBody, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/payroll_income/precheck` is an optional endpoint that can be called before initializing a Link session for income verification. It evaluates whether a given user is supportable by digital income verification. If the user is eligible for digital verification, that information will be associated with the user token, and in this way will generate a Link UI optimized for the end user and their specific employer. If the user cannot be confirmed as eligible, the user can still use the income verification flow, but they may be required to manually upload a paystub to verify their income. While all request fields are optional, providing `employer` data will increase the chance of receiving a useful result. When testing in Sandbox, you can control the results by providing special test values in the `employer` and `access_tokens` fields. `employer_good` and `employer_bad` will result in `HIGH` and `LOW` confidence values, respectively. `employer_multi` will result in a `HIGH` confidence with multiple payroll options. Likewise, `access_good` and `access_bad` will result in `HIGH` and `LOW` confidence values, respectively. Any other value for `employer` and `access_tokens` in Sandbox will result in `UNKNOWN` confidence. * @summary Check income verification eligibility and optimize conversion * @param {CreditPayrollIncomePrecheckRequest} creditPayrollIncomePrecheckRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomePrecheck(creditPayrollIncomePrecheckRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditPayrollIncomePrecheck(creditPayrollIncomePrecheckRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/payroll_income/refresh` refreshes a given digital payroll income verification. * @summary Refresh a digital payroll income verification * @param {CreditPayrollIncomeRefreshRequest} creditPayrollIncomeRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeRefresh(creditPayrollIncomeRefreshRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditPayrollIncomeRefresh(creditPayrollIncomeRefreshRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/payroll_income/risk_signals/get` can be used as part of the Document Income flow to assess a user-uploaded document for signs of potential fraud or tampering. It returns a risk score for each uploaded document that indicates the likelihood of the document being fraudulent, in addition to details on the individual risk signals contributing to the score. To trigger risk signal generation for an Item, call `/link/token/create` with `parsing_config` set to include `risk_signals`, or call `/credit/payroll_income/parsing_config/update`. Once risk signal generation has been triggered, `/credit/payroll_income/risk_signals/get` can be called at any time after the `INCOME_VERIFICATION_RISK_SIGNALS` webhook has been fired. `/credit/payroll_income/risk_signals/get` is offered as an add-on to Document Income and is billed separately. To request access to this endpoint, submit a product access request or contact your Plaid account manager. * @summary Retrieve fraud insights for a user\'s manually uploaded document(s). * @param {CreditPayrollIncomeRiskSignalsGetRequest} creditPayrollIncomeRiskSignalsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeRiskSignalsGet(creditPayrollIncomeRiskSignalsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditPayrollIncomeRiskSignalsGet(creditPayrollIncomeRiskSignalsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Plaid can share an Asset Report directly with a participating third party on your behalf. The shared Asset Report is the exact same Asset Report originally created in `/asset_report/create`. To grant a third party access to an Asset Report, use the `/credit/relay/create` endpoint to create a `relay_token` and then pass that token to your third party. Each third party has its own `secondary_client_id`; for example, `ce5bd328dcd34123456`. You\'ll need to create a separate `relay_token` for each third party that needs access to the report on your behalf. * @summary Create a relay token to share an Asset Report with a partner client * @param {CreditRelayCreateRequest} creditRelayCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayCreate(creditRelayCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditRelayCreate(creditRelayCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/relay/get` allows third parties to receive a report that was shared with them, using a `relay_token` that was created by the report owner. * @summary Retrieve the reports associated with a relay token that was shared with you * @param {CreditRelayGetRequest} creditRelayGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayGet(creditRelayGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditRelayGet(creditRelayGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayPdfGet(creditRelayPDFGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditRelayPdfGet(creditRelayPDFGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/credit/relay/refresh` endpoint allows third parties to refresh a report that was relayed to them, using a `relay_token` that was created by the report owner. A new report will be created with the original report parameters, but with the most recent data available based on the `days_requested` value of the original report. * @summary Refresh a report of a relay token * @param {CreditRelayRefreshRequest} creditRelayRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayRefresh(creditRelayRefreshRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditRelayRefresh(creditRelayRefreshRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/credit/relay/remove` endpoint allows you to invalidate a `relay_token`. The third party holding the token will no longer be able to access or refresh the reports which the `relay_token` gives access to. The original report, associated Items, and other relay tokens that provide access to the same report are not affected and will remain accessible after removing the given `relay_token`. * @summary Remove relay token * @param {CreditRelayRemoveRequest} creditRelayRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayRemove(creditRelayRemoveRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditRelayRemove(creditRelayRemoveRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/credit/audit_copy_token/remove` endpoint allows you to remove an Audit Copy. Removing an Audit Copy invalidates the `audit_copy_token` associated with it, meaning both you and any third parties holding the token will no longer be able to use it to access Report data. Items associated with the Report data and other Audit Copies of it are not affected and will remain accessible after removing the given Audit Copy. * @summary Remove an Audit Copy token * @param {CreditAuditCopyTokenRemoveRequest} creditAuditCopyTokenRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditReportAuditCopyRemove(creditAuditCopyTokenRemoveRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditReportAuditCopyRemove(creditAuditCopyTokenRemoveRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint can be used for your end users after they complete the Link flow. This endpoint returns a list of Link sessions that your user completed, where each session includes the results from the Link flow. These results include details about the Item that was created and some product related metadata (showing, for example, whether the user finished the bank income verification step). * @summary Retrieve Link sessions for your user * @param {CreditSessionsGetRequest} creditSessionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditSessionsGet(creditSessionsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.creditSessionsGet(creditSessionsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/dashboard_user/get` endpoint provides details (such as email address) about a specific Dashboard user based on the `dashboard_user_id` field, which is returned in the `audit_trail` object of certain Monitor and Beacon endpoints. This can be used to identify the specific reviewer who performed a Dashboard action. * @summary Retrieve a dashboard user * @param {DashboardUserGetRequest} dashboardUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ dashboardUserGet(dashboardUserGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.dashboardUserGet(dashboardUserGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/dashboard_user/list` endpoint provides details (such as email address) all Dashboard users associated with your account. This can use used to audit or track the list of reviewers for Monitor, Beacon, and Identity Verification products. * @summary List dashboard users * @param {DashboardUserListRequest} dashboardUserListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ dashboardUserList(dashboardUserListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.dashboardUserList(dashboardUserListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint provides an alternative to `/deposit_switch/create` for customers who have not yet fully integrated with Plaid Exchange. Like `/deposit_switch/create`, it creates a deposit switch entity that will be persisted throughout the lifecycle of the switch. * @summary (Deprecated) Create a deposit switch without using Plaid Exchange * @param {DepositSwitchAltCreateRequest} depositSwitchAltCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchAltCreate(depositSwitchAltCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.depositSwitchAltCreate(depositSwitchAltCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint creates a deposit switch entity that will be persisted throughout the lifecycle of the switch. * @summary (Deprecated) Create a deposit switch * @param {DepositSwitchCreateRequest} depositSwitchCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchCreate(depositSwitchCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.depositSwitchCreate(depositSwitchCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint returns information related to how the user has configured their payroll allocation and the state of the switch. You can use this information to build logic related to the user\'s direct deposit allocation preferences. * @summary (Deprecated) Retrieve a deposit switch * @param {DepositSwitchGetRequest} depositSwitchGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchGet(depositSwitchGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.depositSwitchGet(depositSwitchGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * In order for the end user to take action, you will need to create a public token representing the deposit switch. This token is used to initialize Link. It can be used one time and expires after 30 minutes. * @summary (Deprecated) Create a deposit switch token * @param {DepositSwitchTokenCreateRequest} depositSwitchTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchTokenCreate(depositSwitchTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.depositSwitchTokenCreate(depositSwitchTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/employers/search` allows you the ability to search Plaid’s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. * @summary Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ employersSearch(employersSearchRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.employersSearch(employersSearchRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/employment/verification/get` returns a list of employments through a user payroll that was verified by an end user. This endpoint has been deprecated; new integrations should use `/credit/employment/get` instead. * @summary (Deprecated) Retrieve a summary of an individual\'s employment information * @param {EmploymentVerificationGetRequest} employmentVerificationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ employmentVerificationGet(employmentVerificationGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.employmentVerificationGet(employmentVerificationGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * A generic webhook receiver endpoint for FDX Event Notifications * @summary Webhook receiver for fdx notifications * @param {FDXNotification} fDXNotification * @param {*} [options] Override http request option. * @throws {RequiredError} */ fdxNotifications(fDXNotification, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.fdxNotifications(fDXNotification, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Get a specific recipient * @summary Get Recipient * @param {string} recipientId Recipient Identifier. Uniquely identifies the recipient * @param {string} [oAUTHSTATEID] The value that is passed into the OAuth URI \'state\' query parameter. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRecipient(recipientId, oAUTHSTATEID, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.getRecipient(recipientId, oAUTHSTATEID, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Returns a list of Recipients * @summary Get Recipients * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRecipients(options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.getRecipients(options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use `/identity/documents/uploads/get` to retrieve identity details when using [Identity Document Upload](https://plaid.com/docs/identity/identity-document-upload/). * @summary Returns uploaded document identity * @param {IdentityDocumentsUploadsGetRequest} identityDocumentsUploadsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityDocumentsUploadsGet(identityDocumentsUploadsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.identityDocumentsUploadsGet(identityDocumentsUploadsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/identity/get` endpoint allows you to retrieve various account holder information on file with the financial institution, including names, emails, phone numbers, and addresses. Only name data is guaranteed to be returned; other fields will be empty arrays if not provided by the institution. Note: In API versions 2018-05-22 and earlier, the `owners` object is not returned, and instead identity information is returned in the top level `identity` object. For more details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2019-05-29). * @summary Retrieve identity data * @param {IdentityGetRequest} identityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityGet(identityGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.identityGet(identityGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. * @summary Retrieve identity match score * @param {IdentityMatchRequest} identityMatchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityMatch(identityMatchRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.identityMatch(identityMatchRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/identity/refresh` is an optional endpoint for users of the Identity product. It initiates an on-demand extraction to fetch the most up to date Identity information from the Financial Institution. This on-demand extraction takes place in addition to the periodic extractions that automatically occur for any Identity-enabled Item. If changes to Identity are discovered after calling `/identity/refresh`, Plaid will fire a webhook [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/identity/#default_update). As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/identity/refresh` is offered as an add-on to Identity and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh identity data * @param {IdentityRefreshRequest} identityRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityRefresh(identityRefreshRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.identityRefresh(identityRefreshRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. * @summary Create autofill for an Identity Verification * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationCreate(identityVerificationCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.identityVerificationCreate(identityVerificationCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationGet(identityVerificationGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.identityVerificationGet(identityVerificationGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Filter and list Identity Verifications created by your account * @summary List Identity Verifications * @param {IdentityVerificationListRequest} identityVerificationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationList(identityVerificationListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.identityVerificationList(identityVerificationListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationRetry(identityVerificationRetryRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.identityVerificationRetry(identityVerificationRetryRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/income/verification/create` begins the income verification process by returning an `income_verification_id`. You can then provide the `income_verification_id` to `/link/token/create` under the `income_verification` parameter in order to create a Link instance that will prompt the user to go through the income verification flow. Plaid will fire an `INCOME` webhook once the user completes the Payroll Income flow, or when the uploaded documents in the Document Income flow have finished processing. * @summary (Deprecated) Create an income verification instance * @param {IncomeVerificationCreateRequest} incomeVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationCreate(incomeVerificationCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.incomeVerificationCreate(incomeVerificationCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/income/verification/documents/download` provides the ability to download the source documents associated with the verification. If Document Income was used, the documents will be those the user provided in Link. For Payroll Income, the most recent files available for download from the payroll provider will be available from this endpoint. The response to `/income/verification/documents/download` is a ZIP file in binary data. If a `document_id` is passed, a single document will be contained in this file. If not, the response will contain all documents associated with the verification. The `request_id` is returned in the `Plaid-Request-ID` header. * @summary (Deprecated) Download the original documents used for income verification * @param {IncomeVerificationDocumentsDownloadRequest} incomeVerificationDocumentsDownloadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationDocumentsDownload(incomeVerificationDocumentsDownloadRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.incomeVerificationDocumentsDownload(incomeVerificationDocumentsDownloadRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/income/verification/paystubs/get` returns the information collected from the paystubs that were used to verify an end user\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/get` instead. * @summary (Deprecated) Retrieve information from the paystubs used for income verification * @param {IncomeVerificationPaystubsGetRequest} incomeVerificationPaystubsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/income/verification/precheck` is an optional endpoint that can be called before initializing a Link session for income verification. It evaluates whether a given user is supportable by digital income verification and returns a `precheck_id` that can be provided to `/link/token/create`. If the user is eligible for digital verification, providing the `precheck_id` in this way will generate a Link UI optimized for the end user and their specific employer. If the user cannot be confirmed as eligible, the `precheck_id` can still be provided to `/link/token/create` and the user can still use the income verification flow, but they may be required to manually upload a paystub to verify their income. While all request fields are optional, providing either `employer` or `transactions_access_tokens` data will increase the chance of receiving a useful result. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/precheck` instead. * @summary (Deprecated) Check digital income verification eligibility and optimize conversion * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/income/verification/taxforms/get` returns the information collected from forms that were used to verify an end user\'\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/get` instead. * @summary (Deprecated) Retrieve information from the tax documents used for income verification * @param {IncomeVerificationTaxformsGetRequest} incomeVerificationTaxformsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationTaxformsGet(incomeVerificationTaxformsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.incomeVerificationTaxformsGet(incomeVerificationTaxformsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Returns a JSON response containing details on all financial institutions currently supported by Plaid. Because Plaid supports thousands of institutions, results are paginated. If there is no overlap between an institution’s enabled products and a client’s enabled products, then the institution will be filtered out from the response. As a result, the number of institutions returned may not match the count specified in the call. * @summary Get details of all supported institutions * @param {InstitutionsGetRequest} institutionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ institutionsGet(institutionsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.institutionsGet(institutionsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Returns a JSON response containing details on a specified financial institution currently supported by Plaid. Versioning note: API versions 2019-05-29 and earlier allow use of the `public_key` parameter instead of the `client_id` and `secret` to authenticate to this endpoint. The `public_key` has been deprecated; all customers are encouraged to use `client_id` and `secret` instead. * @summary Get details of an institution * @param {InstitutionsGetByIdRequest} institutionsGetByIdRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ institutionsGetById(institutionsGetByIdRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.institutionsGetById(institutionsGetByIdRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Returns a JSON response containing details for institutions that match the query parameters, up to a maximum of ten institutions per query. Versioning note: API versions 2019-05-29 and earlier allow use of the `public_key` parameter instead of the `client_id` and `secret` parameters to authenticate to this endpoint. The `public_key` parameter has since been deprecated; all customers are encouraged to use `client_id` and `secret` instead. * @summary Search institutions * @param {InstitutionsSearchRequest} institutionsSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ institutionsSearch(institutionsSearchRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.institutionsSearch(institutionsSearchRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/investments/auth/get` endpoint allows developers to receive user-authorized data to facilitate the transfer of holdings * @summary Get data needed to authorize an investments transfer * @param {InvestmentsAuthGetRequest} investmentsAuthGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsAuthGet(investmentsAuthGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.investmentsAuthGet(investmentsAuthGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/investments/holdings/get` endpoint allows developers to receive user-authorized stock position data for `investment`-type accounts. * @summary Get Investment holdings * @param {InvestmentsHoldingsGetRequest} investmentsHoldingsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsHoldingsGet(investmentsHoldingsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.investmentsHoldingsGet(investmentsHoldingsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/investments/refresh` is an optional endpoint for users of the Investments product. It initiates an on-demand extraction to fetch the newest investment holdings and transactions for an Item. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Investments-enabled Item. If changes to investments are discovered after calling `/investments/refresh`, Plaid will fire webhooks: [`HOLDINGS: DEFAULT_UPDATE`](https://plaid.com/docs/api/products/investments/#holdings-default_update) if any new holdings are detected, and [`INVESTMENTS_TRANSACTIONS: DEFAULT_UPDATE`](https://plaid.com/docs/api/products/investments/#investments_transactions-default_update) if any new investment transactions are detected. This webhook will typically not fire in the Sandbox environment, due to the lack of dynamic investment transactions and holdings data. To test this webhook in Sandbox, call `/sandbox/item/fire_webhook`. Updated holdings and investment transactions can be fetched by calling `/investments/holdings/get` and `/investments/transactions/get`. Note that the `/investments/refresh` endpoint is not supported by all institutions. If called on an Item from an institution that does not support this functionality, it will return a `PRODUCT_NOT_SUPPORTED` error. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/investments/refresh` is offered as an add-on to Investments and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh investment data * @param {InvestmentsRefreshRequest} investmentsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsRefresh(investmentsRefreshRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.investmentsRefresh(investmentsRefreshRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/investments/transactions/get` endpoint allows developers to retrieve up to 24 months of user-authorized transaction data for investment accounts. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Due to the potentially large number of investment transactions associated with an Item, results are paginated. Manipulate the count and offset parameters in conjunction with the `total_investment_transactions` response body field to fetch all available investment transactions. Note that Investments does not have a webhook to indicate when initial transaction data has loaded (unless you use the `async_update` option). Instead, if transactions data is not ready when `/investments/transactions/get` is first called, Plaid will wait for the data. For this reason, calling `/investments/transactions/get` immediately after Link may take up to one to two minutes to return. Data returned by the asynchronous investments extraction flow (when `async_update` is set to true) may not be immediately available to `/investments/transactions/get`. To be alerted when the data is ready to be fetched, listen for the `HISTORICAL_UPDATE` webhook. If no investments history is ready when `/investments/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get investment transactions * @param {InvestmentsTransactionsGetRequest} investmentsTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsTransactionsGet(investmentsTransactionsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.investmentsTransactionsGet(investmentsTransactionsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Retrieve detailed information about a specific `Issue`. This endpoint returns a single `Issue` object. * @summary Get an Issue * @param {IssuesGetRequest} issuesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ issuesGet(issuesGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.issuesGet(issuesGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Search for an issue associated with one of the following identifiers: `item_id`, `link_session_id` or Link session `request_id`. This endpoint returns a list of `Issue` objects, with an empty list indicating that no issues are associated with the provided identifier. At least one of the identifiers must be provided to perform the search. * @summary Search for an Issue * @param {IssuesSearchRequest} issuesSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ issuesSearch(issuesSearchRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.issuesSearch(issuesSearchRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Allows a user to subscribe to updates on a specific `Issue` using a POST method. Subscribers will receive webhook notifications when the issue status changes, particularly when resolved. * @summary Subscribe to an Issue * @param {IssuesSubscribeRequest} issuesSubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ issuesSubscribe(issuesSubscribeRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.issuesSubscribe(issuesSubscribeRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * By default, the `access_token` associated with an Item does not expire and should be stored in a persistent, secure manner. You can use the `/item/access_token/invalidate` endpoint to rotate the `access_token` associated with an Item. The endpoint returns a new `access_token` and immediately invalidates the previous `access_token`. * @summary Invalidate access_token * @param {ItemAccessTokenInvalidateRequest} itemAccessTokenInvalidateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemAccessTokenInvalidate(itemAccessTokenInvalidateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemAccessTokenInvalidate(itemAccessTokenInvalidateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List a historical log of user consent events * @summary List a historical log of user consent events * @param {ItemActivityListRequest} itemActivityListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemActivityList(itemActivityListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemActivityList(itemActivityListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List a user’s connected applications * @summary List a user’s connected applications * @param {ItemApplicationListRequest} itemApplicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemApplicationList(itemApplicationListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemApplicationList(itemApplicationListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Enable consumers to update product access on selected accounts for an application. * @summary Update the scopes of access for a particular application * @param {ItemApplicationScopesUpdateRequest} itemApplicationScopesUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemApplicationScopesUpdate(itemApplicationScopesUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemApplicationScopesUpdate(itemApplicationScopesUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Unlink a user’s connected application. On an unlink request, Plaid will immediately revoke the Application’s access to the User’s data. The User will have to redo the OAuth authentication process in order to restore functionality. This endpoint only removes ongoing data access permissions, therefore the User will need to reach out to the Application itself in order to disable and delete their account and delete any data that the Application already received (if the Application does not do so by default). This endpoint should be called in real time as the User is unlinking an Application, and should not be batched in order to ensure that the change is reflected as soon as possible. * @summary Unlink a user’s connected application * @param {ItemApplicationUnlinkRequest} itemApplicationUnlinkRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemApplicationUnlink(itemApplicationUnlinkRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemApplicationUnlink(itemApplicationUnlinkRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. * @summary Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemCreatePublicToken(itemPublicTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemCreatePublicToken(itemPublicTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Returns information about the status of an Item. * @summary Retrieve an Item * @param {ItemGetRequest} itemGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemGet(itemGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemGet(itemGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/item/import` creates an Item via your Plaid Exchange Integration and returns an `access_token`. As part of an `/item/import` request, you will include a User ID (`user_auth.user_id`) and Authentication Token (`user_auth.auth_token`) that enable data aggregation through your Plaid Exchange API endpoints. These authentication principals are to be chosen by you. Upon creating an Item via `/item/import`, Plaid will automatically begin an extraction of that Item through the Plaid Exchange infrastructure you have already integrated. * @summary Import Item * @param {ItemImportRequest} itemImportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemImport(itemImportRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemImport(itemImportRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Exchange a Link `public_token` for an API `access_token`. Link hands off the `public_token` client-side via the `onSuccess` callback once a user has successfully created an Item. The `public_token` is ephemeral and expires after 30 minutes. An `access_token` does not expire, but can be revoked by calling `/item/remove`. The response also includes an `item_id` that should be stored with the `access_token`. The `item_id` is used to identify an Item in a webhook. The `item_id` can also be retrieved by making an `/item/get` request. * @summary Exchange public token for an access token * @param {ItemPublicTokenExchangeRequest} itemPublicTokenExchangeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemPublicTokenExchange(itemPublicTokenExchangeRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemPublicTokenExchange(itemPublicTokenExchangeRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/item/remove` endpoint allows you to remove an Item. Once removed, the `access_token`, as well as any processor tokens or bank account tokens associated with the Item, is no longer valid and cannot be used to access any data that was associated with the Item. Calling `/item/remove` is a recommended best practice when offboarding users or if a user chooses to disconnect an account linked via Plaid. For subscription products, such as Transactions, Liabilities, and Investments, calling `/item/remove` is required to end subscription billing for the Item. For money movement products such as Auth and Transfer, if the Item is at an institution that uses Tokenized Account Numbers (TANs), such as Chase or PNC, calling `/item/remove` will invalidate the TAN, and subsequent ACH transfer attempts using that TAN will be returned. In Limited Production, calling `/item/remove` does not impact the number of remaining Limited Production Items you have available. Removing an Item does not affect any Asset Reports or Audit Copies you have already created, which will remain accessible until you remove access to them specifically using the `/asset_report/remove` endpoint. Also note that for certain OAuth-based institutions, an Item removed via `/item/remove` may still show as an active connection in the institution\'s OAuth permission manager. API versions 2019-05-29 and earlier return a `removed` boolean as part of the response. * @summary Remove an Item * @param {ItemRemoveRequest} itemRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemRemove(itemRemoveRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemRemove(itemRemoveRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The POST `/item/webhook/update` allows you to update the webhook URL associated with an Item. This request triggers a [`WEBHOOK_UPDATE_ACKNOWLEDGED`](https://plaid.com/docs/api/items/#webhook_update_acknowledged) webhook to the newly specified webhook URL. * @summary Update Webhook URL * @param {ItemWebhookUpdateRequest} itemWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemWebhookUpdate(itemWebhookUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.itemWebhookUpdate(itemWebhookUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/liabilities/get` endpoint returns various details about an Item with loan or credit accounts. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. To limit accounts listed in Link to types and subtypes supported by Liabilities, you can use the `account_filters` parameter when [creating a Link token](https://plaid.com/docs/api/link/#linktokencreate). The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/liabilities/get`. * @summary Retrieve Liabilities data * @param {LiabilitiesGetRequest} liabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ liabilitiesGet(liabilitiesGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.liabilitiesGet(liabilitiesGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/link_delivery/create` endpoint to create a Hosted Link session. * @summary Create Hosted Link session * @param {LinkDeliveryCreateRequest} linkDeliveryCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkDeliveryCreate(linkDeliveryCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.linkDeliveryCreate(linkDeliveryCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/link_delivery/get` endpoint to get the status of a Hosted Link session. * @summary Get Hosted Link session * @param {LinkDeliveryGetRequest} linkDeliveryGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkDeliveryGet(linkDeliveryGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.linkDeliveryGet(linkDeliveryGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Exchange an OAuth `link_correlation_id` for the corresponding `link_token`. The `link_correlation_id` is only available for \'payment_initiation\' products and is provided to the client via the OAuth `redirect_uri` as a query parameter. The `link_correlation_id` is ephemeral and expires in a brief period, after which it can no longer be exchanged for the \'link_token\'. * @summary Exchange the Link Correlation Id for a Link Token * @param {LinkOAuthCorrelationIdExchangeRequest} linkOAuthCorrelationIdExchangeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkOauthCorrelationIdExchange(linkOAuthCorrelationIdExchangeRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.linkOauthCorrelationIdExchange(linkOAuthCorrelationIdExchangeRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/link/token/create` endpoint creates a `link_token`, which is required as a parameter when initializing Link. Once Link has been initialized, it returns a `public_token`. For most Plaid products, the `public_token` is saved and exchanged for an `access_token` via `/item/public_token/exchange` as part of the main Link flow. For more details, see the [Link flow overview](https://plaid.com/docs/link/#link-flow-overview). A `link_token` generated by `/link/token/create` is also used to initialize other Link flows, such as the [update mode](https://plaid.com/docs/link/update-mode) flow for tokens with expired credentials, or the Identity Verification flow. * @summary Create Link Token * @param {LinkTokenCreateRequest} linkTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkTokenCreate(linkTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.linkTokenCreate(linkTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/link/token/get` endpoint gets information about a Link session, including all callbacks fired during the session along with their metadata, including the public token. This endpoint is used with Link flows that don\'t provide a public token via frontend callbacks, such as the [Hosted Link flow](https://plaid.com/docs/link/hosted-link/) and the [Multi-Item Link flow](https://plaid.com/docs/link/multi-item-link/). It also can be useful for debugging purposes. * @summary Get Link Token * @param {LinkTokenGetRequest} linkTokenGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkTokenGet(linkTokenGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.linkTokenGet(linkTokenGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint allows you to retrieve the Network Insights from a list of `access_tokens`. * @summary Retrieve network insights for the provided `access_tokens` * @param {NetworkInsightsReportGetRequest} networkInsightsReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ networkInsightsReportGet(networkInsightsReportGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.networkInsightsReportGet(networkInsightsReportGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/network/status/get` endpoint can be used to check whether Plaid has a matching profile for the user. This is useful for determining if a user is eligible for a streamlined experience, such as Layer. Note: it is strongly recommended to check for Layer eligibility in the frontend. `/network/status/get` should only be used for checking Layer eligibility if a frontend check is not possible for your use case. For instructions on performing a frontend eligibility check, see the [Layer documentation](https://plaid.com/docs/layer/#integration-overview). * @summary Check a user\'s Plaid Network status * @param {NetworkStatusGetRequest} networkStatusGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ networkStatusGet(networkStatusGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.networkStatusGet(networkStatusGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/partner/customer/create` endpoint is used by reseller partners to create end customers. To create end customers, it should be called in the Production environment only, even when creating Sandbox API keys. If called in the Sandbox environment, it will return a sample response, but no customer will be created and the API keys will not be valid. * @summary Creates a new end customer for a Plaid reseller. * @param {PartnerCustomerCreateRequest} partnerCustomerCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerCreate(partnerCustomerCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.partnerCustomerCreate(partnerCustomerCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/partner/customer/enable` endpoint is used by reseller partners to enable an end customer in the full Production environment. * @summary Enables a Plaid reseller\'s end customer in the Production environment. * @param {PartnerCustomerEnableRequest} partnerCustomerEnableRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerEnable(partnerCustomerEnableRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.partnerCustomerEnable(partnerCustomerEnableRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/partner/customer/get` endpoint is used by reseller partners to retrieve data about a single end customer. * @summary Returns a Plaid reseller\'s end customer. * @param {PartnerCustomerGetRequest} partnerCustomerGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerGet(partnerCustomerGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.partnerCustomerGet(partnerCustomerGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/partner/customer/oauth_institutions/get` endpoint is used by reseller partners to retrieve OAuth-institution registration information about a single end customer. To learn how to set up a webhook to listen to status update events, visit the [reseller documentation](https://plaid.com/docs/account/resellers/#enabling-end-customers). * @summary Returns OAuth-institution registration information for a given end customer. * @param {PartnerCustomerOAuthInstitutionsGetRequest} partnerCustomerOAuthInstitutionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerOauthInstitutionsGet(partnerCustomerOAuthInstitutionsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.partnerCustomerOauthInstitutionsGet(partnerCustomerOAuthInstitutionsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/partner/customer/remove` endpoint is used by reseller partners to remove an end customer. Removing an end customer will remove it from view in the Plaid Dashboard and deactivate its API keys. This endpoint can only be used to remove an end customer that has not yet been enabled in full Production. * @summary Removes a Plaid reseller\'s end customer. * @param {PartnerCustomerRemoveRequest} partnerCustomerRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerRemove(partnerCustomerRemoveRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.partnerCustomerRemove(partnerCustomerRemoveRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/payment_initiation/consent/create` endpoint is used to create a payment consent, which can be used to initiate payments on behalf of the user. Payment consents are created with `UNAUTHORISED` status by default and must be authorised by the user before payments can be initiated. Consents can be limited in time and scope, and have constraints that describe limitations for payments. * @summary Create payment consent * @param {PaymentInitiationConsentCreateRequest} paymentInitiationConsentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentCreate(paymentInitiationConsentCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationConsentCreate(paymentInitiationConsentCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/payment_initiation/consent/get` endpoint can be used to check the status of a payment consent, as well as to receive basic information such as recipient and constraints. * @summary Get payment consent * @param {PaymentInitiationConsentGetRequest} paymentInitiationConsentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentGet(paymentInitiationConsentGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationConsentGet(paymentInitiationConsentGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/payment_initiation/consent/payment/execute` endpoint can be used to execute payments using payment consent. * @summary Execute a single payment using consent * @param {PaymentInitiationConsentPaymentExecuteRequest} paymentInitiationConsentPaymentExecuteRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentPaymentExecute(paymentInitiationConsentPaymentExecuteRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationConsentPaymentExecute(paymentInitiationConsentPaymentExecuteRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/payment_initiation/consent/revoke` endpoint can be used to revoke the payment consent. Once the consent is revoked, it is not possible to initiate payments using it. * @summary Revoke payment consent * @param {PaymentInitiationConsentRevokeRequest} paymentInitiationConsentRevokeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with BACS numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient’s account, although at least 90% of standing order payments are sent by 6am. In Limited Production, payments must be below 5 GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency), and standing orders, variable recurring payments, and Virtual Accounts are not supported. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentGet(paymentInitiationPaymentGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationPaymentGet(paymentInitiationPaymentGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/payment_initiation/payment/list` endpoint can be used to retrieve all created payments. By default, the 10 most recent payments are returned. You can request more payments and paginate through the results using the optional `count` and `cursor` parameters. * @summary List payments * @param {PaymentInitiationPaymentListRequest} paymentInitiationPaymentListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Reverse a settled payment from a Plaid virtual account. The original payment must be in a settled state to be refunded. To refund partially, specify the amount as part of the request. If the amount is not specified, the refund amount will be equal to all of the remaining payment amount that has not been refunded yet. The refund will go back to the source account that initiated the payment. The original payment must have been initiated to a Plaid virtual account so that this account can be used to initiate the refund. Providing counterparty information such as date of birth and address increases the likelihood of refund being successful without human intervention. * @summary Reverse an existing payment * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA) or a non-Eurozone country [supported](https://plaid.com/global) by Plaid. For a standing order (recurring) payment, the recipient must be in the UK. It is recommended to use `bacs` in the UK and `iban` in EU. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient * @param {PaymentInitiationRecipientCreateRequest} paymentInitiationRecipientCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationRecipientCreate(paymentInitiationRecipientCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationRecipientCreate(paymentInitiationRecipientCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Get details about a payment recipient you have previously created. * @summary Get payment recipient * @param {PaymentInitiationRecipientGetRequest} paymentInitiationRecipientGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationRecipientList(paymentInitiationRecipientListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentInitiationRecipientList(paymentInitiationRecipientListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use `/payment_profile/create` endpoint to create a new payment profile. To initiate the account linking experience, call `/link/token/create` and provide the `payment_profile_token` in the `transfer.payment_profile_token` field. You can then use the `payment_profile_token` when creating transfers using `/transfer/authorization/create` and `/transfer/create`. * @summary Create payment profile * @param {PaymentProfileCreateRequest} paymentProfileCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentProfileCreate(paymentProfileCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentProfileCreate(paymentProfileCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use `/payment_profile/get` endpoint to get the status of a given Payment Profile. * @summary Get payment profile * @param {PaymentProfileGetRequest} paymentProfileGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentProfileGet(paymentProfileGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentProfileGet(paymentProfileGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/payment_profile/remove` endpoint to remove a given Payment Profile. Once it’s removed, it can no longer be used to create transfers. * @summary Remove payment profile * @param {PaymentProfileRemoveRequest} paymentProfileRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentProfileRemove(paymentProfileRemoveRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.paymentProfileRemove(paymentProfileRemoveRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint returns the account associated with a given processor token. This endpoint retrieves cached information, rather than extracting fresh information from the institution. As a result, the account balance returned may not be up-to-date; for realtime balance information, use `/processor/balance/get` instead. Note that some information is nullable. * @summary Retrieve the account associated with a processor token * @param {ProcessorAccountGetRequest} processorAccountGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorAccountGet(processorAccountGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorAccountGet(processorAccountGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. * @summary Create Apex bank account token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorApexProcessorTokenCreate(processorApexProcessorTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorApexProcessorTokenCreate(processorApexProcessorTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/processor/auth/get` endpoint returns the bank account and bank identification number (such as the routing number, for US accounts), for a checking, savings, or cash management account that\'\'s associated with a given `processor_token`. The endpoint also returns high-level account data and balances when available. Versioning note: API versions 2019-05-29 and earlier use a different schema for the `numbers` object returned by this endpoint. For details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2020-09-14). * @summary Retrieve Auth data * @param {ProcessorAuthGetRequest} processorAuthGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorAuthGet(processorAuthGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorAuthGet(processorAuthGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/processor/balance/get` endpoint returns the real-time balance for each of an Item\'s accounts. While other endpoints may return a balance object, only `/processor/balance/get` forces the available and current balance fields to be refreshed rather than cached. * @summary Retrieve Balance data * @param {ProcessorBalanceGetRequest} processorBalanceGetRequest The `/processor/balance/get` endpoint returns the real-time balance for the account associated with a given `processor_token`. The current balance is the total amount of funds in the account. The available balance is the current balance less any outstanding holds or debits that have not yet posted to the account. Note that not all institutions calculate the available balance. In the event that available balance is unavailable from the institution, Plaid will return an available balance value of `null`. * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorBalanceGet(processorBalanceGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorBalanceGet(processorBalanceGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor * @summary Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorBankTransferCreate(processorBankTransferCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorBankTransferCreate(processorBankTransferCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/processor/identity/get` endpoint allows you to retrieve various account holder information on file with the financial institution, including names, emails, phone numbers, and addresses. * @summary Retrieve Identity data * @param {ProcessorIdentityGetRequest} processorIdentityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorIdentityGet(processorIdentityGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorIdentityGet(processorIdentityGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorIdentityMatch(processorIdentityMatchRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorIdentityMatch(processorIdentityMatchRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint returns the stock position data of the account associated with a given processor token. * @summary Retrieve Investment Holdings * @param {ProcessorInvestmentsHoldingsGetRequest} processorInvestmentsHoldingsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorInvestmentsHoldingsGet(processorInvestmentsHoldingsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorInvestmentsHoldingsGet(processorInvestmentsHoldingsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/processor/investments/transactions/get` endpoint allows developers to retrieve up to 24 months of user-authorized transaction data for the investment account associated with the processor token. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Due to the potentially large number of investment transactions associated with the account, results are paginated. Manipulate the count and offset parameters in conjunction with the `total_investment_transactions` response body field to fetch all available investment transactions. Note that Investments does not have a webhook to indicate when initial transaction data has loaded (unless you use the `async_update` option). Instead, if transactions data is not ready when `/processor/investments/transactions/get` is first called, Plaid will wait for the data. For this reason, calling `/processor/investments/transactions/get` immediately after Link may take up to one to two minutes to return. Data returned by the asynchronous investments extraction flow (when `async_update` is set to true) may not be immediately available to `/processor/investments/transactions/get`. To be alerted when the data is ready to be fetched, listen for the `HISTORICAL_UPDATE` webhook. If no investments history is ready when `/processor/investments/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Investments Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get investment transactions data * @param {ProcessorInvestmentsTransactionsGetRequest} processorInvestmentsTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorInvestmentsTransactionsGet(processorInvestmentsTransactionsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorInvestmentsTransactionsGet(processorInvestmentsTransactionsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. * @summary Retrieve Liabilities data * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorLiabilitiesGet(processorLiabilitiesGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorLiabilitiesGet(processorLiabilitiesGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. If you are using the [Plaid Transfer product](https://www.plaid.com/docs/transfer) to create transfers, it is not necessary to use this endpoint, as Plaid already knows whether the transfer was initiated. * @summary Report whether you initiated an ACH transaction * @param {ProcessorSignalDecisionReportRequest} processorSignalDecisionReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalDecisionReport(processorSignalDecisionReportRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorSignalDecisionReport(processorSignalDecisionReportRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use `/processor/signal/evaluate` to evaluate a planned ACH transaction as a processor to get a return risk assessment (such as a risk score and risk tier) and additional risk signals. In order to obtain a valid score for an ACH transaction, Plaid must have an access token for the account, and the Item must be healthy (receiving product updates) or have recently been in a healthy state. If the transaction does not meet eligibility requirements, an error will be returned corresponding to the underlying cause. If `/processor/signal/evaluate` is called on the same transaction multiple times within a 24-hour period, cached results may be returned. For more information please refer to our error documentation on [item errors](/docs/errors/item/) and [Link in Update Mode](/docs/link/update-mode/). Note: This request may take some time to complete if Signal is being added to an existing Item. This is because Plaid must communicate directly with the institution when retrieving the data for the first time. To reduce this latency, you can call `/signal/prepare` on the Item before you need to request Signal data. * @summary Evaluate a planned ACH transaction * @param {ProcessorSignalEvaluateRequest} processorSignalEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalEvaluate(processorSignalEvaluateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorSignalEvaluate(processorSignalEvaluateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * When a processor token is not initialized with Signal, call `/processor/signal/prepare` to opt-in that processor token to the Signal data collection process, which will improve the accuracy of the Signal score. If this endpoint is called with a processor token that is already initialized with Signal, it will return a 200 response and will not modify the processor token. * @summary Opt-in a processor token to Signal * @param {ProcessorSignalPrepareRequest} processorSignalPrepareRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalPrepare(processorSignalPrepareRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorSignalPrepare(processorSignalPrepareRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Call the `/processor/signal/return/report` endpoint to report a returned transaction that was previously sent to the `/processor/signal/evaluate` endpoint. Your feedback will be used by the model to incorporate the latest risk trend in your portfolio. If you are using the [Plaid Transfer product](https://www.plaid.com/docs/transfer) to create transfers, it is not necessary to use this endpoint, as Plaid already knows whether the transfer was returned. * @summary Report a return for an ACH transaction * @param {ProcessorSignalReturnReportRequest} processorSignalReturnReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalReturnReport(processorSignalReturnReportRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorSignalReturnReport(processorSignalReturnReportRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Used to create a token suitable for sending to Stripe to enable Plaid-Stripe integrations. For a detailed guide on integrating Stripe, see [Add Stripe to your app](https://plaid.com/docs/auth/partnerships/stripe/). Note that the Stripe bank account token is a one-time use token. To store bank account information for later use, you can use a Stripe customer object and create an associated bank account from the token, or you can use a Stripe Custom account and create an associated external bank account from the token. This bank account information should work indefinitely, unless the user\'s bank account information changes or they revoke Plaid\'s permissions to access their account. Stripe bank account information cannot be modified once the bank account token has been created. If you ever need to change the bank account details used by Stripe for a specific customer, have the user go through Link again and create a new bank account token from the new `access_token`. To revoke a bank account token, the entire underlying access token must be revoked using `/item/remove`. * @summary Create Stripe bank account token * @param {ProcessorStripeBankAccountTokenCreateRequest} processorStripeBankAccountTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorStripeBankAccountTokenCreate(processorStripeBankAccountTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorStripeBankAccountTokenCreate(processorStripeBankAccountTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Used to create a token suitable for sending to one of Plaid\'s partners to enable integrations. Note that Stripe partnerships use bank account tokens instead; see `/processor/stripe/bank_account_token/create` for creating tokens for use with Stripe integrations. If using multiple processors, multiple different processor tokens can be created for a single access token. Once created, a processor token for a given Item cannot be modified or updated. To revoke the processor\'s access, the entire Item must be deleted by calling `/item/remove`. * @summary Create processor token * @param {ProcessorTokenCreateRequest} processorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenCreate(processorTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorTokenCreate(processorTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Used to get a processor token\'s product permissions. The `products` field will be an empty list if the processor can access all available products. * @summary Get a processor token\'s product permissions * @param {ProcessorTokenPermissionsGetRequest} processorTokenPermissionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenPermissionsGet(processorTokenPermissionsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorTokenPermissionsGet(processorTokenPermissionsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Used to control a processor\'s access to products on the given processor token. By default, a processor will have access to all available products on the corresponding item. To restrict access to a particular set of products, call this endpoint with the desired products. To restore access to all available products, call this endpoint with an empty list. This endpoint can be called multiple times as your needs and your processor\'s needs change. * @summary Control a processor\'s access to products * @param {ProcessorTokenPermissionsSetRequest} processorTokenPermissionsSetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenPermissionsSet(processorTokenPermissionsSetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorTokenPermissionsSet(processorTokenPermissionsSetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint allows you, the processor, to update the webhook URL associated with a processor token. This request triggers a `WEBHOOK_UPDATE_ACKNOWLEDGED` webhook to the newly specified webhook URL. * @summary Update a processor token\'s webhook URL * @param {ProcessorTokenWebhookUpdateRequest} processorTokenWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsGet(processorTransactionsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorTransactionsGet(processorTransactionsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user’s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsRefresh(processorTransactionsRefreshRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorTransactionsRefresh(processorTransactionsRefreshRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsSync(processorTransactionsSyncRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.processorTransactionsSync(processorTransactionsSyncRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/profile/network_status/get` endpoint can be used to check whether Plaid has a matching profile for the user. * @summary Check a user\'s Plaid Network status * @param {ProfileNetworkStatusGetRequest} profileNetworkStatusGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ profileNetworkStatusGet(profileNetworkStatusGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.profileNetworkStatusGet(profileNetworkStatusGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. * @summary Manually fire a bank income webhook in sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxBankIncomeFireWebhook(sandboxBankIncomeFireWebhookRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxBankIncomeFireWebhook(sandboxBankIncomeFireWebhookRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. * @summary Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxBankTransferFireWebhook(sandboxBankTransferFireWebhookRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxBankTransferFireWebhook(sandboxBankTransferFireWebhookRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxBankTransferSimulate(sandboxBankTransferSimulateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxBankTransferSimulate(sandboxBankTransferSimulateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/cra/cashflow_updates/update` endpoint to manually trigger an update for cashflow updates (Monitoring) in the Sandbox environment. * @summary Trigger an update for Cashflow Updates * @param {SandboxCraCashflowUpdatesUpdateRequest} sandboxCraCashflowUpdatesUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook * @param {SandboxIncomeFireWebhookRequest} sandboxIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxIncomeFireWebhook(sandboxIncomeFireWebhookRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxIncomeFireWebhook(sandboxIncomeFireWebhookRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/sandbox/item/fire_webhook` endpoint is used to test that code correctly handles webhooks. This endpoint can trigger the following webhooks: `DEFAULT_UPDATE`: Webhook to be fired for a given Sandbox Item simulating a default update event for the respective product as specified with the `webhook_type` in the request body. Valid Sandbox `DEFAULT_UPDATE` webhook types include: `AUTH`, `IDENTITY`, `TRANSACTIONS`, `INVESTMENTS_TRANSACTIONS`, `LIABILITIES`, `HOLDINGS`. If the Item does not support the product, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `NEW_ACCOUNTS_AVAILABLE`: Fired to indicate that a new account is available on the Item and you can launch update mode to request access to it. `SMS_MICRODEPOSITS_VERIFICATION`: Fired when a given same day micro-deposit item is verified via SMS verification. `LOGIN_REPAIRED`: Fired when an Item recovers from the `ITEM_LOGIN_REQUIRED` without the user going through update mode in your app. `PENDING_DISCONNECT`: Fired when an Item will stop working in the near future (e.g. due to a planned bank migration) and must be sent through update mode to continue working. `RECURRING_TRANSACTIONS_UPDATE`: Recurring Transactions webhook to be fired for a given Sandbox Item. If the Item does not support Recurring Transactions, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `SYNC_UPDATES_AVAILABLE`: Transactions webhook to be fired for a given Sandbox Item. If the Item does not support Transactions, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `PRODUCT_READY`: Assets webhook to be fired when a given asset report has been successfully generated. If the Item does not support Assets, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `ERROR`: Assets webhook to be fired when asset report generation has failed. If the Item does not support Assets, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `USER_PERMISSION_REVOKED`: Indicates an end user has revoked the permission that they previously granted to access an Item. May not always fire upon revocation, as some institutions’ consent portals do not trigger this webhook. Upon receiving this webhook, it is recommended to delete any stored data from Plaid associated with the account or Item. `USER_ACCOUNT_REVOKED`: Fired when an end user has revoked access to their account on the Data Provider\'s portal. This webhook is currently sent only for Chase and PNC Items, but may be sent in the future for other financial institutions. Upon receiving this webhook, it is recommended to delete any stored data from Plaid associated with the account or Item. Note that this endpoint is provided for developer ease-of-use and is not required for testing webhooks; webhooks will also fire in Sandbox under the same conditions that they would in Production (except for webhooks of type `TRANSFER`). * @summary Fire a test webhook * @param {SandboxItemFireWebhookRequest} sandboxItemFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxItemFireWebhook(sandboxItemFireWebhookRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxItemFireWebhook(sandboxItemFireWebhookRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, You can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxItemResetLogin(sandboxItemResetLoginRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxItemResetLogin(sandboxItemResetLoginRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/sandbox/item/set_verification_status` endpoint can be used to change the verification status of an Item in in the Sandbox in order to simulate the Automated Micro-deposit flow. For more information on testing Automated Micro-deposits in Sandbox, see [Auth full coverage testing](https://plaid.com/docs/auth/coverage/testing#). * @summary Set verification status for Sandbox account * @param {SandboxItemSetVerificationStatusRequest} sandboxItemSetVerificationStatusRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxItemSetVerificationStatus(sandboxItemSetVerificationStatusRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxItemSetVerificationStatus(sandboxItemSetVerificationStatusRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Save the selected accounts when connecting to the Platypus Oauth institution * @summary Save the selected accounts when connecting to the Platypus Oauth institution * @param {SandboxOauthSelectAccountsRequest} sandboxOauthSelectAccountsRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxOauthSelectAccounts(sandboxOauthSelectAccountsRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxOauthSelectAccounts(sandboxOauthSelectAccountsRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxPaymentProfileResetLogin(sandboxPaymentProfileResetLoginRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxPaymentProfileResetLogin(sandboxPaymentProfileResetLoginRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/payment/simulate` endpoint to simulate various payment events in the Sandbox environment. This endpoint will trigger the corresponding payment status webhook. * @summary Simulate a payment event in Sandbox * @param {SandboxPaymentSimulateRequest} sandboxPaymentSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxPaymentSimulate(sandboxPaymentSimulateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxPaymentSimulate(sandboxPaymentSimulateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/processor_token/create` endpoint to create a valid `processor_token` for an arbitrary institution ID and test credentials. The created `processor_token` corresponds to a new Sandbox Item. You can then use this `processor_token` with the `/processor/` API endpoints in Sandbox. You can also use `/sandbox/processor_token/create` with the [`user_custom` test username](https://plaid.com/docs/sandbox/user-custom) to generate a test account with custom data. * @summary Create a test Item and processor token * @param {SandboxProcessorTokenCreateRequest} sandboxProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxProcessorTokenCreate(sandboxProcessorTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxProcessorTokenCreate(sandboxProcessorTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/public_token/create` endpoint to create a valid `public_token` for an arbitrary institution ID, initial products, and test credentials. The created `public_token` maps to a new Sandbox Item. You can then call `/item/public_token/exchange` to exchange the `public_token` for an `access_token` and perform all API actions. `/sandbox/public_token/create` can also be used with the [`user_custom` test username](https://plaid.com/docs/sandbox/user-custom) to generate a test account with custom data, or with Plaid\'s [pre-populated Sandbox test accounts](https://plaid.com/docs/sandbox/test-credentials/). * @summary Create a test Item * @param {SandboxPublicTokenCreateRequest} sandboxPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxPublicTokenCreate(sandboxPublicTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxPublicTokenCreate(sandboxPublicTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/fire_webhook` endpoint to manually trigger a `TRANSFER_EVENTS_UPDATE` webhook in the Sandbox environment. * @summary Manually fire a Transfer webhook * @param {SandboxTransferFireWebhookRequest} sandboxTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferFireWebhook(sandboxTransferFireWebhookRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferFireWebhook(sandboxTransferFireWebhookRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/ledger/deposit/simulate` endpoint to simulate a ledger deposit event in the Sandbox environment. * @summary Simulate a ledger deposit event in Sandbox * @param {SandboxTransferLedgerDepositSimulateRequest} sandboxTransferLedgerDepositSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferLedgerDepositSimulate(sandboxTransferLedgerDepositSimulateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferLedgerDepositSimulate(sandboxTransferLedgerDepositSimulateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/ledger/simulate_available` endpoint to simulate converting pending balance to available balance for all originators in the Sandbox environment. * @summary Simulate converting pending balance to available balance * @param {SandboxTransferLedgerSimulateAvailableRequest} sandboxTransferLedgerSimulateAvailableRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferLedgerSimulateAvailable(sandboxTransferLedgerSimulateAvailableRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferLedgerSimulateAvailable(sandboxTransferLedgerSimulateAvailableRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/ledger/withdraw/simulate` endpoint to simulate a ledger withdraw event in the Sandbox environment. * @summary Simulate a ledger withdraw event in Sandbox * @param {SandboxTransferLedgerWithdrawSimulateRequest} sandboxTransferLedgerWithdrawSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferLedgerWithdrawSimulate(sandboxTransferLedgerWithdrawSimulateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferLedgerWithdrawSimulate(sandboxTransferLedgerWithdrawSimulateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/refund/simulate` endpoint to simulate a refund event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/transfer/event/sync` or `/transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a refund event in Sandbox * @param {SandboxTransferRefundSimulateRequest} sandboxTransferRefundSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferRepaymentSimulate(sandboxTransferRepaymentSimulateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferRepaymentSimulate(sandboxTransferRepaymentSimulateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/simulate` endpoint to simulate a transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/transfer/event/sync` or `/transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a transfer event in Sandbox * @param {SandboxTransferSimulateRequest} sandboxTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferSimulate(sandboxTransferSimulateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferSimulate(sandboxTransferSimulateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/sweep/simulate` endpoint to create a sweep and associated events in the Sandbox environment. Upon calling this endpoint, all transfers with a sweep status of `swept` will become `swept_settled`, all `posted` or `pending` transfers with a sweep status of `unswept` will become `swept`, and all `returned` transfers with a sweep status of `swept` will become `return_swept`. * @summary Simulate creating a sweep * @param {SandboxTransferSweepSimulateRequest} sandboxTransferSweepSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferSweepSimulate(sandboxTransferSweepSimulateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferSweepSimulate(sandboxTransferSweepSimulateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/test_clock/advance` endpoint to advance a `test_clock` in the Sandbox environment. A test clock object represents an independent timeline and has a `virtual_time` field indicating the current timestamp of the timeline. A test clock can be advanced by incrementing `virtual_time`, but may never go back to a lower `virtual_time`. If a test clock is advanced, we will simulate the changes that ought to occur during the time that elapsed. For example, a client creates a weekly recurring transfer with a test clock set at t. When the client advances the test clock by setting `virtual_time` = t + 15 days, 2 new originations should be created, along with the webhook events. The advancement of the test clock from its current `virtual_time` should be limited such that there are no more than 20 originations resulting from the advance operation on each `recurring_transfer` associated with the `test_clock`. For example, if the recurring transfer associated with this test clock originates once every 4 weeks, you can advance the `virtual_time` up to 80 weeks on each API call. * @summary Advance a test clock * @param {SandboxTransferTestClockAdvanceRequest} sandboxTransferTestClockAdvanceRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockAdvance(sandboxTransferTestClockAdvanceRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferTestClockAdvance(sandboxTransferTestClockAdvanceRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/test_clock/create` endpoint to create a `test_clock` in the Sandbox environment. A test clock object represents an independent timeline and has a `virtual_time` field indicating the current timestamp of the timeline. Test clocks are used for testing recurring transfers in Sandbox. A test clock can be associated with up to 5 recurring transfers. * @summary Create a test clock * @param {SandboxTransferTestClockCreateRequest} sandboxTransferTestClockCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockCreate(sandboxTransferTestClockCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferTestClockCreate(sandboxTransferTestClockCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/test_clock/get` endpoint to get a `test_clock` in the Sandbox environment. * @summary Get a test clock * @param {SandboxTransferTestClockGetRequest} sandboxTransferTestClockGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockGet(sandboxTransferTestClockGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferTestClockGet(sandboxTransferTestClockGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/sandbox/transfer/test_clock/list` endpoint to see a list of all your test clocks in the Sandbox environment, by ascending `virtual_time`. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired test clocks. * @summary List test clocks * @param {SandboxTransferTestClockListRequest} sandboxTransferTestClockListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockList(sandboxTransferTestClockListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxTransferTestClockList(sandboxTransferTestClockListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, You can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxUserResetLogin(sandboxUserResetLoginRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.sandboxUserResetLogin(sandboxUserResetLoginRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * After calling `/signal/evaluate`, call `/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction * @param {SignalDecisionReportRequest} signalDecisionReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalDecisionReport(signalDecisionReportRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.signalDecisionReport(signalDecisionReportRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use `/signal/evaluate` to evaluate a planned ACH transaction to get a return risk assessment (such as a risk score and risk tier) and additional risk signals. In order to obtain a valid score for an ACH transaction, Plaid must have an access token for the account, and the Item must be healthy (receiving product updates) or have recently been in a healthy state. If the transaction does not meet eligibility requirements, an error will be returned corresponding to the underlying cause. If `/signal/evaluate` is called on the same transaction multiple times within a 24-hour period, cached results may be returned. For more information please refer to the error documentation on [Item errors](/docs/errors/item/) and [Link in Update Mode](/docs/link/update-mode/). Note: This request may take some time to complete if Signal is being added to an existing Item. This is because Plaid must communicate directly with the institution when retrieving the data for the first time. * @summary Evaluate a planned ACH transaction * @param {SignalEvaluateRequest} signalEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalEvaluate(signalEvaluateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.signalEvaluate(signalEvaluateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * When an Item is not initialized with Signal, call `/signal/prepare` to opt-in that Item to the Signal data collection process, developing a Signal score. This should be done on Items where Signal was added in the `additional_consented_products` array but not in the `products`, `optional_products`, or `required_if_supported_products` array. If `/signal/prepare` is skipped on an Item that is not initialized with Signal, the initial call to `/signal/evaluate` on that Item will be less accurate, because Signal will have access to less data for computing the Signal score. If run on an Item that is already initialized with Signal, this endpoint will return a 200 response and will not modify the Item. * @summary Opt-in an Item to Signal * @param {SignalPrepareRequest} signalPrepareRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalPrepare(signalPrepareRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.signalPrepare(signalPrepareRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Call the `/signal/return/report` endpoint to report a returned transaction that was previously sent to the `/signal/evaluate` endpoint. Your feedback will be used by the model to incorporate the latest risk trend in your portfolio. * @summary Report a return for an ACH transaction * @param {SignalReturnReportRequest} signalReturnReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalReturnReport(signalReturnReportRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.signalReturnReport(signalReturnReportRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use `/signal/schedule` to schedule a planned ACH transaction. * @summary Schedule a planned ACH transaction * @param {SignalScheduleRequest} signalScheduleRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalSchedule(signalScheduleRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.signalSchedule(signalScheduleRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. * @param {StatementsDownloadRequest} statementsDownloadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ statementsDownload(statementsDownloadRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.statementsDownload(statementsDownloadRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/statements/list` endpoint retrieves a list of all statements associated with an item. * @summary Retrieve a list of all statements associated with an item. * @param {StatementsListRequest} statementsListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ statementsList(statementsListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.statementsList(statementsListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. * @summary Refresh statements data. * @param {StatementsRefreshRequest} statementsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ statementsRefresh(statementsRefreshRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.statementsRefresh(statementsRefreshRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data * @param {TransactionsEnhanceGetRequest} transactionsEnhanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsEnhance(transactionsEnhanceGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transactionsEnhance(transactionsEnhanceGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transactions/enrich` endpoint enriches raw transaction data generated by your own banking products or retrieved from other non-Plaid sources. * @summary Enrich locally-held transaction data * @param {TransactionsEnrichRequest} transactionsEnrichRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsEnrich(transactionsEnrichRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transactionsEnrich(transactionsEnrichRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsGet(transactionsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transactionsGet(transactionsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user’s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRecurringGet(transactionsRecurringGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transactionsRecurringGet(transactionsRecurringGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/transactions/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for an Item. The on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled Item. The Item must already have Transactions added as a product in order to call `/transactions/refresh`. If changes to transactions are discovered after calling `/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/transactions/sync` and `/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/transactions/get` or `/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/transactions/refresh` is offered as an optional add-on to Transactions and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {TransactionsRefreshRequest} transactionsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRefresh(transactionsRefreshRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transactionsRefresh(transactionsRefreshRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transactions/rules/v1/create` endpoint creates transaction categorization rules. Rules will be applied on the Item\'s transactions returned in `/transactions/get` response. The product is currently in beta. To request access, contact transactions-feedback@plaid.com. * @summary Create transaction category rule * @param {TransactionsRulesCreateRequest} transactionsRulesCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRulesCreate(transactionsRulesCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transactionsRulesCreate(transactionsRulesCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transactions/rules/v1/list` returns a list of transaction rules created for the Item associated with the access token. * @summary Return a list of rules created for the Item associated with the access token. * @param {TransactionsRulesListRequest} transactionsRulesListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRulesList(transactionsRulesListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transactionsRulesList(transactionsRulesListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transactions/rules/v1/remove` endpoint is used to remove a transaction rule. * @summary Remove transaction rule * @param {TransactionsRulesRemoveRequest} transactionsRulesRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRulesRemove(transactionsRulesRemoveRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transactionsRulesRemove(transactionsRulesRemoveRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsSync(transactionsSyncRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transactionsSync(transactionsSyncRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/beta/transactions/user_insights/v1/get` gets user insights for clients who have enriched data with `/transactions/enrich`. The product is currently in beta. * @summary Obtain user insights based on transactions sent through /transactions/enrich * @param {TransactionsUserInsightsGetRequest} transactionsUserInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsUserInsightsGet(transactionsUserInsightsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transactionsUserInsightsGet(transactionsUserInsightsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/authorization/cancel` endpoint to cancel a transfer authorization. A transfer authorization is eligible for cancellation if it has not yet been used to create a transfer. * @summary Cancel a transfer authorization * @param {TransferAuthorizationCancelRequest} transferAuthorizationCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferAuthorizationCancel(transferAuthorizationCancelRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferAuthorizationCancel(transferAuthorizationCancelRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/authorization/create` endpoint to authorize a transfer. This endpoint must be called prior to calling `/transfer/create`. The transfer authorization will expire if not used after one hour. (You can contact your account manager to change the default authorization lifetime.) There are four possible outcomes to calling this endpoint: - If the `authorization.decision` in the response is `declined`, the proposed transfer has failed the risk check and you cannot proceed with the transfer. - If the `authorization.decision` is `user_action_required`, additional user input is needed, usually to fix a broken bank connection, before Plaid can properly assess the risk. You need to launch Link in update mode to complete the required user action. When calling `/link/token/create` to get a new Link token, instead of providing `access_token` in the request, you should set [`transfer.authorization_id`](https://plaid.com/docs/api/link/#link-token-create-request-transfer-authorization-id) as the `authorization.id`. After the Link flow is completed, you may re-attempt the authorization. - If the `authorization.decision` is `approved`, and the `authorization.rationale_code` is `null`, the transfer has passed the risk check and you can proceed to call `/transfer/create`. - If the `authorization.decision` is `approved` and the `authorization.rationale_code` is non-`null`, the risk check could not be run: you may proceed with the transfer, but should perform your own risk evaluation. For more details, see the response schema. In Plaid\'s Sandbox environment the decisions will be returned as follows: - To approve a transfer with `null` rationale code, make an authorization request with an `amount` less than the available balance in the account. - To approve a transfer with the rationale code `MANUALLY_VERIFIED_ITEM`, create an Item in Link through the [Same Day Micro-deposits flow](https://plaid.com/docs/auth/coverage/testing/#testing-same-day-micro-deposits). - To get an authorization decision of `user_action_required`, [reset the login for an Item](https://plaid.com/docs/sandbox/#item_login_required). - To decline a transfer with the rationale code `NSF`, the available balance on the account must be less than the authorization `amount`. See [Create Sandbox test data](https://plaid.com/docs/sandbox/user-custom/) for details on how to customize data in Sandbox. - To decline a transfer with the rationale code `RISK`, the available balance on the account must be exactly $0. See [Create Sandbox test data](https://plaid.com/docs/sandbox/user-custom/) for details on how to customize data in Sandbox. * @summary Create a transfer authorization * @param {TransferAuthorizationCreateRequest} transferAuthorizationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferAuthorizationCreate(transferAuthorizationCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferAuthorizationCreate(transferAuthorizationCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferBalanceGet(transferBalanceGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferBalanceGet(transferBalanceGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/cancel` endpoint to cancel a transfer. A transfer is eligible for cancellation if the `cancellable` property returned by `/transfer/get` is `true`. * @summary Cancel a transfer * @param {TransferCancelRequest} transferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferCancel(transferCancelRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferCancel(transferCancelRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/capabilities/get` endpoint to determine the RTP eligibility information of an account to be used with Transfer. This endpoint works on all Transfer-capable Items, including those created by `/transfer/migrate_account`. To simulate RTP eligibility in Sandbox, log in using the username `user_good` and password `pass_good` and use the first two checking and savings accounts in the \"First Platypus Bank\" institution (ending in 0000 or 1111), which will return `true`. Any other account will return `false`. * @summary Get RTP eligibility information of a transfer * @param {TransferCapabilitiesGetRequest} transferCapabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferCapabilitiesGet(transferCapabilitiesGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferCapabilitiesGet(transferCapabilitiesGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/configuration/get` endpoint to view your transfer product configurations. * @summary Get transfer product configuration * @param {TransferConfigurationGetRequest} transferConfigurationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferConfigurationGet(transferConfigurationGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferConfigurationGet(transferConfigurationGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/create` endpoint to initiate a new transfer. This endpoint is retryable and idempotent; if a transfer with the provided `transfer_id` has already been created, it will return the transfer details without creating a new transfer. A transfer may still be created if a 500 error is returned; to detect this scenario, use [Transfer events](https://plaid.com/docs/transfer/reconciling-transfers/). * @summary Create a transfer * @param {TransferCreateRequest} transferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferCreate(transferCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferCreate(transferCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You’ll need to send a request of type multipart/form-data. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferDiligenceDocumentUpload(transferDiligenceDocumentUploadRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferDiligenceDocumentUpload(transferDiligenceDocumentUploadRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/diligence/submit` endpoint to submit transfer diligence on behalf of the originator (i.e., the end customer). * @summary Submit transfer diligence on behalf of the originator * @param {TransferDiligenceSubmitRequest} transferDiligenceSubmitRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferDiligenceSubmit(transferDiligenceSubmitRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferDiligenceSubmit(transferDiligenceSubmitRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/event/list` endpoint to get a list of transfer events based on specified filter criteria. * @summary List transfer events * @param {TransferEventListRequest} transferEventListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferEventList(transferEventListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferEventList(transferEventListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/transfer/event/sync` allows you to request up to the next 25 transfer events that happened after a specific `event_id`. Use the `/transfer/event/sync` endpoint to guarantee you have seen all transfer events. * @summary Sync transfer events * @param {TransferEventSyncRequest} transferEventSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferEventSync(transferEventSyncRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferEventSync(transferEventSyncRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/get` endpoint fetches information about the transfer corresponding to the given `transfer_id` or `authorization_id`. One of `transfer_id` or `authorization_id` must be populated but not both. * @summary Retrieve a transfer * @param {TransferGetRequest} transferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferGet(transferGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferGet(transferGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/intent/create` endpoint to generate a transfer intent object and invoke the Transfer UI. * @summary Create a transfer intent object to invoke the Transfer UI * @param {TransferIntentCreateRequest} transferIntentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferIntentCreate(transferIntentCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferIntentCreate(transferIntentCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/intent/get` endpoint to retrieve more information about a transfer intent. * @summary Retrieve more information about a transfer intent * @param {TransferIntentGetRequest} transferIntentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferIntentGet(transferIntentGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferIntentGet(transferIntentGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/ledger/deposit` endpoint to deposit funds into Plaid Ledger. * @summary Deposit funds into a Plaid Ledger balance * @param {TransferLedgerDepositRequest} transferLedgerDepositRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerDeposit(transferLedgerDepositRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferLedgerDeposit(transferLedgerDepositRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/ledger/distribute` endpoint to move available balance between the ledgers of the platform and one of its originators. * @summary Move available balance between the ledgers of the platform and one of its originators * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerDistribute(transferLedgerDistributeRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferLedgerDistribute(transferLedgerDistributeRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/ledger/get` endpoint to view a balance on the ledger held with Plaid. * @summary Retrieve Plaid Ledger balance * @param {TransferLedgerGetRequest} transferLedgerGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerGet(transferLedgerGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferLedgerGet(transferLedgerGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/ledger/withdraw` endpoint to withdraw funds from a Plaid Ledger balance. * @summary Withdraw funds from a Plaid Ledger balance * @param {TransferLedgerWithdrawRequest} transferLedgerWithdrawRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerWithdraw(transferLedgerWithdrawRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferLedgerWithdraw(transferLedgerWithdrawRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/list` endpoint to see a list of all your transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired transfers. * @summary List transfers * @param {TransferListRequest} transferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferList(transferListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferList(transferListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/metrics/get` endpoint to view your transfer product usage metrics. * @summary Get transfer product usage metrics * @param {TransferMetricsGetRequest} transferMetricsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferMetricsGet(transferMetricsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferMetricsGet(transferMetricsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * As an alternative to adding Items via Link, you can also use the `/transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. This endpoint is also required when adding an Item for use with wire transfers; if you intend to create wire transfers on this account, you must provide `wire_routing_number`. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid Account Manager. * @summary Migrate account into Transfers * @param {TransferMigrateAccountRequest} transferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferMigrateAccount(transferMigrateAccountRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferMigrateAccount(transferMigrateAccountRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/originator/create` endpoint to create a new originator and return an `originator_client_id`. * @summary Create a new originator * @param {TransferOriginatorCreateRequest} transferOriginatorCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorCreate(transferOriginatorCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferOriginatorCreate(transferOriginatorCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/originator/funding_account/update` endpoint to update the funding account associated with the originator. * @summary Update the funding account associated with the originator * @param {TransferOriginatorFundingAccountUpdateRequest} transferOriginatorFundingAccountUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorFundingAccountUpdate(transferOriginatorFundingAccountUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferOriginatorFundingAccountUpdate(transferOriginatorFundingAccountUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/originator/get` endpoint gets status updates for an originator\'s onboarding process. This information is also available via the Transfer page on the Plaid dashboard. * @summary Get status of an originator\'s onboarding * @param {TransferOriginatorGetRequest} transferOriginatorGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorGet(transferOriginatorGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferOriginatorGet(transferOriginatorGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/originator/list` endpoint gets status updates for all of your originators\' onboarding. This information is also available via the Plaid dashboard. * @summary Get status of all originators\' onboarding * @param {TransferOriginatorListRequest} transferOriginatorListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorList(transferOriginatorListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferOriginatorList(transferOriginatorListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/platform/originator/create` endpoint allows gathering information about the originator specific to the Scaled Platform Transfer offering, including the originator\'s agreement to legal terms required before accepting any further information related to the originator. * @summary Create an originator for scaled platform customers * @param {TransferPlatformOriginatorCreateRequest} transferPlatformOriginatorCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferPlatformOriginatorCreate(transferPlatformOriginatorCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferPlatformOriginatorCreate(transferPlatformOriginatorCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/platform/person/create` endpoint to create a person record associated with an originator and optionally submit person-specific requirements. * @summary Create a person associated with an originator * @param {TransferPlatformPersonCreateRequest} transferPlatformPersonCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferPlatformPersonCreate(transferPlatformPersonCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferPlatformPersonCreate(transferPlatformPersonCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/platform/requirement/submit` endpoint allows platforms to submit onboarding requirements for an originator as part of the Scaled Platform Transfer offering. * @summary Submit onboarding requirements for Scaled Platform originators * @param {TransferPlatformRequirementSubmitRequest} transferPlatformRequirementSubmitRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferPlatformRequirementSubmit(transferPlatformRequirementSubmitRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferPlatformRequirementSubmit(transferPlatformRequirementSubmitRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/questionnaire/create` endpoint generates a Plaid-hosted onboarding UI URL. Redirect the originator to this URL to provide their due diligence information and agree to Plaid’s terms for ACH money movement. * @summary Generate a Plaid-hosted onboarding UI URL. * @param {TransferQuestionnaireCreateRequest} transferQuestionnaireCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferQuestionnaireCreate(transferQuestionnaireCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferQuestionnaireCreate(transferQuestionnaireCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringCancel(transferRecurringCancelRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferRecurringCancel(transferRecurringCancelRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/recurring/create` endpoint to initiate a new recurring transfer. This capability is not currently supported for Transfer UI or Platform Payments (beta) customers. * @summary Create a recurring transfer * @param {TransferRecurringCreateRequest} transferRecurringCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringCreate(transferRecurringCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferRecurringCreate(transferRecurringCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/recurring/get` fetches information about the recurring transfer corresponding to the given `recurring_transfer_id`. * @summary Retrieve a recurring transfer * @param {TransferRecurringGetRequest} transferRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringGet(transferRecurringGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferRecurringGet(transferRecurringGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/recurring/list` endpoint to see a list of all your recurring transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired recurring transfers. * @summary List recurring transfers * @param {TransferRecurringListRequest} transferRecurringListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringList(transferRecurringListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferRecurringList(transferRecurringListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/refund/cancel` endpoint to cancel a refund. A refund is eligible for cancellation if it has not yet been submitted to the payment network. * @summary Cancel a refund * @param {TransferRefundCancelRequest} transferRefundCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRefundCancel(transferRefundCancelRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferRefundCancel(transferRefundCancelRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Use the `/transfer/refund/create` endpoint to create a refund for a transfer. A transfer can be refunded if the transfer was initiated in the past 180 days. Refunds come out of the available balance of the ledger used for the original debit transfer. If there are not enough funds in the available balance to cover the refund amount, the refund will be rejected. You can create a refund at any time. Plaid does not impose any hold time on refunds. * @summary Create a refund * @param {TransferRefundCreateRequest} transferRefundCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRefundCreate(transferRefundCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferRefundCreate(transferRefundCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/refund/get` endpoint fetches information about the refund corresponding to the given `refund_id`. * @summary Retrieve a refund * @param {TransferRefundGetRequest} transferRefundGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRefundGet(transferRefundGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferRefundGet(transferRefundGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/repayment/list` endpoint fetches repayments matching the given filters. Repayments are returned in reverse-chronological order (most recent first) starting at the given `start_time`. * @summary Lists historical repayments * @param {TransferRepaymentListRequest} transferRepaymentListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRepaymentList(transferRepaymentListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferRepaymentList(transferRepaymentListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/repayment/return/list` endpoint retrieves the set of returns that were batched together into the specified repayment. The sum of amounts of returns retrieved by this request equals the amount of the repayment. * @summary List the returns included in a repayment * @param {TransferRepaymentReturnListRequest} transferRepaymentReturnListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRepaymentReturnList(transferRepaymentReturnListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferRepaymentReturnList(transferRepaymentReturnListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep * @param {TransferSweepGetRequest} transferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferSweepGet(transferSweepGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferSweepGet(transferSweepGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * The `/transfer/sweep/list` endpoint fetches sweeps matching the given filters. * @summary List sweeps * @param {TransferSweepListRequest} transferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferSweepList(transferSweepListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.transferSweepList(transferSweepListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Returns user permissioned account data including identity and Item access tokens. * @summary Retrieve User Account * @param {UserAccountSessionGetRequest} userAccountSessionGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userAccountSessionGet(userAccountSessionGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.userAccountSessionGet(userAccountSessionGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint should be called for each of your end users before they begin a Plaid Check or Income flow, or a Multi-Item Link flow. This provides you a single token to access all data associated with the user. You should only create one per end user. The `consumer_report_user_identity` object must be present in order to create a Plaid Check Consumer Report for a user. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If you call the endpoint multiple times with the same `client_user_id`, the first creation call will succeed and the rest will fail with an error message indicating that the user has been created for the given `client_user_id`. Ensure that you store the `user_token` along with your user\'s identifier in your database, as it is not possible to retrieve a previously created `user_token`. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userCreate(userCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.userCreate(userCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Returns Items associated with a User along with their corresponding statuses. * @summary Get Items associated with a User * @param {UserItemsGetRequest} userItemsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userItemsGet(userItemsGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.userItemsGet(userItemsGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * `/user/remove` deletes a user token and and associated information, including any Items associated with the token. Any subsequent calls to retrieve information using the same user token will result in an error stating the user does not exist. * @summary Remove user * @param {UserRemoveRequest} userRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userRemove(userRemoveRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.userRemove(userRemoveRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint is used to create a third-party user token. This token can be shared with and used by a specified third-party client to access data associated with the user through supported endpoints. Ensure you store the `third_party_user_token` along with the `user_token` and `third_party_client_id`, as it is not possible to retrieve a previously created `third_party_user_token`. * @summary Create a third-party user token * @param {UserThirdPartyTokenCreateRequest} userThirdPartyTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userThirdPartyTokenRemove(userThirdPartyTokenRemoveRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.userThirdPartyTokenRemove(userThirdPartyTokenRemoveRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint is used to update user information associated with an existing `user_token`. It can also be used to enable an existing `user_token` for use with Consumer Reports by Plaid Check, by adding a `consumer_report_user_identity` object to the user. Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. * @summary Update user information * @param {UserUpdateRequest} userUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userUpdate(userUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.userUpdate(userUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Create an e-wallet. The response is the newly created e-wallet object. * @summary Create an e-wallet * @param {WalletCreateRequest} walletCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletCreate(walletCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.walletCreate(walletCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Fetch an e-wallet. The response includes the current balance. * @summary Fetch an e-wallet * @param {WalletGetRequest} walletGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletGet(walletGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.walletGet(walletGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint lists all e-wallets in descending order of creation. * @summary Fetch a list of e-wallets * @param {WalletListRequest} walletListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletList(walletListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.walletList(walletListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Execute a transaction using the specified e-wallet. Specify the e-wallet to debit from, the counterparty to credit to, the idempotency key to prevent duplicate transactions, the amount and reference for the transaction. Transactions will settle in seconds to several days, depending on the underlying payment rail. * @summary Execute a transaction using an e-wallet * @param {WalletTransactionExecuteRequest} walletTransactionExecuteRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletTransactionExecute(walletTransactionExecuteRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.walletTransactionExecute(walletTransactionExecuteRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Fetch a specific e-wallet transaction * @summary Fetch an e-wallet transaction * @param {WalletTransactionGetRequest} walletTransactionGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletTransactionGet(walletTransactionGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.walletTransactionGet(walletTransactionGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * This endpoint lists the latest transactions of the specified e-wallet. Transactions are returned in descending order by the `created_at` time. * @summary List e-wallet transactions * @param {WalletTransactionListRequest} walletTransactionListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletTransactionList(walletTransactionListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.walletTransactionList(walletTransactionListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Create a new entity watchlist screening to check your customer against watchlists defined in the associated entity watchlist program. If your associated program has ongoing screening enabled, this is the profile information that will be used to monitor your customer over time. * @summary Create a watchlist screening for an entity * @param {WatchlistScreeningEntityCreateRequest} watchlistScreeningEntityCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityCreate(watchlistScreeningEntityCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningEntityCreate(watchlistScreeningEntityCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Retrieve an entity watchlist screening. * @summary Get an entity screening * @param {WatchlistScreeningEntityGetRequest} watchlistScreeningEntityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityGet(watchlistScreeningEntityGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningEntityGet(watchlistScreeningEntityGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List all changes to the entity watchlist screening in reverse-chronological order. If the watchlist screening has not been edited, no history will be returned. * @summary List history for entity watchlist screenings * @param {WatchlistScreeningEntityHistoryListRequest} watchlistScreeningEntityHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityHistoryList(watchlistScreeningEntityHistoryListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningEntityHistoryList(watchlistScreeningEntityHistoryListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List all hits for the entity watchlist screening. * @summary List hits for entity watchlist screenings * @param {WatchlistScreeningEntityHitListRequest} watchlistScreeningEntityHitListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityHitList(watchlistScreeningEntityHitListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningEntityHitList(watchlistScreeningEntityHitListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List all entity screenings. * @summary List entity watchlist screenings * @param {WatchlistScreeningEntityListRequest} watchlistScreeningEntityListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityList(watchlistScreeningEntityListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningEntityList(watchlistScreeningEntityListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Get an entity watchlist screening program * @summary Get entity watchlist screening program * @param {WatchlistScreeningEntityProgramGetRequest} watchlistScreeningEntityProgramGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityProgramGet(watchlistScreeningEntityProgramGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningEntityProgramGet(watchlistScreeningEntityProgramGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List all entity watchlist screening programs * @summary List entity watchlist screening programs * @param {WatchlistScreeningEntityProgramListRequest} watchlistScreeningEntityProgramListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityProgramList(watchlistScreeningEntityProgramListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningEntityProgramList(watchlistScreeningEntityProgramListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Create a review for an entity watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary Create a review for an entity watchlist screening * @param {WatchlistScreeningEntityReviewCreateRequest} watchlistScreeningEntityReviewCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityReviewCreate(watchlistScreeningEntityReviewCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningEntityReviewCreate(watchlistScreeningEntityReviewCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List all reviews for a particular entity watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary List reviews for entity watchlist screenings * @param {WatchlistScreeningEntityReviewListRequest} watchlistScreeningEntityReviewListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityReviewList(watchlistScreeningEntityReviewListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningEntityReviewList(watchlistScreeningEntityReviewListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Update an entity watchlist screening. * @summary Update an entity screening * @param {WatchlistScreeningEntityUpdateRequest} watchlistScreeningEntityUpdateRequest The entity screening was successfully updated. * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityUpdate(watchlistScreeningEntityUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningEntityUpdate(watchlistScreeningEntityUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Create a new Watchlist Screening to check your customer against watchlists defined in the associated Watchlist Program. If your associated program has ongoing screening enabled, this is the profile information that will be used to monitor your customer over time. * @summary Create a watchlist screening for a person * @param {WatchlistScreeningIndividualCreateRequest} watchlistScreeningIndividualCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualCreate(watchlistScreeningIndividualCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningIndividualCreate(watchlistScreeningIndividualCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Retrieve a previously created individual watchlist screening * @summary Retrieve an individual watchlist screening * @param {WatchlistScreeningIndividualGetRequest} watchlistScreeningIndividualGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualGet(watchlistScreeningIndividualGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningIndividualGet(watchlistScreeningIndividualGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List all changes to the individual watchlist screening in reverse-chronological order. If the watchlist screening has not been edited, no history will be returned. * @summary List history for individual watchlist screenings * @param {WatchlistScreeningIndividualHistoryListRequest} watchlistScreeningIndividualHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualHistoryList(watchlistScreeningIndividualHistoryListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningIndividualHistoryList(watchlistScreeningIndividualHistoryListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List all hits found by Plaid for a particular individual watchlist screening. * @summary List hits for individual watchlist screening * @param {WatchlistScreeningIndividualHitListRequest} watchlistScreeningIndividualHitListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualHitList(watchlistScreeningIndividualHitListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningIndividualHitList(watchlistScreeningIndividualHitListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List previously created watchlist screenings for individuals * @summary List Individual Watchlist Screenings * @param {WatchlistScreeningIndividualListRequest} watchlistScreeningIndividualListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualList(watchlistScreeningIndividualListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningIndividualList(watchlistScreeningIndividualListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Get an individual watchlist screening program * @summary Get individual watchlist screening program * @param {WatchlistScreeningIndividualProgramGetRequest} watchlistScreeningIndividualProgramGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualProgramGet(watchlistScreeningIndividualProgramGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningIndividualProgramGet(watchlistScreeningIndividualProgramGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List all individual watchlist screening programs * @summary List individual watchlist screening programs * @param {WatchlistScreeningIndividualProgramListRequest} watchlistScreeningIndividualProgramListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualProgramList(watchlistScreeningIndividualProgramListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningIndividualProgramList(watchlistScreeningIndividualProgramListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Create a review for the individual watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary Create a review for an individual watchlist screening * @param {WatchlistScreeningIndividualReviewCreateRequest} watchlistScreeningIndividualReviewCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualReviewCreate(watchlistScreeningIndividualReviewCreateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningIndividualReviewCreate(watchlistScreeningIndividualReviewCreateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * List all reviews for the individual watchlist screening. * @summary List reviews for individual watchlist screenings * @param {WatchlistScreeningIndividualReviewListRequest} watchlistScreeningIndividualReviewListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualReviewList(watchlistScreeningIndividualReviewListRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningIndividualReviewList(watchlistScreeningIndividualReviewListRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Update a specific individual watchlist screening. This endpoint can be used to add additional customer information, correct outdated information, add a reference id, assign the individual to a reviewer, and update which program it is associated with. Please note that you may not update `search_terms` and `status` at the same time since editing `search_terms` may trigger an automatic `status` change. * @summary Update individual watchlist screening * @param {WatchlistScreeningIndividualUpdateRequest} watchlistScreeningIndividualUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualUpdate(watchlistScreeningIndividualUpdateRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.watchlistScreeningIndividualUpdate(watchlistScreeningIndividualUpdateRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, /** * Plaid signs all outgoing webhooks and provides JSON Web Tokens (JWTs) so that you can verify the authenticity of any incoming webhooks to your application. A message signature is included in the `Plaid-Verification` header. The `/webhook_verification_key/get` endpoint provides a JSON Web Key (JWK) that can be used to verify a JWT. * @summary Get webhook verification key * @param {WebhookVerificationKeyGetRequest} webhookVerificationKeyGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ webhookVerificationKeyGet(webhookVerificationKeyGetRequest, options) { return __awaiter(this, void 0, void 0, function* () { const localVarAxiosArgs = yield localVarAxiosParamCreator.webhookVerificationKeyGet(webhookVerificationKeyGetRequest, options); return common_1.createRequestFunction(localVarAxiosArgs, axios_1.default, base_1.BASE_PATH, configuration); }); }, }; }; exports.PlaidApiFp = PlaidApiFp; /** * PlaidApi - factory interface * @export */ const PlaidApiFactory = function (configuration, basePath, axios) { const localVarFp = exports.PlaidApiFp(configuration); return { /** * The `/accounts/balance/get` endpoint returns the real-time balance for each of an Item\'s accounts. While other endpoints, such as `/accounts/get`, return a balance object, only `/accounts/balance/get` forces the available and current balance fields to be refreshed rather than cached. This endpoint can be used for existing Items that were added via any of Plaid’s other products. This endpoint can be used as long as Link has been initialized with any other product, `balance` itself is not a product that can be used to initialize Link. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. * @summary Retrieve real-time balance data * @param {AccountsBalanceGetRequest} accountsBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ accountsBalanceGet(accountsBalanceGetRequest, options) { return localVarFp.accountsBalanceGet(accountsBalanceGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/accounts/get` endpoint can be used to retrieve a list of accounts associated with any linked Item. Plaid will only return active bank accounts — that is, accounts that are not closed and are capable of carrying a balance. To return new accounts that were created after the user linked their Item, you can listen for the [`NEW_ACCOUNTS_AVAILABLE`](https://plaid.com/docs/api/items/#new_accounts_available) webhook and then use Link\'s [update mode](https://plaid.com/docs/link/update-mode/) to request that the user share this new account with you. `/accounts/get` is free to use and retrieves cached information, rather than extracting fresh information from the institution. The balance returned will reflect the balance at the time of the last successful Item update. If the Item is enabled for a regularly updating product, such as Transactions, Investments, or Liabilities, the balance will typically update about once a day, as long as the Item is healthy. If the Item is enabled only for products that do not frequently update, such as Auth or Identity, balance data may be much older. For realtime balance information, use the paid endpoint `/accounts/balance/get` instead. * @summary Retrieve accounts * @param {AccountsGetRequest} accountsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ accountsGet(accountsGetRequest, options) { return localVarFp.accountsGet(accountsGetRequest, options).then((request) => request(axios, basePath)); }, /** * Allows financial institutions to retrieve information about Plaid clients for the purpose of building control-tower experiences * @summary Retrieve information about a Plaid application * @param {ApplicationGetRequest} applicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ applicationGet(applicationGetRequest, options) { return localVarFp.applicationGet(applicationGetRequest, options).then((request) => request(axios, basePath)); }, /** * Plaid can provide an Audit Copy of any Asset Report directly to a participating third party on your behalf. For example, Plaid can supply an Audit Copy directly to Fannie Mae on your behalf if you participate in the Day 1 Certainty™ program. An Audit Copy contains the same underlying data as the Asset Report. To grant access to an Audit Copy, use the `/asset_report/audit_copy/create` endpoint to create an `audit_copy_token` and then pass that token to the third party who needs access. Each third party has its own `auditor_id`, for example `fannie_mae`. You’ll need to create a separate Audit Copy for each third party to whom you want to grant access to the Report. * @summary Create Asset Report Audit Copy * @param {AssetReportAuditCopyCreateRequest} assetReportAuditCopyCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportAuditCopyCreate(assetReportAuditCopyCreateRequest, options) { return localVarFp.assetReportAuditCopyCreate(assetReportAuditCopyCreateRequest, options).then((request) => request(axios, basePath)); }, /** * `/asset_report/audit_copy/get` allows auditors to get a copy of an Asset Report that was previously shared via the `/asset_report/audit_copy/create` endpoint. The caller of `/asset_report/audit_copy/create` must provide the `audit_copy_token` to the auditor. This token can then be used to call `/asset_report/audit_copy/create`. * @summary Retrieve an Asset Report Audit Copy * @param {AssetReportAuditCopyGetRequest} assetReportAuditCopyGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportAuditCopyGet(assetReportAuditCopyGetRequest, options) { return localVarFp.assetReportAuditCopyGet(assetReportAuditCopyGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/asset_report/audit_copy/remove` endpoint allows you to remove an Audit Copy. Removing an Audit Copy invalidates the `audit_copy_token` associated with it, meaning both you and any third parties holding the token will no longer be able to use it to access Report data. Items associated with the Asset Report, the Asset Report itself and other Audit Copies of it are not affected and will remain accessible after removing the given Audit Copy. * @summary Remove Asset Report Audit Copy * @param {AssetReportAuditCopyRemoveRequest} assetReportAuditCopyRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportAuditCopyRemove(assetReportAuditCopyRemoveRequest, options) { return localVarFp.assetReportAuditCopyRemove(assetReportAuditCopyRemoveRequest, options).then((request) => request(axios, basePath)); }, /** * The `/asset_report/create` endpoint initiates the process of creating an Asset Report, which can then be retrieved by passing the `asset_report_token` return value to the `/asset_report/get` or `/asset_report/pdf/get` endpoints. The Asset Report takes some time to be created and is not available immediately after calling `/asset_report/create`. The exact amount of time to create the report will vary depending on how many days of history are requested and will typically range from a few seconds to about one minute. When the Asset Report is ready to be retrieved using `/asset_report/get` or `/asset_report/pdf/get`, Plaid will fire a `PRODUCT_READY` webhook. For full details of the webhook schema, see [Asset Report webhooks](https://plaid.com/docs/api/products/assets/#webhooks). The `/asset_report/create` endpoint creates an Asset Report at a moment in time. Asset Reports are immutable. To get an updated Asset Report, use the `/asset_report/refresh` endpoint. * @summary Create an Asset Report * @param {AssetReportCreateRequest} assetReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportCreate(assetReportCreateRequest, options) { return localVarFp.assetReportCreate(assetReportCreateRequest, options).then((request) => request(axios, basePath)); }, /** * By default, an Asset Report will contain all of the accounts on a given Item. In some cases, you may not want the Asset Report to contain all accounts. For example, you might have the end user choose which accounts are relevant in Link using the Account Select view, which you can enable in the dashboard. Or, you might always exclude certain account types or subtypes, which you can identify by using the `/accounts/get` endpoint. To narrow an Asset Report to only a subset of accounts, use the `/asset_report/filter` endpoint. To exclude certain Accounts from an Asset Report, first use the `/asset_report/create` endpoint to create the report, then send the `asset_report_token` along with a list of `account_ids` to exclude to the `/asset_report/filter` endpoint, to create a new Asset Report which contains only a subset of the original Asset Report\'s data. Because Asset Reports are immutable, calling `/asset_report/filter` does not alter the original Asset Report in any way; rather, `/asset_report/filter` creates a new Asset Report with a new token and id. Asset Reports created via `/asset_report/filter` do not contain new Asset data, and are not billed. Plaid will fire a [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook once generation of the filtered Asset Report has completed. * @summary Filter Asset Report * @param {AssetReportFilterRequest} assetReportFilterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportFilter(assetReportFilterRequest, options) { return localVarFp.assetReportFilter(assetReportFilterRequest, options).then((request) => request(axios, basePath)); }, /** * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportGet(assetReportGetRequest, options) { return localVarFp.assetReportGet(assetReportGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/asset_report/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/asset_report/pdf/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/asset_report/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). * @summary Retrieve a PDF Asset Report * @param {AssetReportPDFGetRequest} assetReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportPdfGet(assetReportPDFGetRequest, options) { return localVarFp.assetReportPdfGet(assetReportPDFGetRequest, options).then((request) => request(axios, basePath)); }, /** * An Asset Report is an immutable snapshot of a user\'s assets. In order to \"refresh\" an Asset Report you created previously, you can use the `/asset_report/refresh` endpoint to create a new Asset Report based on the old one, but with the most recent data available. The new Asset Report will contain the same Items as the original Report, as well as the same filters applied by any call to `/asset_report/filter`. By default, the new Asset Report will also use the same parameters you submitted with your original `/asset_report/create` request, but the original `days_requested` value and the values of any parameters in the `options` object can be overridden with new values. To change these arguments, simply supply new values for them in your request to `/asset_report/refresh`. Submit an empty string (\"\") for any previously-populated fields you would like set as empty. * @summary Refresh an Asset Report * @param {AssetReportRefreshRequest} assetReportRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportRefresh(assetReportRefreshRequest, options) { return localVarFp.assetReportRefresh(assetReportRefreshRequest, options).then((request) => request(axios, basePath)); }, /** * The `/item/remove` endpoint allows you to invalidate an `access_token`, meaning you will not be able to create new Asset Reports with it. Removing an Item does not affect any Asset Reports or Audit Copies you have already created, which will remain accessible until you remove them specifically. The `/asset_report/remove` endpoint allows you to remove access to an Asset Report. Removing an Asset Report invalidates its `asset_report_token`, meaning you will no longer be able to use it to access Report data or create new Audit Copies. Removing an Asset Report does not affect the underlying Items, but does invalidate any `audit_copy_tokens` associated with the Asset Report. * @summary Delete an Asset Report * @param {AssetReportRemoveRequest} assetReportRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ assetReportRemove(assetReportRemoveRequest, options) { return localVarFp.assetReportRemove(assetReportRemoveRequest, options).then((request) => request(axios, basePath)); }, /** * The `/auth/get` endpoint returns the bank account and bank identification numbers (such as routing numbers, for US accounts) associated with an Item\'s checking, savings, and cash management accounts, along with high-level account data and balances when available. Versioning note: In API version 2017-03-08, the schema of the `numbers` object returned by this endpoint is substantially different. For details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2018-05-22). * @summary Retrieve auth data * @param {AuthGetRequest} authGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ authGet(authGetRequest, options) { return localVarFp.authGet(authGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. * @summary Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferBalanceGet(bankTransferBalanceGetRequest, options) { return localVarFp.bankTransferBalanceGet(bankTransferBalanceGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. * @summary Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferCancel(bankTransferCancelRequest, options) { return localVarFp.bankTransferCancel(bankTransferCancelRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. * @summary Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferCreate(bankTransferCreateRequest, options) { return localVarFp.bankTransferCreate(bankTransferCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/bank_transfer/event/list` endpoint to get a list of Plaid-initiated ACH or bank transfer events based on specified filter criteria. When using Auth with micro-deposit verification enabled, this endpoint can be used to fetch status updates on ACH micro-deposits. For more details, see [micro-deposit events](https://plaid.com/docs/auth/coverage/microdeposit-events/). * @summary List bank transfer events * @param {BankTransferEventListRequest} bankTransferEventListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferEventList(bankTransferEventListRequest, options) { return localVarFp.bankTransferEventList(bankTransferEventListRequest, options).then((request) => request(axios, basePath)); }, /** * `/bank_transfer/event/sync` allows you to request up to the next 25 Plaid-initiated bank transfer events that happened after a specific `event_id`. When using Auth with micro-deposit verification enabled, this endpoint can be used to fetch status updates on ACH micro-deposits. For more details, see [micro-deposit events](https://www.plaid.com/docs/auth/coverage/microdeposit-events/). * @summary Sync bank transfer events * @param {BankTransferEventSyncRequest} bankTransferEventSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferEventSync(bankTransferEventSyncRequest, options) { return localVarFp.bankTransferEventSync(bankTransferEventSyncRequest, options).then((request) => request(axios, basePath)); }, /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. * @summary Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferGet(bankTransferGetRequest, options) { return localVarFp.bankTransferGet(bankTransferGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. * @summary List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferList(bankTransferListRequest, options) { return localVarFp.bankTransferList(bankTransferListRequest, options).then((request) => request(axios, basePath)); }, /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid Account Manager. * @summary Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferMigrateAccount(bankTransferMigrateAccountRequest, options) { return localVarFp.bankTransferMigrateAccount(bankTransferMigrateAccountRequest, options).then((request) => request(axios, basePath)); }, /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferSweepGet(bankTransferSweepGetRequest, options) { return localVarFp.bankTransferSweepGet(bankTransferSweepGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. * @summary List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ bankTransferSweepList(bankTransferSweepListRequest, options) { return localVarFp.bankTransferSweepList(bankTransferSweepListRequest, options).then((request) => request(axios, basePath)); }, /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. * @summary Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconAccountRiskEvaluate(beaconAccountRiskEvaluateRequest, options) { return localVarFp.beaconAccountRiskEvaluate(beaconAccountRiskEvaluateRequest, options).then((request) => request(axios, basePath)); }, /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. * @summary Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconDuplicateGet(beaconDuplicateGetRequest, options) { return localVarFp.beaconDuplicateGet(beaconDuplicateGetRequest, options).then((request) => request(axios, basePath)); }, /** * Create a fraud report for a given Beacon User. * @summary Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportCreate(beaconReportCreateRequest, options) { return localVarFp.beaconReportCreate(beaconReportCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Returns a Beacon report for a given Beacon report id. * @summary Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportGet(beaconReportGetRequest, options) { return localVarFp.beaconReportGet(beaconReportGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. * @summary List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportList(beaconReportListRequest, options) { return localVarFp.beaconReportList(beaconReportListRequest, options).then((request) => request(axios, basePath)); }, /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. * @summary Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportSyndicationGet(beaconReportSyndicationGetRequest, options) { return localVarFp.beaconReportSyndicationGet(beaconReportSyndicationGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. * @summary List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconReportSyndicationList(beaconReportSyndicationListRequest, options) { return localVarFp.beaconReportSyndicationList(beaconReportSyndicationListRequest, options).then((request) => request(axios, basePath)); }, /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. * @summary Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest, options) { return localVarFp.beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. * @summary Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserCreate(beaconUserCreateRequest, options) { return localVarFp.beaconUserCreate(beaconUserCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. * @summary Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserGet(beaconUserGetRequest, options) { return localVarFp.beaconUserGet(beaconUserGetRequest, options).then((request) => request(axios, basePath)); }, /** * List all changes to the Beacon User in reverse-chronological order. * @summary List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserHistoryList(beaconUserHistoryListRequest, options) { return localVarFp.beaconUserHistoryList(beaconUserHistoryListRequest, options).then((request) => request(axios, basePath)); }, /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to \"rejected\", we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to \"cleared\", we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to \"cleared\". There are no restrictions on updating a Beacon User\'s status to \"pending_review\". If these conditions are not met, the request will be rejected with an error explaining the issue. * @summary Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserReview(beaconUserReviewRequest, options) { return localVarFp.beaconUserReview(beaconUserReviewRequest, options).then((request) => request(axios, basePath)); }, /** * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. * @summary Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ beaconUserUpdate(beaconUserUpdateRequest, options) { return localVarFp.beaconUserUpdate(beaconUserUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. All implementations are recommended to use the newer `personal_finance_category` taxonomy instead of the older `category` taxonomy supported by this endpoint. The [`personal_finance_category taxonomy` CSV file](https://plaid.com/documents/transactions-personal-finance-category-taxonomy.csv) is available for download and is not accessible via API. * @summary Get categories * @param {object} body * @param {*} [options] Override http request option. * @throws {RequiredError} */ categoriesGet(body, options) { return localVarFp.categoriesGet(body, options).then((request) => request(axios, basePath)); }, /** * List a historical log of Item consent events. Consent logs are only available for events occurring on or after November 7, 2024. Up to three years of consent logs will be available via the endpoint. * @summary List a historical log of item consent events * @param {ConsentEventsGetRequest} consentEventsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ consentEventsGet(consentEventsGetRequest, options) { return localVarFp.consentEventsGet(consentEventsGetRequest, options).then((request) => request(axios, basePath)); }, /** * Retrieves all existing CRB Bank Income and Base reports for the consumer in PDF format. Response is PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. * @summary Retrieve a PDF Reports * @param {ConsumerReportPDFGetRequest} consumerReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ consumerReportPdfGet(consumerReportPDFGetRequest, options) { return localVarFp.consumerReportPdfGet(consumerReportPDFGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/cra/bank_income/create` creates a CRA report for income verification * @summary Create a CRA report for income verification * @param {CraBankIncomeCreateRequest} craBankIncomeCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craBankIncomeCreate(craBankIncomeCreateRequest, options) { return localVarFp.craBankIncomeCreate(craBankIncomeCreateRequest, options).then((request) => request(axios, basePath)); }, /** * `/cra/bank_income/get` returns the bank income report(s) for a specified user. * @summary Retrieve information from the bank accounts used for income verification * @param {CraBankIncomeGetRequest} craBankIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craBankIncomeGet(craBankIncomeGetRequest, options) { return localVarFp.craBankIncomeGet(craBankIncomeGetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint allows you to retrieve the Base Report for your user, allowing you to receive comprehensive bank account and cash flow data. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve a Base Report * @param {CraCheckReportBaseReportGetRequest} craCheckReportBaseReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options) { return localVarFp.craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options) { return localVarFp.craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report * @param {CraCheckReportCreateRequest} craCheckReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportCreate(craCheckReportCreateRequest, options) { return localVarFp.craCheckReportCreate(craCheckReportCreateRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow information from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest, options) { return localVarFp.craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_attributes` product or have generated a report using `/cra/check_report/create`, we will generate the attributes when you call this endpoint. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest, options) { return localVarFp.craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportPartnerInsightsGet(craCheckReportPartnerInsightsGetRequest, options) { return localVarFp.craCheckReportPartnerInsightsGet(craCheckReportPartnerInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/cra/check_report/pdf/get` retrieves the most recent Consumer Report in PDF format. By default, the most recent Base Report (if it exists) for the user will be returned. To request that the most recent Income Insights report be included in the PDF as well, use the `add-ons` field. * @summary Retrieve Consumer Reports as a PDF * @param {CraCheckReportPDFGetRequest} craCheckReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craCheckReportPdfGet(craCheckReportPDFGetRequest, options) { return localVarFp.craCheckReportPdfGet(craCheckReportPDFGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/cra/loans/applications/register` registers loan applications and decisions. * @summary Register loan applications and decisions. * @param {CraLoansApplicationsRegisterRequest} craLoansApplicationsRegisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansApplicationsRegister(craLoansApplicationsRegisterRequest, options) { return localVarFp.craLoansApplicationsRegister(craLoansApplicationsRegisterRequest, options).then((request) => request(axios, basePath)); }, /** * `/cra/loans/register` registers a list of loans to their applicants. * @summary Register a list of loans to their applicants. * @param {CRALoansRegisterRequest} cRALoansRegisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansRegister(cRALoansRegisterRequest, options) { return localVarFp.craLoansRegister(cRALoansRegisterRequest, options).then((request) => request(axios, basePath)); }, /** * `/cra/loans/unregister` indicates the loans have reached a final status and no further updates are expected. * @summary Unregister a list of loans. * @param {CraLoansUnregisterRequest} craLoansUnregisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansUnregister(craLoansUnregisterRequest, options) { return localVarFp.craLoansUnregister(craLoansUnregisterRequest, options).then((request) => request(axios, basePath)); }, /** * `/cra/loans/update` updates loan information such as the status and payment history. * @summary Updates loan data. * @param {CraLoansUpdateRequest} craLoansUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craLoansUpdate(craLoansUpdateRequest, options) { return localVarFp.craLoansUpdate(craLoansUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint allows you to retrieve a Monitoring Insights report by passing in the `user_token` referred to in the webhook you received. * @summary Retrieve a Monitoring Insights Report * @param {CraMonitoringInsightsGetRequest} craMonitoringInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craMonitoringInsightsGet(craMonitoringInsightsGetRequest, options) { return localVarFp.craMonitoringInsightsGet(craMonitoringInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint allows you to subscribe to insights for a user\'s linked CRA items, which are updated every day (best-effort). * @summary Subscribe to Monitoring Insights * @param {CraMonitoringInsightsSubscribeRequest} craMonitoringInsightsSubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craMonitoringInsightsSubscribe(craMonitoringInsightsSubscribeRequest, options) { return localVarFp.craMonitoringInsightsSubscribe(craMonitoringInsightsSubscribeRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint allows you to unsubscribe from previously subscribed Monitoring Insights. * @summary Unsubscribe from Monitoring Insights * @param {CraMonitoringInsightsUnsubscribeRequest} craMonitoringInsightsUnsubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craMonitoringInsightsUnsubscribe(craMonitoringInsightsUnsubscribeRequest, options) { return localVarFp.craMonitoringInsightsUnsubscribe(craMonitoringInsightsUnsubscribeRequest, options).then((request) => request(axios, basePath)); }, /** * `/cra/partner_insights/get` returns cash flow insights for a specified user. * @summary Retrieve cash flow insights from the bank accounts used for income verification * @param {CraPartnerInsightsGetRequest} craPartnerInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ craPartnerInsightsGet(craPartnerInsightsGetRequest, options) { return localVarFp.craPartnerInsightsGet(craPartnerInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ createPaymentToken(paymentInitiationPaymentTokenCreateRequest, options) { return localVarFp.createPaymentToken(paymentInitiationPaymentTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `credit/asset_report/freddie_mac/get` endpoint retrieves the Asset Report in Freddie Mac\'s JSON format. * @summary Retrieve an Asset Report with Freddie Mac format. Only Freddie Mac can use this endpoint. * @param {{ [key: string]: object; }} requestBody * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditAssetReportFreddieMacGet(requestBody, options) { return localVarFp.creditAssetReportFreddieMacGet(requestBody, options).then((request) => request(axios, basePath)); }, /** * Plaid can create an Audit Copy token of an Asset Report and/or Income Report to share with participating Government Sponsored Entity (GSE). If you participate in the Day 1 Certainty™ program, Plaid can supply an Audit Copy token directly to Fannie Mae on your behalf. An Audit Copy token contains the same underlying data as the Asset Report and/or Income Report (result of /credit/payroll_income/get). Use the `/credit/audit_copy_token/create` endpoint to create an `audit_copy_token` and then pass that token to the GSE who needs access. * @summary Create Asset or Income Report Audit Copy Token * @param {CreditAuditCopyTokenCreateRequest} creditAuditCopyTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditAuditCopyTokenCreate(creditAuditCopyTokenCreateRequest, options) { return localVarFp.creditAuditCopyTokenCreate(creditAuditCopyTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/credit/audit_copy_token/update` endpoint updates an existing Audit Copy Token by adding the report tokens in the `report_tokens` field to the `audit_copy_token`. If the Audit Copy Token already contains a report of a certain type, it will be replaced with the token provided in the `report_tokens` field. * @summary Update an Audit Copy Token * @param {CreditAuditCopyTokenUpdateRequest} creditAuditCopyTokenUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditAuditCopyTokenUpdate(creditAuditCopyTokenUpdateRequest, options) { return localVarFp.creditAuditCopyTokenUpdate(creditAuditCopyTokenUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/bank_employment/get` returns the employment report(s) derived from bank transaction data for a specified user. * @summary Retrieve information from the bank accounts used for employment verification * @param {CreditBankEmploymentGetRequest} creditBankEmploymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankEmploymentGet(creditBankEmploymentGetRequest, options) { return localVarFp.creditBankEmploymentGet(creditBankEmploymentGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/bank_income/get` returns the bank income report(s) for a specified user. A single report corresponds to all institutions linked in a single Link session. To include multiple institutions in a single report, use [Multi-Item Link](https://plaid.com/docs/link/multi-item-link). To return older reports, use the `options.count` field. * @summary Retrieve information from the bank accounts used for income verification * @param {CreditBankIncomeGetRequest} creditBankIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomeGet(creditBankIncomeGetRequest, options) { return localVarFp.creditBankIncomeGet(creditBankIncomeGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/bank_income/pdf/get` returns the most recent bank income report for a specified user in PDF format. A single report corresponds to all institutions linked in a single Link session. To include multiple institutions in a single report, use [Multi-Item Link](https://plaid.com/docs/link/multi-item-link). * @summary Retrieve information from the bank accounts used for income verification in PDF format * @param {CreditBankIncomePDFGetRequest} creditBankIncomePDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomePdfGet(creditBankIncomePDFGetRequest, options) { return localVarFp.creditBankIncomePdfGet(creditBankIncomePDFGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/bank_income/refresh` refreshes the most recent bank income report data for a specific user. If the most recent bank income report is no longer valid (i.e. deleted), the endpoint will refresh the most recent valid report instead. * @summary Refresh a user\'s bank income information * @param {CreditBankIncomeRefreshRequest} creditBankIncomeRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomeRefresh(creditBankIncomeRefreshRequest, options) { return localVarFp.creditBankIncomeRefresh(creditBankIncomeRefreshRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/bank_income/webhook/update` allows you to subscribe or unsubscribe a user for income webhook notifications. By default, all users start out unsubscribed. If a user is subscribed, on significant changes to the user\'s income profile, you will receive a `BANK_INCOME_REFRESH_UPDATE` webhook, prompting you to refresh bank income data for the user. * @summary Subscribe and unsubscribe to proactive notifications for a user\'s income profile * @param {CreditBankIncomeWebhookUpdateRequest} creditBankIncomeWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankIncomeWebhookUpdate(creditBankIncomeWebhookUpdateRequest, options) { return localVarFp.creditBankIncomeWebhookUpdate(creditBankIncomeWebhookUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/bank_statements/uploads/get` returns parsed data from bank statements uploaded by users as part of the Document Income flow. If your account is not enabled for Document Parsing, contact your account manager to request access. * @summary Retrieve data for a user\'s uploaded bank statements * @param {CreditBankStatementsUploadsGetRequest} creditBankStatementsUploadsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditBankStatementsUploadsGet(creditBankStatementsUploadsGetRequest, options) { return localVarFp.creditBankStatementsUploadsGet(creditBankStatementsUploadsGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/employment/get` returns a list of items with employment information from a user\'s payroll provider that was verified by an end user. * @summary Retrieve a summary of an individual\'s employment information * @param {CreditEmploymentGetRequest} creditEmploymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditEmploymentGet(creditEmploymentGetRequest, options) { return localVarFp.creditEmploymentGet(creditEmploymentGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `credit/asset_report/freddie_mac/get` endpoint retrieves the Verification of Assets and Verification of Employment reports. * @summary Retrieve an Asset Report with Freddie Mac format (aka VOA - Verification Of Assets), and a Verification Of Employment (VOE) report if this one is available. Only Freddie Mac can use this endpoint. * @param {CreditFreddieMacReportsGetRequest} creditFreddieMacReportsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditFreddieMacReportsGet(creditFreddieMacReportsGetRequest, options) { return localVarFp.creditFreddieMacReportsGet(creditFreddieMacReportsGetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint gets payroll income information for a specific user, either as a result of the user connecting to their payroll provider or uploading a pay related document. * @summary Retrieve a user\'s payroll information * @param {CreditPayrollIncomeGetRequest} creditPayrollIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeGet(creditPayrollIncomeGetRequest, options) { return localVarFp.creditPayrollIncomeGet(creditPayrollIncomeGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/payroll_income/parsing_config/update` updates the parsing configuration for a document income verification. * @summary Update the parsing configuration for a document income verification * @param {{ [key: string]: object; }} requestBody * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeParsingConfigUpdate(requestBody, options) { return localVarFp.creditPayrollIncomeParsingConfigUpdate(requestBody, options).then((request) => request(axios, basePath)); }, /** * `/credit/payroll_income/precheck` is an optional endpoint that can be called before initializing a Link session for income verification. It evaluates whether a given user is supportable by digital income verification. If the user is eligible for digital verification, that information will be associated with the user token, and in this way will generate a Link UI optimized for the end user and their specific employer. If the user cannot be confirmed as eligible, the user can still use the income verification flow, but they may be required to manually upload a paystub to verify their income. While all request fields are optional, providing `employer` data will increase the chance of receiving a useful result. When testing in Sandbox, you can control the results by providing special test values in the `employer` and `access_tokens` fields. `employer_good` and `employer_bad` will result in `HIGH` and `LOW` confidence values, respectively. `employer_multi` will result in a `HIGH` confidence with multiple payroll options. Likewise, `access_good` and `access_bad` will result in `HIGH` and `LOW` confidence values, respectively. Any other value for `employer` and `access_tokens` in Sandbox will result in `UNKNOWN` confidence. * @summary Check income verification eligibility and optimize conversion * @param {CreditPayrollIncomePrecheckRequest} creditPayrollIncomePrecheckRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomePrecheck(creditPayrollIncomePrecheckRequest, options) { return localVarFp.creditPayrollIncomePrecheck(creditPayrollIncomePrecheckRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/payroll_income/refresh` refreshes a given digital payroll income verification. * @summary Refresh a digital payroll income verification * @param {CreditPayrollIncomeRefreshRequest} creditPayrollIncomeRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeRefresh(creditPayrollIncomeRefreshRequest, options) { return localVarFp.creditPayrollIncomeRefresh(creditPayrollIncomeRefreshRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/payroll_income/risk_signals/get` can be used as part of the Document Income flow to assess a user-uploaded document for signs of potential fraud or tampering. It returns a risk score for each uploaded document that indicates the likelihood of the document being fraudulent, in addition to details on the individual risk signals contributing to the score. To trigger risk signal generation for an Item, call `/link/token/create` with `parsing_config` set to include `risk_signals`, or call `/credit/payroll_income/parsing_config/update`. Once risk signal generation has been triggered, `/credit/payroll_income/risk_signals/get` can be called at any time after the `INCOME_VERIFICATION_RISK_SIGNALS` webhook has been fired. `/credit/payroll_income/risk_signals/get` is offered as an add-on to Document Income and is billed separately. To request access to this endpoint, submit a product access request or contact your Plaid account manager. * @summary Retrieve fraud insights for a user\'s manually uploaded document(s). * @param {CreditPayrollIncomeRiskSignalsGetRequest} creditPayrollIncomeRiskSignalsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditPayrollIncomeRiskSignalsGet(creditPayrollIncomeRiskSignalsGetRequest, options) { return localVarFp.creditPayrollIncomeRiskSignalsGet(creditPayrollIncomeRiskSignalsGetRequest, options).then((request) => request(axios, basePath)); }, /** * Plaid can share an Asset Report directly with a participating third party on your behalf. The shared Asset Report is the exact same Asset Report originally created in `/asset_report/create`. To grant a third party access to an Asset Report, use the `/credit/relay/create` endpoint to create a `relay_token` and then pass that token to your third party. Each third party has its own `secondary_client_id`; for example, `ce5bd328dcd34123456`. You\'ll need to create a separate `relay_token` for each third party that needs access to the report on your behalf. * @summary Create a relay token to share an Asset Report with a partner client * @param {CreditRelayCreateRequest} creditRelayCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayCreate(creditRelayCreateRequest, options) { return localVarFp.creditRelayCreate(creditRelayCreateRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/relay/get` allows third parties to receive a report that was shared with them, using a `relay_token` that was created by the report owner. * @summary Retrieve the reports associated with a relay token that was shared with you * @param {CreditRelayGetRequest} creditRelayGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayGet(creditRelayGetRequest, options) { return localVarFp.creditRelayGet(creditRelayGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayPdfGet(creditRelayPDFGetRequest, options) { return localVarFp.creditRelayPdfGet(creditRelayPDFGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/credit/relay/refresh` endpoint allows third parties to refresh a report that was relayed to them, using a `relay_token` that was created by the report owner. A new report will be created with the original report parameters, but with the most recent data available based on the `days_requested` value of the original report. * @summary Refresh a report of a relay token * @param {CreditRelayRefreshRequest} creditRelayRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayRefresh(creditRelayRefreshRequest, options) { return localVarFp.creditRelayRefresh(creditRelayRefreshRequest, options).then((request) => request(axios, basePath)); }, /** * The `/credit/relay/remove` endpoint allows you to invalidate a `relay_token`. The third party holding the token will no longer be able to access or refresh the reports which the `relay_token` gives access to. The original report, associated Items, and other relay tokens that provide access to the same report are not affected and will remain accessible after removing the given `relay_token`. * @summary Remove relay token * @param {CreditRelayRemoveRequest} creditRelayRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditRelayRemove(creditRelayRemoveRequest, options) { return localVarFp.creditRelayRemove(creditRelayRemoveRequest, options).then((request) => request(axios, basePath)); }, /** * The `/credit/audit_copy_token/remove` endpoint allows you to remove an Audit Copy. Removing an Audit Copy invalidates the `audit_copy_token` associated with it, meaning both you and any third parties holding the token will no longer be able to use it to access Report data. Items associated with the Report data and other Audit Copies of it are not affected and will remain accessible after removing the given Audit Copy. * @summary Remove an Audit Copy token * @param {CreditAuditCopyTokenRemoveRequest} creditAuditCopyTokenRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditReportAuditCopyRemove(creditAuditCopyTokenRemoveRequest, options) { return localVarFp.creditReportAuditCopyRemove(creditAuditCopyTokenRemoveRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint can be used for your end users after they complete the Link flow. This endpoint returns a list of Link sessions that your user completed, where each session includes the results from the Link flow. These results include details about the Item that was created and some product related metadata (showing, for example, whether the user finished the bank income verification step). * @summary Retrieve Link sessions for your user * @param {CreditSessionsGetRequest} creditSessionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ creditSessionsGet(creditSessionsGetRequest, options) { return localVarFp.creditSessionsGet(creditSessionsGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/dashboard_user/get` endpoint provides details (such as email address) about a specific Dashboard user based on the `dashboard_user_id` field, which is returned in the `audit_trail` object of certain Monitor and Beacon endpoints. This can be used to identify the specific reviewer who performed a Dashboard action. * @summary Retrieve a dashboard user * @param {DashboardUserGetRequest} dashboardUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ dashboardUserGet(dashboardUserGetRequest, options) { return localVarFp.dashboardUserGet(dashboardUserGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/dashboard_user/list` endpoint provides details (such as email address) all Dashboard users associated with your account. This can use used to audit or track the list of reviewers for Monitor, Beacon, and Identity Verification products. * @summary List dashboard users * @param {DashboardUserListRequest} dashboardUserListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ dashboardUserList(dashboardUserListRequest, options) { return localVarFp.dashboardUserList(dashboardUserListRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint provides an alternative to `/deposit_switch/create` for customers who have not yet fully integrated with Plaid Exchange. Like `/deposit_switch/create`, it creates a deposit switch entity that will be persisted throughout the lifecycle of the switch. * @summary (Deprecated) Create a deposit switch without using Plaid Exchange * @param {DepositSwitchAltCreateRequest} depositSwitchAltCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchAltCreate(depositSwitchAltCreateRequest, options) { return localVarFp.depositSwitchAltCreate(depositSwitchAltCreateRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint creates a deposit switch entity that will be persisted throughout the lifecycle of the switch. * @summary (Deprecated) Create a deposit switch * @param {DepositSwitchCreateRequest} depositSwitchCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchCreate(depositSwitchCreateRequest, options) { return localVarFp.depositSwitchCreate(depositSwitchCreateRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint returns information related to how the user has configured their payroll allocation and the state of the switch. You can use this information to build logic related to the user\'s direct deposit allocation preferences. * @summary (Deprecated) Retrieve a deposit switch * @param {DepositSwitchGetRequest} depositSwitchGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchGet(depositSwitchGetRequest, options) { return localVarFp.depositSwitchGet(depositSwitchGetRequest, options).then((request) => request(axios, basePath)); }, /** * In order for the end user to take action, you will need to create a public token representing the deposit switch. This token is used to initialize Link. It can be used one time and expires after 30 minutes. * @summary (Deprecated) Create a deposit switch token * @param {DepositSwitchTokenCreateRequest} depositSwitchTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ depositSwitchTokenCreate(depositSwitchTokenCreateRequest, options) { return localVarFp.depositSwitchTokenCreate(depositSwitchTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * `/employers/search` allows you the ability to search Plaid’s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. * @summary Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ employersSearch(employersSearchRequest, options) { return localVarFp.employersSearch(employersSearchRequest, options).then((request) => request(axios, basePath)); }, /** * `/employment/verification/get` returns a list of employments through a user payroll that was verified by an end user. This endpoint has been deprecated; new integrations should use `/credit/employment/get` instead. * @summary (Deprecated) Retrieve a summary of an individual\'s employment information * @param {EmploymentVerificationGetRequest} employmentVerificationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ employmentVerificationGet(employmentVerificationGetRequest, options) { return localVarFp.employmentVerificationGet(employmentVerificationGetRequest, options).then((request) => request(axios, basePath)); }, /** * A generic webhook receiver endpoint for FDX Event Notifications * @summary Webhook receiver for fdx notifications * @param {FDXNotification} fDXNotification * @param {*} [options] Override http request option. * @throws {RequiredError} */ fdxNotifications(fDXNotification, options) { return localVarFp.fdxNotifications(fDXNotification, options).then((request) => request(axios, basePath)); }, /** * Get a specific recipient * @summary Get Recipient * @param {string} recipientId Recipient Identifier. Uniquely identifies the recipient * @param {string} [oAUTHSTATEID] The value that is passed into the OAuth URI \'state\' query parameter. * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRecipient(recipientId, oAUTHSTATEID, options) { return localVarFp.getRecipient(recipientId, oAUTHSTATEID, options).then((request) => request(axios, basePath)); }, /** * Returns a list of Recipients * @summary Get Recipients * @param {*} [options] Override http request option. * @throws {RequiredError} */ getRecipients(options) { return localVarFp.getRecipients(options).then((request) => request(axios, basePath)); }, /** * Use `/identity/documents/uploads/get` to retrieve identity details when using [Identity Document Upload](https://plaid.com/docs/identity/identity-document-upload/). * @summary Returns uploaded document identity * @param {IdentityDocumentsUploadsGetRequest} identityDocumentsUploadsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityDocumentsUploadsGet(identityDocumentsUploadsGetRequest, options) { return localVarFp.identityDocumentsUploadsGet(identityDocumentsUploadsGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/identity/get` endpoint allows you to retrieve various account holder information on file with the financial institution, including names, emails, phone numbers, and addresses. Only name data is guaranteed to be returned; other fields will be empty arrays if not provided by the institution. Note: In API versions 2018-05-22 and earlier, the `owners` object is not returned, and instead identity information is returned in the top level `identity` object. For more details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2019-05-29). * @summary Retrieve identity data * @param {IdentityGetRequest} identityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityGet(identityGetRequest, options) { return localVarFp.identityGet(identityGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. * @summary Retrieve identity match score * @param {IdentityMatchRequest} identityMatchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityMatch(identityMatchRequest, options) { return localVarFp.identityMatch(identityMatchRequest, options).then((request) => request(axios, basePath)); }, /** * `/identity/refresh` is an optional endpoint for users of the Identity product. It initiates an on-demand extraction to fetch the most up to date Identity information from the Financial Institution. This on-demand extraction takes place in addition to the periodic extractions that automatically occur for any Identity-enabled Item. If changes to Identity are discovered after calling `/identity/refresh`, Plaid will fire a webhook [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/identity/#default_update). As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/identity/refresh` is offered as an add-on to Identity and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh identity data * @param {IdentityRefreshRequest} identityRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityRefresh(identityRefreshRequest, options) { return localVarFp.identityRefresh(identityRefreshRequest, options).then((request) => request(axios, basePath)); }, /** * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. * @summary Create autofill for an Identity Verification * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options) { return localVarFp.identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationCreate(identityVerificationCreateRequest, options) { return localVarFp.identityVerificationCreate(identityVerificationCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationGet(identityVerificationGetRequest, options) { return localVarFp.identityVerificationGet(identityVerificationGetRequest, options).then((request) => request(axios, basePath)); }, /** * Filter and list Identity Verifications created by your account * @summary List Identity Verifications * @param {IdentityVerificationListRequest} identityVerificationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationList(identityVerificationListRequest, options) { return localVarFp.identityVerificationList(identityVerificationListRequest, options).then((request) => request(axios, basePath)); }, /** * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ identityVerificationRetry(identityVerificationRetryRequest, options) { return localVarFp.identityVerificationRetry(identityVerificationRetryRequest, options).then((request) => request(axios, basePath)); }, /** * `/income/verification/create` begins the income verification process by returning an `income_verification_id`. You can then provide the `income_verification_id` to `/link/token/create` under the `income_verification` parameter in order to create a Link instance that will prompt the user to go through the income verification flow. Plaid will fire an `INCOME` webhook once the user completes the Payroll Income flow, or when the uploaded documents in the Document Income flow have finished processing. * @summary (Deprecated) Create an income verification instance * @param {IncomeVerificationCreateRequest} incomeVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationCreate(incomeVerificationCreateRequest, options) { return localVarFp.incomeVerificationCreate(incomeVerificationCreateRequest, options).then((request) => request(axios, basePath)); }, /** * `/income/verification/documents/download` provides the ability to download the source documents associated with the verification. If Document Income was used, the documents will be those the user provided in Link. For Payroll Income, the most recent files available for download from the payroll provider will be available from this endpoint. The response to `/income/verification/documents/download` is a ZIP file in binary data. If a `document_id` is passed, a single document will be contained in this file. If not, the response will contain all documents associated with the verification. The `request_id` is returned in the `Plaid-Request-ID` header. * @summary (Deprecated) Download the original documents used for income verification * @param {IncomeVerificationDocumentsDownloadRequest} incomeVerificationDocumentsDownloadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationDocumentsDownload(incomeVerificationDocumentsDownloadRequest, options) { return localVarFp.incomeVerificationDocumentsDownload(incomeVerificationDocumentsDownloadRequest, options).then((request) => request(axios, basePath)); }, /** * `/income/verification/paystubs/get` returns the information collected from the paystubs that were used to verify an end user\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/get` instead. * @summary (Deprecated) Retrieve information from the paystubs used for income verification * @param {IncomeVerificationPaystubsGetRequest} incomeVerificationPaystubsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options) { return localVarFp.incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/income/verification/precheck` is an optional endpoint that can be called before initializing a Link session for income verification. It evaluates whether a given user is supportable by digital income verification and returns a `precheck_id` that can be provided to `/link/token/create`. If the user is eligible for digital verification, providing the `precheck_id` in this way will generate a Link UI optimized for the end user and their specific employer. If the user cannot be confirmed as eligible, the `precheck_id` can still be provided to `/link/token/create` and the user can still use the income verification flow, but they may be required to manually upload a paystub to verify their income. While all request fields are optional, providing either `employer` or `transactions_access_tokens` data will increase the chance of receiving a useful result. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/precheck` instead. * @summary (Deprecated) Check digital income verification eligibility and optimize conversion * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options) { return localVarFp.incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options).then((request) => request(axios, basePath)); }, /** * `/income/verification/taxforms/get` returns the information collected from forms that were used to verify an end user\'\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/get` instead. * @summary (Deprecated) Retrieve information from the tax documents used for income verification * @param {IncomeVerificationTaxformsGetRequest} incomeVerificationTaxformsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ incomeVerificationTaxformsGet(incomeVerificationTaxformsGetRequest, options) { return localVarFp.incomeVerificationTaxformsGet(incomeVerificationTaxformsGetRequest, options).then((request) => request(axios, basePath)); }, /** * Returns a JSON response containing details on all financial institutions currently supported by Plaid. Because Plaid supports thousands of institutions, results are paginated. If there is no overlap between an institution’s enabled products and a client’s enabled products, then the institution will be filtered out from the response. As a result, the number of institutions returned may not match the count specified in the call. * @summary Get details of all supported institutions * @param {InstitutionsGetRequest} institutionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ institutionsGet(institutionsGetRequest, options) { return localVarFp.institutionsGet(institutionsGetRequest, options).then((request) => request(axios, basePath)); }, /** * Returns a JSON response containing details on a specified financial institution currently supported by Plaid. Versioning note: API versions 2019-05-29 and earlier allow use of the `public_key` parameter instead of the `client_id` and `secret` to authenticate to this endpoint. The `public_key` has been deprecated; all customers are encouraged to use `client_id` and `secret` instead. * @summary Get details of an institution * @param {InstitutionsGetByIdRequest} institutionsGetByIdRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ institutionsGetById(institutionsGetByIdRequest, options) { return localVarFp.institutionsGetById(institutionsGetByIdRequest, options).then((request) => request(axios, basePath)); }, /** * Returns a JSON response containing details for institutions that match the query parameters, up to a maximum of ten institutions per query. Versioning note: API versions 2019-05-29 and earlier allow use of the `public_key` parameter instead of the `client_id` and `secret` parameters to authenticate to this endpoint. The `public_key` parameter has since been deprecated; all customers are encouraged to use `client_id` and `secret` instead. * @summary Search institutions * @param {InstitutionsSearchRequest} institutionsSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ institutionsSearch(institutionsSearchRequest, options) { return localVarFp.institutionsSearch(institutionsSearchRequest, options).then((request) => request(axios, basePath)); }, /** * The `/investments/auth/get` endpoint allows developers to receive user-authorized data to facilitate the transfer of holdings * @summary Get data needed to authorize an investments transfer * @param {InvestmentsAuthGetRequest} investmentsAuthGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsAuthGet(investmentsAuthGetRequest, options) { return localVarFp.investmentsAuthGet(investmentsAuthGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/investments/holdings/get` endpoint allows developers to receive user-authorized stock position data for `investment`-type accounts. * @summary Get Investment holdings * @param {InvestmentsHoldingsGetRequest} investmentsHoldingsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsHoldingsGet(investmentsHoldingsGetRequest, options) { return localVarFp.investmentsHoldingsGet(investmentsHoldingsGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/investments/refresh` is an optional endpoint for users of the Investments product. It initiates an on-demand extraction to fetch the newest investment holdings and transactions for an Item. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Investments-enabled Item. If changes to investments are discovered after calling `/investments/refresh`, Plaid will fire webhooks: [`HOLDINGS: DEFAULT_UPDATE`](https://plaid.com/docs/api/products/investments/#holdings-default_update) if any new holdings are detected, and [`INVESTMENTS_TRANSACTIONS: DEFAULT_UPDATE`](https://plaid.com/docs/api/products/investments/#investments_transactions-default_update) if any new investment transactions are detected. This webhook will typically not fire in the Sandbox environment, due to the lack of dynamic investment transactions and holdings data. To test this webhook in Sandbox, call `/sandbox/item/fire_webhook`. Updated holdings and investment transactions can be fetched by calling `/investments/holdings/get` and `/investments/transactions/get`. Note that the `/investments/refresh` endpoint is not supported by all institutions. If called on an Item from an institution that does not support this functionality, it will return a `PRODUCT_NOT_SUPPORTED` error. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/investments/refresh` is offered as an add-on to Investments and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh investment data * @param {InvestmentsRefreshRequest} investmentsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsRefresh(investmentsRefreshRequest, options) { return localVarFp.investmentsRefresh(investmentsRefreshRequest, options).then((request) => request(axios, basePath)); }, /** * The `/investments/transactions/get` endpoint allows developers to retrieve up to 24 months of user-authorized transaction data for investment accounts. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Due to the potentially large number of investment transactions associated with an Item, results are paginated. Manipulate the count and offset parameters in conjunction with the `total_investment_transactions` response body field to fetch all available investment transactions. Note that Investments does not have a webhook to indicate when initial transaction data has loaded (unless you use the `async_update` option). Instead, if transactions data is not ready when `/investments/transactions/get` is first called, Plaid will wait for the data. For this reason, calling `/investments/transactions/get` immediately after Link may take up to one to two minutes to return. Data returned by the asynchronous investments extraction flow (when `async_update` is set to true) may not be immediately available to `/investments/transactions/get`. To be alerted when the data is ready to be fetched, listen for the `HISTORICAL_UPDATE` webhook. If no investments history is ready when `/investments/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get investment transactions * @param {InvestmentsTransactionsGetRequest} investmentsTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ investmentsTransactionsGet(investmentsTransactionsGetRequest, options) { return localVarFp.investmentsTransactionsGet(investmentsTransactionsGetRequest, options).then((request) => request(axios, basePath)); }, /** * Retrieve detailed information about a specific `Issue`. This endpoint returns a single `Issue` object. * @summary Get an Issue * @param {IssuesGetRequest} issuesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ issuesGet(issuesGetRequest, options) { return localVarFp.issuesGet(issuesGetRequest, options).then((request) => request(axios, basePath)); }, /** * Search for an issue associated with one of the following identifiers: `item_id`, `link_session_id` or Link session `request_id`. This endpoint returns a list of `Issue` objects, with an empty list indicating that no issues are associated with the provided identifier. At least one of the identifiers must be provided to perform the search. * @summary Search for an Issue * @param {IssuesSearchRequest} issuesSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ issuesSearch(issuesSearchRequest, options) { return localVarFp.issuesSearch(issuesSearchRequest, options).then((request) => request(axios, basePath)); }, /** * Allows a user to subscribe to updates on a specific `Issue` using a POST method. Subscribers will receive webhook notifications when the issue status changes, particularly when resolved. * @summary Subscribe to an Issue * @param {IssuesSubscribeRequest} issuesSubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ issuesSubscribe(issuesSubscribeRequest, options) { return localVarFp.issuesSubscribe(issuesSubscribeRequest, options).then((request) => request(axios, basePath)); }, /** * By default, the `access_token` associated with an Item does not expire and should be stored in a persistent, secure manner. You can use the `/item/access_token/invalidate` endpoint to rotate the `access_token` associated with an Item. The endpoint returns a new `access_token` and immediately invalidates the previous `access_token`. * @summary Invalidate access_token * @param {ItemAccessTokenInvalidateRequest} itemAccessTokenInvalidateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemAccessTokenInvalidate(itemAccessTokenInvalidateRequest, options) { return localVarFp.itemAccessTokenInvalidate(itemAccessTokenInvalidateRequest, options).then((request) => request(axios, basePath)); }, /** * List a historical log of user consent events * @summary List a historical log of user consent events * @param {ItemActivityListRequest} itemActivityListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemActivityList(itemActivityListRequest, options) { return localVarFp.itemActivityList(itemActivityListRequest, options).then((request) => request(axios, basePath)); }, /** * List a user’s connected applications * @summary List a user’s connected applications * @param {ItemApplicationListRequest} itemApplicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemApplicationList(itemApplicationListRequest, options) { return localVarFp.itemApplicationList(itemApplicationListRequest, options).then((request) => request(axios, basePath)); }, /** * Enable consumers to update product access on selected accounts for an application. * @summary Update the scopes of access for a particular application * @param {ItemApplicationScopesUpdateRequest} itemApplicationScopesUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemApplicationScopesUpdate(itemApplicationScopesUpdateRequest, options) { return localVarFp.itemApplicationScopesUpdate(itemApplicationScopesUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * Unlink a user’s connected application. On an unlink request, Plaid will immediately revoke the Application’s access to the User’s data. The User will have to redo the OAuth authentication process in order to restore functionality. This endpoint only removes ongoing data access permissions, therefore the User will need to reach out to the Application itself in order to disable and delete their account and delete any data that the Application already received (if the Application does not do so by default). This endpoint should be called in real time as the User is unlinking an Application, and should not be batched in order to ensure that the change is reflected as soon as possible. * @summary Unlink a user’s connected application * @param {ItemApplicationUnlinkRequest} itemApplicationUnlinkRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemApplicationUnlink(itemApplicationUnlinkRequest, options) { return localVarFp.itemApplicationUnlink(itemApplicationUnlinkRequest, options).then((request) => request(axios, basePath)); }, /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. * @summary Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemCreatePublicToken(itemPublicTokenCreateRequest, options) { return localVarFp.itemCreatePublicToken(itemPublicTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Returns information about the status of an Item. * @summary Retrieve an Item * @param {ItemGetRequest} itemGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemGet(itemGetRequest, options) { return localVarFp.itemGet(itemGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/item/import` creates an Item via your Plaid Exchange Integration and returns an `access_token`. As part of an `/item/import` request, you will include a User ID (`user_auth.user_id`) and Authentication Token (`user_auth.auth_token`) that enable data aggregation through your Plaid Exchange API endpoints. These authentication principals are to be chosen by you. Upon creating an Item via `/item/import`, Plaid will automatically begin an extraction of that Item through the Plaid Exchange infrastructure you have already integrated. * @summary Import Item * @param {ItemImportRequest} itemImportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemImport(itemImportRequest, options) { return localVarFp.itemImport(itemImportRequest, options).then((request) => request(axios, basePath)); }, /** * Exchange a Link `public_token` for an API `access_token`. Link hands off the `public_token` client-side via the `onSuccess` callback once a user has successfully created an Item. The `public_token` is ephemeral and expires after 30 minutes. An `access_token` does not expire, but can be revoked by calling `/item/remove`. The response also includes an `item_id` that should be stored with the `access_token`. The `item_id` is used to identify an Item in a webhook. The `item_id` can also be retrieved by making an `/item/get` request. * @summary Exchange public token for an access token * @param {ItemPublicTokenExchangeRequest} itemPublicTokenExchangeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemPublicTokenExchange(itemPublicTokenExchangeRequest, options) { return localVarFp.itemPublicTokenExchange(itemPublicTokenExchangeRequest, options).then((request) => request(axios, basePath)); }, /** * The `/item/remove` endpoint allows you to remove an Item. Once removed, the `access_token`, as well as any processor tokens or bank account tokens associated with the Item, is no longer valid and cannot be used to access any data that was associated with the Item. Calling `/item/remove` is a recommended best practice when offboarding users or if a user chooses to disconnect an account linked via Plaid. For subscription products, such as Transactions, Liabilities, and Investments, calling `/item/remove` is required to end subscription billing for the Item. For money movement products such as Auth and Transfer, if the Item is at an institution that uses Tokenized Account Numbers (TANs), such as Chase or PNC, calling `/item/remove` will invalidate the TAN, and subsequent ACH transfer attempts using that TAN will be returned. In Limited Production, calling `/item/remove` does not impact the number of remaining Limited Production Items you have available. Removing an Item does not affect any Asset Reports or Audit Copies you have already created, which will remain accessible until you remove access to them specifically using the `/asset_report/remove` endpoint. Also note that for certain OAuth-based institutions, an Item removed via `/item/remove` may still show as an active connection in the institution\'s OAuth permission manager. API versions 2019-05-29 and earlier return a `removed` boolean as part of the response. * @summary Remove an Item * @param {ItemRemoveRequest} itemRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemRemove(itemRemoveRequest, options) { return localVarFp.itemRemove(itemRemoveRequest, options).then((request) => request(axios, basePath)); }, /** * The POST `/item/webhook/update` allows you to update the webhook URL associated with an Item. This request triggers a [`WEBHOOK_UPDATE_ACKNOWLEDGED`](https://plaid.com/docs/api/items/#webhook_update_acknowledged) webhook to the newly specified webhook URL. * @summary Update Webhook URL * @param {ItemWebhookUpdateRequest} itemWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ itemWebhookUpdate(itemWebhookUpdateRequest, options) { return localVarFp.itemWebhookUpdate(itemWebhookUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/liabilities/get` endpoint returns various details about an Item with loan or credit accounts. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. To limit accounts listed in Link to types and subtypes supported by Liabilities, you can use the `account_filters` parameter when [creating a Link token](https://plaid.com/docs/api/link/#linktokencreate). The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/liabilities/get`. * @summary Retrieve Liabilities data * @param {LiabilitiesGetRequest} liabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ liabilitiesGet(liabilitiesGetRequest, options) { return localVarFp.liabilitiesGet(liabilitiesGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/link_delivery/create` endpoint to create a Hosted Link session. * @summary Create Hosted Link session * @param {LinkDeliveryCreateRequest} linkDeliveryCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkDeliveryCreate(linkDeliveryCreateRequest, options) { return localVarFp.linkDeliveryCreate(linkDeliveryCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/link_delivery/get` endpoint to get the status of a Hosted Link session. * @summary Get Hosted Link session * @param {LinkDeliveryGetRequest} linkDeliveryGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkDeliveryGet(linkDeliveryGetRequest, options) { return localVarFp.linkDeliveryGet(linkDeliveryGetRequest, options).then((request) => request(axios, basePath)); }, /** * Exchange an OAuth `link_correlation_id` for the corresponding `link_token`. The `link_correlation_id` is only available for \'payment_initiation\' products and is provided to the client via the OAuth `redirect_uri` as a query parameter. The `link_correlation_id` is ephemeral and expires in a brief period, after which it can no longer be exchanged for the \'link_token\'. * @summary Exchange the Link Correlation Id for a Link Token * @param {LinkOAuthCorrelationIdExchangeRequest} linkOAuthCorrelationIdExchangeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkOauthCorrelationIdExchange(linkOAuthCorrelationIdExchangeRequest, options) { return localVarFp.linkOauthCorrelationIdExchange(linkOAuthCorrelationIdExchangeRequest, options).then((request) => request(axios, basePath)); }, /** * The `/link/token/create` endpoint creates a `link_token`, which is required as a parameter when initializing Link. Once Link has been initialized, it returns a `public_token`. For most Plaid products, the `public_token` is saved and exchanged for an `access_token` via `/item/public_token/exchange` as part of the main Link flow. For more details, see the [Link flow overview](https://plaid.com/docs/link/#link-flow-overview). A `link_token` generated by `/link/token/create` is also used to initialize other Link flows, such as the [update mode](https://plaid.com/docs/link/update-mode) flow for tokens with expired credentials, or the Identity Verification flow. * @summary Create Link Token * @param {LinkTokenCreateRequest} linkTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkTokenCreate(linkTokenCreateRequest, options) { return localVarFp.linkTokenCreate(linkTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/link/token/get` endpoint gets information about a Link session, including all callbacks fired during the session along with their metadata, including the public token. This endpoint is used with Link flows that don\'t provide a public token via frontend callbacks, such as the [Hosted Link flow](https://plaid.com/docs/link/hosted-link/) and the [Multi-Item Link flow](https://plaid.com/docs/link/multi-item-link/). It also can be useful for debugging purposes. * @summary Get Link Token * @param {LinkTokenGetRequest} linkTokenGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ linkTokenGet(linkTokenGetRequest, options) { return localVarFp.linkTokenGet(linkTokenGetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint allows you to retrieve the Network Insights from a list of `access_tokens`. * @summary Retrieve network insights for the provided `access_tokens` * @param {NetworkInsightsReportGetRequest} networkInsightsReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ networkInsightsReportGet(networkInsightsReportGetRequest, options) { return localVarFp.networkInsightsReportGet(networkInsightsReportGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/network/status/get` endpoint can be used to check whether Plaid has a matching profile for the user. This is useful for determining if a user is eligible for a streamlined experience, such as Layer. Note: it is strongly recommended to check for Layer eligibility in the frontend. `/network/status/get` should only be used for checking Layer eligibility if a frontend check is not possible for your use case. For instructions on performing a frontend eligibility check, see the [Layer documentation](https://plaid.com/docs/layer/#integration-overview). * @summary Check a user\'s Plaid Network status * @param {NetworkStatusGetRequest} networkStatusGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ networkStatusGet(networkStatusGetRequest, options) { return localVarFp.networkStatusGet(networkStatusGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/partner/customer/create` endpoint is used by reseller partners to create end customers. To create end customers, it should be called in the Production environment only, even when creating Sandbox API keys. If called in the Sandbox environment, it will return a sample response, but no customer will be created and the API keys will not be valid. * @summary Creates a new end customer for a Plaid reseller. * @param {PartnerCustomerCreateRequest} partnerCustomerCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerCreate(partnerCustomerCreateRequest, options) { return localVarFp.partnerCustomerCreate(partnerCustomerCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/partner/customer/enable` endpoint is used by reseller partners to enable an end customer in the full Production environment. * @summary Enables a Plaid reseller\'s end customer in the Production environment. * @param {PartnerCustomerEnableRequest} partnerCustomerEnableRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerEnable(partnerCustomerEnableRequest, options) { return localVarFp.partnerCustomerEnable(partnerCustomerEnableRequest, options).then((request) => request(axios, basePath)); }, /** * The `/partner/customer/get` endpoint is used by reseller partners to retrieve data about a single end customer. * @summary Returns a Plaid reseller\'s end customer. * @param {PartnerCustomerGetRequest} partnerCustomerGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerGet(partnerCustomerGetRequest, options) { return localVarFp.partnerCustomerGet(partnerCustomerGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/partner/customer/oauth_institutions/get` endpoint is used by reseller partners to retrieve OAuth-institution registration information about a single end customer. To learn how to set up a webhook to listen to status update events, visit the [reseller documentation](https://plaid.com/docs/account/resellers/#enabling-end-customers). * @summary Returns OAuth-institution registration information for a given end customer. * @param {PartnerCustomerOAuthInstitutionsGetRequest} partnerCustomerOAuthInstitutionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerOauthInstitutionsGet(partnerCustomerOAuthInstitutionsGetRequest, options) { return localVarFp.partnerCustomerOauthInstitutionsGet(partnerCustomerOAuthInstitutionsGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/partner/customer/remove` endpoint is used by reseller partners to remove an end customer. Removing an end customer will remove it from view in the Plaid Dashboard and deactivate its API keys. This endpoint can only be used to remove an end customer that has not yet been enabled in full Production. * @summary Removes a Plaid reseller\'s end customer. * @param {PartnerCustomerRemoveRequest} partnerCustomerRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ partnerCustomerRemove(partnerCustomerRemoveRequest, options) { return localVarFp.partnerCustomerRemove(partnerCustomerRemoveRequest, options).then((request) => request(axios, basePath)); }, /** * The `/payment_initiation/consent/create` endpoint is used to create a payment consent, which can be used to initiate payments on behalf of the user. Payment consents are created with `UNAUTHORISED` status by default and must be authorised by the user before payments can be initiated. Consents can be limited in time and scope, and have constraints that describe limitations for payments. * @summary Create payment consent * @param {PaymentInitiationConsentCreateRequest} paymentInitiationConsentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentCreate(paymentInitiationConsentCreateRequest, options) { return localVarFp.paymentInitiationConsentCreate(paymentInitiationConsentCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/payment_initiation/consent/get` endpoint can be used to check the status of a payment consent, as well as to receive basic information such as recipient and constraints. * @summary Get payment consent * @param {PaymentInitiationConsentGetRequest} paymentInitiationConsentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentGet(paymentInitiationConsentGetRequest, options) { return localVarFp.paymentInitiationConsentGet(paymentInitiationConsentGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/payment_initiation/consent/payment/execute` endpoint can be used to execute payments using payment consent. * @summary Execute a single payment using consent * @param {PaymentInitiationConsentPaymentExecuteRequest} paymentInitiationConsentPaymentExecuteRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentPaymentExecute(paymentInitiationConsentPaymentExecuteRequest, options) { return localVarFp.paymentInitiationConsentPaymentExecute(paymentInitiationConsentPaymentExecuteRequest, options).then((request) => request(axios, basePath)); }, /** * The `/payment_initiation/consent/revoke` endpoint can be used to revoke the payment consent. Once the consent is revoked, it is not possible to initiate payments using it. * @summary Revoke payment consent * @param {PaymentInitiationConsentRevokeRequest} paymentInitiationConsentRevokeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest, options) { return localVarFp.paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest, options).then((request) => request(axios, basePath)); }, /** * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with BACS numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient’s account, although at least 90% of standing order payments are sent by 6am. In Limited Production, payments must be below 5 GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency), and standing orders, variable recurring payments, and Virtual Accounts are not supported. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest, options) { return localVarFp.paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentGet(paymentInitiationPaymentGetRequest, options) { return localVarFp.paymentInitiationPaymentGet(paymentInitiationPaymentGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/payment_initiation/payment/list` endpoint can be used to retrieve all created payments. By default, the 10 most recent payments are returned. You can request more payments and paginate through the results using the optional `count` and `cursor` parameters. * @summary List payments * @param {PaymentInitiationPaymentListRequest} paymentInitiationPaymentListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options) { return localVarFp.paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options).then((request) => request(axios, basePath)); }, /** * Reverse a settled payment from a Plaid virtual account. The original payment must be in a settled state to be refunded. To refund partially, specify the amount as part of the request. If the amount is not specified, the refund amount will be equal to all of the remaining payment amount that has not been refunded yet. The refund will go back to the source account that initiated the payment. The original payment must have been initiated to a Plaid virtual account so that this account can be used to initiate the refund. Providing counterparty information such as date of birth and address increases the likelihood of refund being successful without human intervention. * @summary Reverse an existing payment * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options) { return localVarFp.paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options).then((request) => request(axios, basePath)); }, /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA) or a non-Eurozone country [supported](https://plaid.com/global) by Plaid. For a standing order (recurring) payment, the recipient must be in the UK. It is recommended to use `bacs` in the UK and `iban` in EU. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient * @param {PaymentInitiationRecipientCreateRequest} paymentInitiationRecipientCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationRecipientCreate(paymentInitiationRecipientCreateRequest, options) { return localVarFp.paymentInitiationRecipientCreate(paymentInitiationRecipientCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Get details about a payment recipient you have previously created. * @summary Get payment recipient * @param {PaymentInitiationRecipientGetRequest} paymentInitiationRecipientGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest, options) { return localVarFp.paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentInitiationRecipientList(paymentInitiationRecipientListRequest, options) { return localVarFp.paymentInitiationRecipientList(paymentInitiationRecipientListRequest, options).then((request) => request(axios, basePath)); }, /** * Use `/payment_profile/create` endpoint to create a new payment profile. To initiate the account linking experience, call `/link/token/create` and provide the `payment_profile_token` in the `transfer.payment_profile_token` field. You can then use the `payment_profile_token` when creating transfers using `/transfer/authorization/create` and `/transfer/create`. * @summary Create payment profile * @param {PaymentProfileCreateRequest} paymentProfileCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentProfileCreate(paymentProfileCreateRequest, options) { return localVarFp.paymentProfileCreate(paymentProfileCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Use `/payment_profile/get` endpoint to get the status of a given Payment Profile. * @summary Get payment profile * @param {PaymentProfileGetRequest} paymentProfileGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentProfileGet(paymentProfileGetRequest, options) { return localVarFp.paymentProfileGet(paymentProfileGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/payment_profile/remove` endpoint to remove a given Payment Profile. Once it’s removed, it can no longer be used to create transfers. * @summary Remove payment profile * @param {PaymentProfileRemoveRequest} paymentProfileRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ paymentProfileRemove(paymentProfileRemoveRequest, options) { return localVarFp.paymentProfileRemove(paymentProfileRemoveRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint returns the account associated with a given processor token. This endpoint retrieves cached information, rather than extracting fresh information from the institution. As a result, the account balance returned may not be up-to-date; for realtime balance information, use `/processor/balance/get` instead. Note that some information is nullable. * @summary Retrieve the account associated with a processor token * @param {ProcessorAccountGetRequest} processorAccountGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorAccountGet(processorAccountGetRequest, options) { return localVarFp.processorAccountGet(processorAccountGetRequest, options).then((request) => request(axios, basePath)); }, /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. * @summary Create Apex bank account token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorApexProcessorTokenCreate(processorApexProcessorTokenCreateRequest, options) { return localVarFp.processorApexProcessorTokenCreate(processorApexProcessorTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/processor/auth/get` endpoint returns the bank account and bank identification number (such as the routing number, for US accounts), for a checking, savings, or cash management account that\'\'s associated with a given `processor_token`. The endpoint also returns high-level account data and balances when available. Versioning note: API versions 2019-05-29 and earlier use a different schema for the `numbers` object returned by this endpoint. For details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2020-09-14). * @summary Retrieve Auth data * @param {ProcessorAuthGetRequest} processorAuthGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorAuthGet(processorAuthGetRequest, options) { return localVarFp.processorAuthGet(processorAuthGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/processor/balance/get` endpoint returns the real-time balance for each of an Item\'s accounts. While other endpoints may return a balance object, only `/processor/balance/get` forces the available and current balance fields to be refreshed rather than cached. * @summary Retrieve Balance data * @param {ProcessorBalanceGetRequest} processorBalanceGetRequest The `/processor/balance/get` endpoint returns the real-time balance for the account associated with a given `processor_token`. The current balance is the total amount of funds in the account. The available balance is the current balance less any outstanding holds or debits that have not yet posted to the account. Note that not all institutions calculate the available balance. In the event that available balance is unavailable from the institution, Plaid will return an available balance value of `null`. * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorBalanceGet(processorBalanceGetRequest, options) { return localVarFp.processorBalanceGet(processorBalanceGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor * @summary Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorBankTransferCreate(processorBankTransferCreateRequest, options) { return localVarFp.processorBankTransferCreate(processorBankTransferCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/processor/identity/get` endpoint allows you to retrieve various account holder information on file with the financial institution, including names, emails, phone numbers, and addresses. * @summary Retrieve Identity data * @param {ProcessorIdentityGetRequest} processorIdentityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorIdentityGet(processorIdentityGetRequest, options) { return localVarFp.processorIdentityGet(processorIdentityGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorIdentityMatch(processorIdentityMatchRequest, options) { return localVarFp.processorIdentityMatch(processorIdentityMatchRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint returns the stock position data of the account associated with a given processor token. * @summary Retrieve Investment Holdings * @param {ProcessorInvestmentsHoldingsGetRequest} processorInvestmentsHoldingsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorInvestmentsHoldingsGet(processorInvestmentsHoldingsGetRequest, options) { return localVarFp.processorInvestmentsHoldingsGet(processorInvestmentsHoldingsGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/processor/investments/transactions/get` endpoint allows developers to retrieve up to 24 months of user-authorized transaction data for the investment account associated with the processor token. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Due to the potentially large number of investment transactions associated with the account, results are paginated. Manipulate the count and offset parameters in conjunction with the `total_investment_transactions` response body field to fetch all available investment transactions. Note that Investments does not have a webhook to indicate when initial transaction data has loaded (unless you use the `async_update` option). Instead, if transactions data is not ready when `/processor/investments/transactions/get` is first called, Plaid will wait for the data. For this reason, calling `/processor/investments/transactions/get` immediately after Link may take up to one to two minutes to return. Data returned by the asynchronous investments extraction flow (when `async_update` is set to true) may not be immediately available to `/processor/investments/transactions/get`. To be alerted when the data is ready to be fetched, listen for the `HISTORICAL_UPDATE` webhook. If no investments history is ready when `/processor/investments/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Investments Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get investment transactions data * @param {ProcessorInvestmentsTransactionsGetRequest} processorInvestmentsTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorInvestmentsTransactionsGet(processorInvestmentsTransactionsGetRequest, options) { return localVarFp.processorInvestmentsTransactionsGet(processorInvestmentsTransactionsGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. * @summary Retrieve Liabilities data * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorLiabilitiesGet(processorLiabilitiesGetRequest, options) { return localVarFp.processorLiabilitiesGet(processorLiabilitiesGetRequest, options).then((request) => request(axios, basePath)); }, /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. If you are using the [Plaid Transfer product](https://www.plaid.com/docs/transfer) to create transfers, it is not necessary to use this endpoint, as Plaid already knows whether the transfer was initiated. * @summary Report whether you initiated an ACH transaction * @param {ProcessorSignalDecisionReportRequest} processorSignalDecisionReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalDecisionReport(processorSignalDecisionReportRequest, options) { return localVarFp.processorSignalDecisionReport(processorSignalDecisionReportRequest, options).then((request) => request(axios, basePath)); }, /** * Use `/processor/signal/evaluate` to evaluate a planned ACH transaction as a processor to get a return risk assessment (such as a risk score and risk tier) and additional risk signals. In order to obtain a valid score for an ACH transaction, Plaid must have an access token for the account, and the Item must be healthy (receiving product updates) or have recently been in a healthy state. If the transaction does not meet eligibility requirements, an error will be returned corresponding to the underlying cause. If `/processor/signal/evaluate` is called on the same transaction multiple times within a 24-hour period, cached results may be returned. For more information please refer to our error documentation on [item errors](/docs/errors/item/) and [Link in Update Mode](/docs/link/update-mode/). Note: This request may take some time to complete if Signal is being added to an existing Item. This is because Plaid must communicate directly with the institution when retrieving the data for the first time. To reduce this latency, you can call `/signal/prepare` on the Item before you need to request Signal data. * @summary Evaluate a planned ACH transaction * @param {ProcessorSignalEvaluateRequest} processorSignalEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalEvaluate(processorSignalEvaluateRequest, options) { return localVarFp.processorSignalEvaluate(processorSignalEvaluateRequest, options).then((request) => request(axios, basePath)); }, /** * When a processor token is not initialized with Signal, call `/processor/signal/prepare` to opt-in that processor token to the Signal data collection process, which will improve the accuracy of the Signal score. If this endpoint is called with a processor token that is already initialized with Signal, it will return a 200 response and will not modify the processor token. * @summary Opt-in a processor token to Signal * @param {ProcessorSignalPrepareRequest} processorSignalPrepareRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalPrepare(processorSignalPrepareRequest, options) { return localVarFp.processorSignalPrepare(processorSignalPrepareRequest, options).then((request) => request(axios, basePath)); }, /** * Call the `/processor/signal/return/report` endpoint to report a returned transaction that was previously sent to the `/processor/signal/evaluate` endpoint. Your feedback will be used by the model to incorporate the latest risk trend in your portfolio. If you are using the [Plaid Transfer product](https://www.plaid.com/docs/transfer) to create transfers, it is not necessary to use this endpoint, as Plaid already knows whether the transfer was returned. * @summary Report a return for an ACH transaction * @param {ProcessorSignalReturnReportRequest} processorSignalReturnReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorSignalReturnReport(processorSignalReturnReportRequest, options) { return localVarFp.processorSignalReturnReport(processorSignalReturnReportRequest, options).then((request) => request(axios, basePath)); }, /** * Used to create a token suitable for sending to Stripe to enable Plaid-Stripe integrations. For a detailed guide on integrating Stripe, see [Add Stripe to your app](https://plaid.com/docs/auth/partnerships/stripe/). Note that the Stripe bank account token is a one-time use token. To store bank account information for later use, you can use a Stripe customer object and create an associated bank account from the token, or you can use a Stripe Custom account and create an associated external bank account from the token. This bank account information should work indefinitely, unless the user\'s bank account information changes or they revoke Plaid\'s permissions to access their account. Stripe bank account information cannot be modified once the bank account token has been created. If you ever need to change the bank account details used by Stripe for a specific customer, have the user go through Link again and create a new bank account token from the new `access_token`. To revoke a bank account token, the entire underlying access token must be revoked using `/item/remove`. * @summary Create Stripe bank account token * @param {ProcessorStripeBankAccountTokenCreateRequest} processorStripeBankAccountTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorStripeBankAccountTokenCreate(processorStripeBankAccountTokenCreateRequest, options) { return localVarFp.processorStripeBankAccountTokenCreate(processorStripeBankAccountTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Used to create a token suitable for sending to one of Plaid\'s partners to enable integrations. Note that Stripe partnerships use bank account tokens instead; see `/processor/stripe/bank_account_token/create` for creating tokens for use with Stripe integrations. If using multiple processors, multiple different processor tokens can be created for a single access token. Once created, a processor token for a given Item cannot be modified or updated. To revoke the processor\'s access, the entire Item must be deleted by calling `/item/remove`. * @summary Create processor token * @param {ProcessorTokenCreateRequest} processorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenCreate(processorTokenCreateRequest, options) { return localVarFp.processorTokenCreate(processorTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Used to get a processor token\'s product permissions. The `products` field will be an empty list if the processor can access all available products. * @summary Get a processor token\'s product permissions * @param {ProcessorTokenPermissionsGetRequest} processorTokenPermissionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenPermissionsGet(processorTokenPermissionsGetRequest, options) { return localVarFp.processorTokenPermissionsGet(processorTokenPermissionsGetRequest, options).then((request) => request(axios, basePath)); }, /** * Used to control a processor\'s access to products on the given processor token. By default, a processor will have access to all available products on the corresponding item. To restrict access to a particular set of products, call this endpoint with the desired products. To restore access to all available products, call this endpoint with an empty list. This endpoint can be called multiple times as your needs and your processor\'s needs change. * @summary Control a processor\'s access to products * @param {ProcessorTokenPermissionsSetRequest} processorTokenPermissionsSetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenPermissionsSet(processorTokenPermissionsSetRequest, options) { return localVarFp.processorTokenPermissionsSet(processorTokenPermissionsSetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint allows you, the processor, to update the webhook URL associated with a processor token. This request triggers a `WEBHOOK_UPDATE_ACKNOWLEDGED` webhook to the newly specified webhook URL. * @summary Update a processor token\'s webhook URL * @param {ProcessorTokenWebhookUpdateRequest} processorTokenWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest, options) { return localVarFp.processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsGet(processorTransactionsGetRequest, options) { return localVarFp.processorTransactionsGet(processorTransactionsGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user’s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest, options) { return localVarFp.processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsRefresh(processorTransactionsRefreshRequest, options) { return localVarFp.processorTransactionsRefresh(processorTransactionsRefreshRequest, options).then((request) => request(axios, basePath)); }, /** * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ processorTransactionsSync(processorTransactionsSyncRequest, options) { return localVarFp.processorTransactionsSync(processorTransactionsSyncRequest, options).then((request) => request(axios, basePath)); }, /** * The `/profile/network_status/get` endpoint can be used to check whether Plaid has a matching profile for the user. * @summary Check a user\'s Plaid Network status * @param {ProfileNetworkStatusGetRequest} profileNetworkStatusGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ profileNetworkStatusGet(profileNetworkStatusGetRequest, options) { return localVarFp.profileNetworkStatusGet(profileNetworkStatusGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. * @summary Manually fire a bank income webhook in sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxBankIncomeFireWebhook(sandboxBankIncomeFireWebhookRequest, options) { return localVarFp.sandboxBankIncomeFireWebhook(sandboxBankIncomeFireWebhookRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. * @summary Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxBankTransferFireWebhook(sandboxBankTransferFireWebhookRequest, options) { return localVarFp.sandboxBankTransferFireWebhook(sandboxBankTransferFireWebhookRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxBankTransferSimulate(sandboxBankTransferSimulateRequest, options) { return localVarFp.sandboxBankTransferSimulate(sandboxBankTransferSimulateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/cra/cashflow_updates/update` endpoint to manually trigger an update for cashflow updates (Monitoring) in the Sandbox environment. * @summary Trigger an update for Cashflow Updates * @param {SandboxCraCashflowUpdatesUpdateRequest} sandboxCraCashflowUpdatesUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options) { return localVarFp.sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook * @param {SandboxIncomeFireWebhookRequest} sandboxIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxIncomeFireWebhook(sandboxIncomeFireWebhookRequest, options) { return localVarFp.sandboxIncomeFireWebhook(sandboxIncomeFireWebhookRequest, options).then((request) => request(axios, basePath)); }, /** * The `/sandbox/item/fire_webhook` endpoint is used to test that code correctly handles webhooks. This endpoint can trigger the following webhooks: `DEFAULT_UPDATE`: Webhook to be fired for a given Sandbox Item simulating a default update event for the respective product as specified with the `webhook_type` in the request body. Valid Sandbox `DEFAULT_UPDATE` webhook types include: `AUTH`, `IDENTITY`, `TRANSACTIONS`, `INVESTMENTS_TRANSACTIONS`, `LIABILITIES`, `HOLDINGS`. If the Item does not support the product, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `NEW_ACCOUNTS_AVAILABLE`: Fired to indicate that a new account is available on the Item and you can launch update mode to request access to it. `SMS_MICRODEPOSITS_VERIFICATION`: Fired when a given same day micro-deposit item is verified via SMS verification. `LOGIN_REPAIRED`: Fired when an Item recovers from the `ITEM_LOGIN_REQUIRED` without the user going through update mode in your app. `PENDING_DISCONNECT`: Fired when an Item will stop working in the near future (e.g. due to a planned bank migration) and must be sent through update mode to continue working. `RECURRING_TRANSACTIONS_UPDATE`: Recurring Transactions webhook to be fired for a given Sandbox Item. If the Item does not support Recurring Transactions, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `SYNC_UPDATES_AVAILABLE`: Transactions webhook to be fired for a given Sandbox Item. If the Item does not support Transactions, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `PRODUCT_READY`: Assets webhook to be fired when a given asset report has been successfully generated. If the Item does not support Assets, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `ERROR`: Assets webhook to be fired when asset report generation has failed. If the Item does not support Assets, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `USER_PERMISSION_REVOKED`: Indicates an end user has revoked the permission that they previously granted to access an Item. May not always fire upon revocation, as some institutions’ consent portals do not trigger this webhook. Upon receiving this webhook, it is recommended to delete any stored data from Plaid associated with the account or Item. `USER_ACCOUNT_REVOKED`: Fired when an end user has revoked access to their account on the Data Provider\'s portal. This webhook is currently sent only for Chase and PNC Items, but may be sent in the future for other financial institutions. Upon receiving this webhook, it is recommended to delete any stored data from Plaid associated with the account or Item. Note that this endpoint is provided for developer ease-of-use and is not required for testing webhooks; webhooks will also fire in Sandbox under the same conditions that they would in Production (except for webhooks of type `TRANSFER`). * @summary Fire a test webhook * @param {SandboxItemFireWebhookRequest} sandboxItemFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxItemFireWebhook(sandboxItemFireWebhookRequest, options) { return localVarFp.sandboxItemFireWebhook(sandboxItemFireWebhookRequest, options).then((request) => request(axios, basePath)); }, /** * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, You can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxItemResetLogin(sandboxItemResetLoginRequest, options) { return localVarFp.sandboxItemResetLogin(sandboxItemResetLoginRequest, options).then((request) => request(axios, basePath)); }, /** * The `/sandbox/item/set_verification_status` endpoint can be used to change the verification status of an Item in in the Sandbox in order to simulate the Automated Micro-deposit flow. For more information on testing Automated Micro-deposits in Sandbox, see [Auth full coverage testing](https://plaid.com/docs/auth/coverage/testing#). * @summary Set verification status for Sandbox account * @param {SandboxItemSetVerificationStatusRequest} sandboxItemSetVerificationStatusRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxItemSetVerificationStatus(sandboxItemSetVerificationStatusRequest, options) { return localVarFp.sandboxItemSetVerificationStatus(sandboxItemSetVerificationStatusRequest, options).then((request) => request(axios, basePath)); }, /** * Save the selected accounts when connecting to the Platypus Oauth institution * @summary Save the selected accounts when connecting to the Platypus Oauth institution * @param {SandboxOauthSelectAccountsRequest} sandboxOauthSelectAccountsRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxOauthSelectAccounts(sandboxOauthSelectAccountsRequest, options) { return localVarFp.sandboxOauthSelectAccounts(sandboxOauthSelectAccountsRequest, options).then((request) => request(axios, basePath)); }, /** * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxPaymentProfileResetLogin(sandboxPaymentProfileResetLoginRequest, options) { return localVarFp.sandboxPaymentProfileResetLogin(sandboxPaymentProfileResetLoginRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/payment/simulate` endpoint to simulate various payment events in the Sandbox environment. This endpoint will trigger the corresponding payment status webhook. * @summary Simulate a payment event in Sandbox * @param {SandboxPaymentSimulateRequest} sandboxPaymentSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxPaymentSimulate(sandboxPaymentSimulateRequest, options) { return localVarFp.sandboxPaymentSimulate(sandboxPaymentSimulateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/processor_token/create` endpoint to create a valid `processor_token` for an arbitrary institution ID and test credentials. The created `processor_token` corresponds to a new Sandbox Item. You can then use this `processor_token` with the `/processor/` API endpoints in Sandbox. You can also use `/sandbox/processor_token/create` with the [`user_custom` test username](https://plaid.com/docs/sandbox/user-custom) to generate a test account with custom data. * @summary Create a test Item and processor token * @param {SandboxProcessorTokenCreateRequest} sandboxProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxProcessorTokenCreate(sandboxProcessorTokenCreateRequest, options) { return localVarFp.sandboxProcessorTokenCreate(sandboxProcessorTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/public_token/create` endpoint to create a valid `public_token` for an arbitrary institution ID, initial products, and test credentials. The created `public_token` maps to a new Sandbox Item. You can then call `/item/public_token/exchange` to exchange the `public_token` for an `access_token` and perform all API actions. `/sandbox/public_token/create` can also be used with the [`user_custom` test username](https://plaid.com/docs/sandbox/user-custom) to generate a test account with custom data, or with Plaid\'s [pre-populated Sandbox test accounts](https://plaid.com/docs/sandbox/test-credentials/). * @summary Create a test Item * @param {SandboxPublicTokenCreateRequest} sandboxPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxPublicTokenCreate(sandboxPublicTokenCreateRequest, options) { return localVarFp.sandboxPublicTokenCreate(sandboxPublicTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/fire_webhook` endpoint to manually trigger a `TRANSFER_EVENTS_UPDATE` webhook in the Sandbox environment. * @summary Manually fire a Transfer webhook * @param {SandboxTransferFireWebhookRequest} sandboxTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferFireWebhook(sandboxTransferFireWebhookRequest, options) { return localVarFp.sandboxTransferFireWebhook(sandboxTransferFireWebhookRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/ledger/deposit/simulate` endpoint to simulate a ledger deposit event in the Sandbox environment. * @summary Simulate a ledger deposit event in Sandbox * @param {SandboxTransferLedgerDepositSimulateRequest} sandboxTransferLedgerDepositSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferLedgerDepositSimulate(sandboxTransferLedgerDepositSimulateRequest, options) { return localVarFp.sandboxTransferLedgerDepositSimulate(sandboxTransferLedgerDepositSimulateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/ledger/simulate_available` endpoint to simulate converting pending balance to available balance for all originators in the Sandbox environment. * @summary Simulate converting pending balance to available balance * @param {SandboxTransferLedgerSimulateAvailableRequest} sandboxTransferLedgerSimulateAvailableRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferLedgerSimulateAvailable(sandboxTransferLedgerSimulateAvailableRequest, options) { return localVarFp.sandboxTransferLedgerSimulateAvailable(sandboxTransferLedgerSimulateAvailableRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/ledger/withdraw/simulate` endpoint to simulate a ledger withdraw event in the Sandbox environment. * @summary Simulate a ledger withdraw event in Sandbox * @param {SandboxTransferLedgerWithdrawSimulateRequest} sandboxTransferLedgerWithdrawSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferLedgerWithdrawSimulate(sandboxTransferLedgerWithdrawSimulateRequest, options) { return localVarFp.sandboxTransferLedgerWithdrawSimulate(sandboxTransferLedgerWithdrawSimulateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/refund/simulate` endpoint to simulate a refund event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/transfer/event/sync` or `/transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a refund event in Sandbox * @param {SandboxTransferRefundSimulateRequest} sandboxTransferRefundSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest, options) { return localVarFp.sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferRepaymentSimulate(sandboxTransferRepaymentSimulateRequest, options) { return localVarFp.sandboxTransferRepaymentSimulate(sandboxTransferRepaymentSimulateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/simulate` endpoint to simulate a transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/transfer/event/sync` or `/transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a transfer event in Sandbox * @param {SandboxTransferSimulateRequest} sandboxTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferSimulate(sandboxTransferSimulateRequest, options) { return localVarFp.sandboxTransferSimulate(sandboxTransferSimulateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/sweep/simulate` endpoint to create a sweep and associated events in the Sandbox environment. Upon calling this endpoint, all transfers with a sweep status of `swept` will become `swept_settled`, all `posted` or `pending` transfers with a sweep status of `unswept` will become `swept`, and all `returned` transfers with a sweep status of `swept` will become `return_swept`. * @summary Simulate creating a sweep * @param {SandboxTransferSweepSimulateRequest} sandboxTransferSweepSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferSweepSimulate(sandboxTransferSweepSimulateRequest, options) { return localVarFp.sandboxTransferSweepSimulate(sandboxTransferSweepSimulateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/test_clock/advance` endpoint to advance a `test_clock` in the Sandbox environment. A test clock object represents an independent timeline and has a `virtual_time` field indicating the current timestamp of the timeline. A test clock can be advanced by incrementing `virtual_time`, but may never go back to a lower `virtual_time`. If a test clock is advanced, we will simulate the changes that ought to occur during the time that elapsed. For example, a client creates a weekly recurring transfer with a test clock set at t. When the client advances the test clock by setting `virtual_time` = t + 15 days, 2 new originations should be created, along with the webhook events. The advancement of the test clock from its current `virtual_time` should be limited such that there are no more than 20 originations resulting from the advance operation on each `recurring_transfer` associated with the `test_clock`. For example, if the recurring transfer associated with this test clock originates once every 4 weeks, you can advance the `virtual_time` up to 80 weeks on each API call. * @summary Advance a test clock * @param {SandboxTransferTestClockAdvanceRequest} sandboxTransferTestClockAdvanceRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockAdvance(sandboxTransferTestClockAdvanceRequest, options) { return localVarFp.sandboxTransferTestClockAdvance(sandboxTransferTestClockAdvanceRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/test_clock/create` endpoint to create a `test_clock` in the Sandbox environment. A test clock object represents an independent timeline and has a `virtual_time` field indicating the current timestamp of the timeline. Test clocks are used for testing recurring transfers in Sandbox. A test clock can be associated with up to 5 recurring transfers. * @summary Create a test clock * @param {SandboxTransferTestClockCreateRequest} sandboxTransferTestClockCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockCreate(sandboxTransferTestClockCreateRequest, options) { return localVarFp.sandboxTransferTestClockCreate(sandboxTransferTestClockCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/test_clock/get` endpoint to get a `test_clock` in the Sandbox environment. * @summary Get a test clock * @param {SandboxTransferTestClockGetRequest} sandboxTransferTestClockGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockGet(sandboxTransferTestClockGetRequest, options) { return localVarFp.sandboxTransferTestClockGet(sandboxTransferTestClockGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/sandbox/transfer/test_clock/list` endpoint to see a list of all your test clocks in the Sandbox environment, by ascending `virtual_time`. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired test clocks. * @summary List test clocks * @param {SandboxTransferTestClockListRequest} sandboxTransferTestClockListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxTransferTestClockList(sandboxTransferTestClockListRequest, options) { return localVarFp.sandboxTransferTestClockList(sandboxTransferTestClockListRequest, options).then((request) => request(axios, basePath)); }, /** * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, You can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ sandboxUserResetLogin(sandboxUserResetLoginRequest, options) { return localVarFp.sandboxUserResetLogin(sandboxUserResetLoginRequest, options).then((request) => request(axios, basePath)); }, /** * After calling `/signal/evaluate`, call `/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction * @param {SignalDecisionReportRequest} signalDecisionReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalDecisionReport(signalDecisionReportRequest, options) { return localVarFp.signalDecisionReport(signalDecisionReportRequest, options).then((request) => request(axios, basePath)); }, /** * Use `/signal/evaluate` to evaluate a planned ACH transaction to get a return risk assessment (such as a risk score and risk tier) and additional risk signals. In order to obtain a valid score for an ACH transaction, Plaid must have an access token for the account, and the Item must be healthy (receiving product updates) or have recently been in a healthy state. If the transaction does not meet eligibility requirements, an error will be returned corresponding to the underlying cause. If `/signal/evaluate` is called on the same transaction multiple times within a 24-hour period, cached results may be returned. For more information please refer to the error documentation on [Item errors](/docs/errors/item/) and [Link in Update Mode](/docs/link/update-mode/). Note: This request may take some time to complete if Signal is being added to an existing Item. This is because Plaid must communicate directly with the institution when retrieving the data for the first time. * @summary Evaluate a planned ACH transaction * @param {SignalEvaluateRequest} signalEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalEvaluate(signalEvaluateRequest, options) { return localVarFp.signalEvaluate(signalEvaluateRequest, options).then((request) => request(axios, basePath)); }, /** * When an Item is not initialized with Signal, call `/signal/prepare` to opt-in that Item to the Signal data collection process, developing a Signal score. This should be done on Items where Signal was added in the `additional_consented_products` array but not in the `products`, `optional_products`, or `required_if_supported_products` array. If `/signal/prepare` is skipped on an Item that is not initialized with Signal, the initial call to `/signal/evaluate` on that Item will be less accurate, because Signal will have access to less data for computing the Signal score. If run on an Item that is already initialized with Signal, this endpoint will return a 200 response and will not modify the Item. * @summary Opt-in an Item to Signal * @param {SignalPrepareRequest} signalPrepareRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalPrepare(signalPrepareRequest, options) { return localVarFp.signalPrepare(signalPrepareRequest, options).then((request) => request(axios, basePath)); }, /** * Call the `/signal/return/report` endpoint to report a returned transaction that was previously sent to the `/signal/evaluate` endpoint. Your feedback will be used by the model to incorporate the latest risk trend in your portfolio. * @summary Report a return for an ACH transaction * @param {SignalReturnReportRequest} signalReturnReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalReturnReport(signalReturnReportRequest, options) { return localVarFp.signalReturnReport(signalReturnReportRequest, options).then((request) => request(axios, basePath)); }, /** * Use `/signal/schedule` to schedule a planned ACH transaction. * @summary Schedule a planned ACH transaction * @param {SignalScheduleRequest} signalScheduleRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ signalSchedule(signalScheduleRequest, options) { return localVarFp.signalSchedule(signalScheduleRequest, options).then((request) => request(axios, basePath)); }, /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. * @param {StatementsDownloadRequest} statementsDownloadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ statementsDownload(statementsDownloadRequest, options) { return localVarFp.statementsDownload(statementsDownloadRequest, options).then((request) => request(axios, basePath)); }, /** * The `/statements/list` endpoint retrieves a list of all statements associated with an item. * @summary Retrieve a list of all statements associated with an item. * @param {StatementsListRequest} statementsListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ statementsList(statementsListRequest, options) { return localVarFp.statementsList(statementsListRequest, options).then((request) => request(axios, basePath)); }, /** * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. * @summary Refresh statements data. * @param {StatementsRefreshRequest} statementsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ statementsRefresh(statementsRefreshRequest, options) { return localVarFp.statementsRefresh(statementsRefreshRequest, options).then((request) => request(axios, basePath)); }, /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data * @param {TransactionsEnhanceGetRequest} transactionsEnhanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsEnhance(transactionsEnhanceGetRequest, options) { return localVarFp.transactionsEnhance(transactionsEnhanceGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transactions/enrich` endpoint enriches raw transaction data generated by your own banking products or retrieved from other non-Plaid sources. * @summary Enrich locally-held transaction data * @param {TransactionsEnrichRequest} transactionsEnrichRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsEnrich(transactionsEnrichRequest, options) { return localVarFp.transactionsEnrich(transactionsEnrichRequest, options).then((request) => request(axios, basePath)); }, /** * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsGet(transactionsGetRequest, options) { return localVarFp.transactionsGet(transactionsGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user’s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRecurringGet(transactionsRecurringGetRequest, options) { return localVarFp.transactionsRecurringGet(transactionsRecurringGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/transactions/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for an Item. The on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled Item. The Item must already have Transactions added as a product in order to call `/transactions/refresh`. If changes to transactions are discovered after calling `/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/transactions/sync` and `/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/transactions/get` or `/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/transactions/refresh` is offered as an optional add-on to Transactions and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {TransactionsRefreshRequest} transactionsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRefresh(transactionsRefreshRequest, options) { return localVarFp.transactionsRefresh(transactionsRefreshRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transactions/rules/v1/create` endpoint creates transaction categorization rules. Rules will be applied on the Item\'s transactions returned in `/transactions/get` response. The product is currently in beta. To request access, contact transactions-feedback@plaid.com. * @summary Create transaction category rule * @param {TransactionsRulesCreateRequest} transactionsRulesCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRulesCreate(transactionsRulesCreateRequest, options) { return localVarFp.transactionsRulesCreate(transactionsRulesCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transactions/rules/v1/list` returns a list of transaction rules created for the Item associated with the access token. * @summary Return a list of rules created for the Item associated with the access token. * @param {TransactionsRulesListRequest} transactionsRulesListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRulesList(transactionsRulesListRequest, options) { return localVarFp.transactionsRulesList(transactionsRulesListRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transactions/rules/v1/remove` endpoint is used to remove a transaction rule. * @summary Remove transaction rule * @param {TransactionsRulesRemoveRequest} transactionsRulesRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsRulesRemove(transactionsRulesRemoveRequest, options) { return localVarFp.transactionsRulesRemove(transactionsRulesRemoveRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsSync(transactionsSyncRequest, options) { return localVarFp.transactionsSync(transactionsSyncRequest, options).then((request) => request(axios, basePath)); }, /** * The `/beta/transactions/user_insights/v1/get` gets user insights for clients who have enriched data with `/transactions/enrich`. The product is currently in beta. * @summary Obtain user insights based on transactions sent through /transactions/enrich * @param {TransactionsUserInsightsGetRequest} transactionsUserInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transactionsUserInsightsGet(transactionsUserInsightsGetRequest, options) { return localVarFp.transactionsUserInsightsGet(transactionsUserInsightsGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/authorization/cancel` endpoint to cancel a transfer authorization. A transfer authorization is eligible for cancellation if it has not yet been used to create a transfer. * @summary Cancel a transfer authorization * @param {TransferAuthorizationCancelRequest} transferAuthorizationCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferAuthorizationCancel(transferAuthorizationCancelRequest, options) { return localVarFp.transferAuthorizationCancel(transferAuthorizationCancelRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/authorization/create` endpoint to authorize a transfer. This endpoint must be called prior to calling `/transfer/create`. The transfer authorization will expire if not used after one hour. (You can contact your account manager to change the default authorization lifetime.) There are four possible outcomes to calling this endpoint: - If the `authorization.decision` in the response is `declined`, the proposed transfer has failed the risk check and you cannot proceed with the transfer. - If the `authorization.decision` is `user_action_required`, additional user input is needed, usually to fix a broken bank connection, before Plaid can properly assess the risk. You need to launch Link in update mode to complete the required user action. When calling `/link/token/create` to get a new Link token, instead of providing `access_token` in the request, you should set [`transfer.authorization_id`](https://plaid.com/docs/api/link/#link-token-create-request-transfer-authorization-id) as the `authorization.id`. After the Link flow is completed, you may re-attempt the authorization. - If the `authorization.decision` is `approved`, and the `authorization.rationale_code` is `null`, the transfer has passed the risk check and you can proceed to call `/transfer/create`. - If the `authorization.decision` is `approved` and the `authorization.rationale_code` is non-`null`, the risk check could not be run: you may proceed with the transfer, but should perform your own risk evaluation. For more details, see the response schema. In Plaid\'s Sandbox environment the decisions will be returned as follows: - To approve a transfer with `null` rationale code, make an authorization request with an `amount` less than the available balance in the account. - To approve a transfer with the rationale code `MANUALLY_VERIFIED_ITEM`, create an Item in Link through the [Same Day Micro-deposits flow](https://plaid.com/docs/auth/coverage/testing/#testing-same-day-micro-deposits). - To get an authorization decision of `user_action_required`, [reset the login for an Item](https://plaid.com/docs/sandbox/#item_login_required). - To decline a transfer with the rationale code `NSF`, the available balance on the account must be less than the authorization `amount`. See [Create Sandbox test data](https://plaid.com/docs/sandbox/user-custom/) for details on how to customize data in Sandbox. - To decline a transfer with the rationale code `RISK`, the available balance on the account must be exactly $0. See [Create Sandbox test data](https://plaid.com/docs/sandbox/user-custom/) for details on how to customize data in Sandbox. * @summary Create a transfer authorization * @param {TransferAuthorizationCreateRequest} transferAuthorizationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferAuthorizationCreate(transferAuthorizationCreateRequest, options) { return localVarFp.transferAuthorizationCreate(transferAuthorizationCreateRequest, options).then((request) => request(axios, basePath)); }, /** * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferBalanceGet(transferBalanceGetRequest, options) { return localVarFp.transferBalanceGet(transferBalanceGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/cancel` endpoint to cancel a transfer. A transfer is eligible for cancellation if the `cancellable` property returned by `/transfer/get` is `true`. * @summary Cancel a transfer * @param {TransferCancelRequest} transferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferCancel(transferCancelRequest, options) { return localVarFp.transferCancel(transferCancelRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/capabilities/get` endpoint to determine the RTP eligibility information of an account to be used with Transfer. This endpoint works on all Transfer-capable Items, including those created by `/transfer/migrate_account`. To simulate RTP eligibility in Sandbox, log in using the username `user_good` and password `pass_good` and use the first two checking and savings accounts in the \"First Platypus Bank\" institution (ending in 0000 or 1111), which will return `true`. Any other account will return `false`. * @summary Get RTP eligibility information of a transfer * @param {TransferCapabilitiesGetRequest} transferCapabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferCapabilitiesGet(transferCapabilitiesGetRequest, options) { return localVarFp.transferCapabilitiesGet(transferCapabilitiesGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/configuration/get` endpoint to view your transfer product configurations. * @summary Get transfer product configuration * @param {TransferConfigurationGetRequest} transferConfigurationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferConfigurationGet(transferConfigurationGetRequest, options) { return localVarFp.transferConfigurationGet(transferConfigurationGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/create` endpoint to initiate a new transfer. This endpoint is retryable and idempotent; if a transfer with the provided `transfer_id` has already been created, it will return the transfer details without creating a new transfer. A transfer may still be created if a 500 error is returned; to detect this scenario, use [Transfer events](https://plaid.com/docs/transfer/reconciling-transfers/). * @summary Create a transfer * @param {TransferCreateRequest} transferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferCreate(transferCreateRequest, options) { return localVarFp.transferCreate(transferCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You’ll need to send a request of type multipart/form-data. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferDiligenceDocumentUpload(transferDiligenceDocumentUploadRequest, options) { return localVarFp.transferDiligenceDocumentUpload(transferDiligenceDocumentUploadRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/diligence/submit` endpoint to submit transfer diligence on behalf of the originator (i.e., the end customer). * @summary Submit transfer diligence on behalf of the originator * @param {TransferDiligenceSubmitRequest} transferDiligenceSubmitRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferDiligenceSubmit(transferDiligenceSubmitRequest, options) { return localVarFp.transferDiligenceSubmit(transferDiligenceSubmitRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/event/list` endpoint to get a list of transfer events based on specified filter criteria. * @summary List transfer events * @param {TransferEventListRequest} transferEventListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferEventList(transferEventListRequest, options) { return localVarFp.transferEventList(transferEventListRequest, options).then((request) => request(axios, basePath)); }, /** * `/transfer/event/sync` allows you to request up to the next 25 transfer events that happened after a specific `event_id`. Use the `/transfer/event/sync` endpoint to guarantee you have seen all transfer events. * @summary Sync transfer events * @param {TransferEventSyncRequest} transferEventSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferEventSync(transferEventSyncRequest, options) { return localVarFp.transferEventSync(transferEventSyncRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/get` endpoint fetches information about the transfer corresponding to the given `transfer_id` or `authorization_id`. One of `transfer_id` or `authorization_id` must be populated but not both. * @summary Retrieve a transfer * @param {TransferGetRequest} transferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferGet(transferGetRequest, options) { return localVarFp.transferGet(transferGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/intent/create` endpoint to generate a transfer intent object and invoke the Transfer UI. * @summary Create a transfer intent object to invoke the Transfer UI * @param {TransferIntentCreateRequest} transferIntentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferIntentCreate(transferIntentCreateRequest, options) { return localVarFp.transferIntentCreate(transferIntentCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/intent/get` endpoint to retrieve more information about a transfer intent. * @summary Retrieve more information about a transfer intent * @param {TransferIntentGetRequest} transferIntentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferIntentGet(transferIntentGetRequest, options) { return localVarFp.transferIntentGet(transferIntentGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/ledger/deposit` endpoint to deposit funds into Plaid Ledger. * @summary Deposit funds into a Plaid Ledger balance * @param {TransferLedgerDepositRequest} transferLedgerDepositRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerDeposit(transferLedgerDepositRequest, options) { return localVarFp.transferLedgerDeposit(transferLedgerDepositRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/ledger/distribute` endpoint to move available balance between the ledgers of the platform and one of its originators. * @summary Move available balance between the ledgers of the platform and one of its originators * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerDistribute(transferLedgerDistributeRequest, options) { return localVarFp.transferLedgerDistribute(transferLedgerDistributeRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/ledger/get` endpoint to view a balance on the ledger held with Plaid. * @summary Retrieve Plaid Ledger balance * @param {TransferLedgerGetRequest} transferLedgerGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerGet(transferLedgerGetRequest, options) { return localVarFp.transferLedgerGet(transferLedgerGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/ledger/withdraw` endpoint to withdraw funds from a Plaid Ledger balance. * @summary Withdraw funds from a Plaid Ledger balance * @param {TransferLedgerWithdrawRequest} transferLedgerWithdrawRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferLedgerWithdraw(transferLedgerWithdrawRequest, options) { return localVarFp.transferLedgerWithdraw(transferLedgerWithdrawRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/list` endpoint to see a list of all your transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired transfers. * @summary List transfers * @param {TransferListRequest} transferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferList(transferListRequest, options) { return localVarFp.transferList(transferListRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/metrics/get` endpoint to view your transfer product usage metrics. * @summary Get transfer product usage metrics * @param {TransferMetricsGetRequest} transferMetricsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferMetricsGet(transferMetricsGetRequest, options) { return localVarFp.transferMetricsGet(transferMetricsGetRequest, options).then((request) => request(axios, basePath)); }, /** * As an alternative to adding Items via Link, you can also use the `/transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. This endpoint is also required when adding an Item for use with wire transfers; if you intend to create wire transfers on this account, you must provide `wire_routing_number`. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid Account Manager. * @summary Migrate account into Transfers * @param {TransferMigrateAccountRequest} transferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferMigrateAccount(transferMigrateAccountRequest, options) { return localVarFp.transferMigrateAccount(transferMigrateAccountRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/originator/create` endpoint to create a new originator and return an `originator_client_id`. * @summary Create a new originator * @param {TransferOriginatorCreateRequest} transferOriginatorCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorCreate(transferOriginatorCreateRequest, options) { return localVarFp.transferOriginatorCreate(transferOriginatorCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/originator/funding_account/update` endpoint to update the funding account associated with the originator. * @summary Update the funding account associated with the originator * @param {TransferOriginatorFundingAccountUpdateRequest} transferOriginatorFundingAccountUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorFundingAccountUpdate(transferOriginatorFundingAccountUpdateRequest, options) { return localVarFp.transferOriginatorFundingAccountUpdate(transferOriginatorFundingAccountUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/originator/get` endpoint gets status updates for an originator\'s onboarding process. This information is also available via the Transfer page on the Plaid dashboard. * @summary Get status of an originator\'s onboarding * @param {TransferOriginatorGetRequest} transferOriginatorGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorGet(transferOriginatorGetRequest, options) { return localVarFp.transferOriginatorGet(transferOriginatorGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/originator/list` endpoint gets status updates for all of your originators\' onboarding. This information is also available via the Plaid dashboard. * @summary Get status of all originators\' onboarding * @param {TransferOriginatorListRequest} transferOriginatorListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferOriginatorList(transferOriginatorListRequest, options) { return localVarFp.transferOriginatorList(transferOriginatorListRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/platform/originator/create` endpoint allows gathering information about the originator specific to the Scaled Platform Transfer offering, including the originator\'s agreement to legal terms required before accepting any further information related to the originator. * @summary Create an originator for scaled platform customers * @param {TransferPlatformOriginatorCreateRequest} transferPlatformOriginatorCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferPlatformOriginatorCreate(transferPlatformOriginatorCreateRequest, options) { return localVarFp.transferPlatformOriginatorCreate(transferPlatformOriginatorCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/platform/person/create` endpoint to create a person record associated with an originator and optionally submit person-specific requirements. * @summary Create a person associated with an originator * @param {TransferPlatformPersonCreateRequest} transferPlatformPersonCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferPlatformPersonCreate(transferPlatformPersonCreateRequest, options) { return localVarFp.transferPlatformPersonCreate(transferPlatformPersonCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/platform/requirement/submit` endpoint allows platforms to submit onboarding requirements for an originator as part of the Scaled Platform Transfer offering. * @summary Submit onboarding requirements for Scaled Platform originators * @param {TransferPlatformRequirementSubmitRequest} transferPlatformRequirementSubmitRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferPlatformRequirementSubmit(transferPlatformRequirementSubmitRequest, options) { return localVarFp.transferPlatformRequirementSubmit(transferPlatformRequirementSubmitRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/questionnaire/create` endpoint generates a Plaid-hosted onboarding UI URL. Redirect the originator to this URL to provide their due diligence information and agree to Plaid’s terms for ACH money movement. * @summary Generate a Plaid-hosted onboarding UI URL. * @param {TransferQuestionnaireCreateRequest} transferQuestionnaireCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferQuestionnaireCreate(transferQuestionnaireCreateRequest, options) { return localVarFp.transferQuestionnaireCreate(transferQuestionnaireCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringCancel(transferRecurringCancelRequest, options) { return localVarFp.transferRecurringCancel(transferRecurringCancelRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/recurring/create` endpoint to initiate a new recurring transfer. This capability is not currently supported for Transfer UI or Platform Payments (beta) customers. * @summary Create a recurring transfer * @param {TransferRecurringCreateRequest} transferRecurringCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringCreate(transferRecurringCreateRequest, options) { return localVarFp.transferRecurringCreate(transferRecurringCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/recurring/get` fetches information about the recurring transfer corresponding to the given `recurring_transfer_id`. * @summary Retrieve a recurring transfer * @param {TransferRecurringGetRequest} transferRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringGet(transferRecurringGetRequest, options) { return localVarFp.transferRecurringGet(transferRecurringGetRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/recurring/list` endpoint to see a list of all your recurring transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired recurring transfers. * @summary List recurring transfers * @param {TransferRecurringListRequest} transferRecurringListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRecurringList(transferRecurringListRequest, options) { return localVarFp.transferRecurringList(transferRecurringListRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/refund/cancel` endpoint to cancel a refund. A refund is eligible for cancellation if it has not yet been submitted to the payment network. * @summary Cancel a refund * @param {TransferRefundCancelRequest} transferRefundCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRefundCancel(transferRefundCancelRequest, options) { return localVarFp.transferRefundCancel(transferRefundCancelRequest, options).then((request) => request(axios, basePath)); }, /** * Use the `/transfer/refund/create` endpoint to create a refund for a transfer. A transfer can be refunded if the transfer was initiated in the past 180 days. Refunds come out of the available balance of the ledger used for the original debit transfer. If there are not enough funds in the available balance to cover the refund amount, the refund will be rejected. You can create a refund at any time. Plaid does not impose any hold time on refunds. * @summary Create a refund * @param {TransferRefundCreateRequest} transferRefundCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRefundCreate(transferRefundCreateRequest, options) { return localVarFp.transferRefundCreate(transferRefundCreateRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/refund/get` endpoint fetches information about the refund corresponding to the given `refund_id`. * @summary Retrieve a refund * @param {TransferRefundGetRequest} transferRefundGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRefundGet(transferRefundGetRequest, options) { return localVarFp.transferRefundGet(transferRefundGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/repayment/list` endpoint fetches repayments matching the given filters. Repayments are returned in reverse-chronological order (most recent first) starting at the given `start_time`. * @summary Lists historical repayments * @param {TransferRepaymentListRequest} transferRepaymentListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRepaymentList(transferRepaymentListRequest, options) { return localVarFp.transferRepaymentList(transferRepaymentListRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/repayment/return/list` endpoint retrieves the set of returns that were batched together into the specified repayment. The sum of amounts of returns retrieved by this request equals the amount of the repayment. * @summary List the returns included in a repayment * @param {TransferRepaymentReturnListRequest} transferRepaymentReturnListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferRepaymentReturnList(transferRepaymentReturnListRequest, options) { return localVarFp.transferRepaymentReturnList(transferRepaymentReturnListRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep * @param {TransferSweepGetRequest} transferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferSweepGet(transferSweepGetRequest, options) { return localVarFp.transferSweepGet(transferSweepGetRequest, options).then((request) => request(axios, basePath)); }, /** * The `/transfer/sweep/list` endpoint fetches sweeps matching the given filters. * @summary List sweeps * @param {TransferSweepListRequest} transferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ transferSweepList(transferSweepListRequest, options) { return localVarFp.transferSweepList(transferSweepListRequest, options).then((request) => request(axios, basePath)); }, /** * Returns user permissioned account data including identity and Item access tokens. * @summary Retrieve User Account * @param {UserAccountSessionGetRequest} userAccountSessionGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userAccountSessionGet(userAccountSessionGetRequest, options) { return localVarFp.userAccountSessionGet(userAccountSessionGetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint should be called for each of your end users before they begin a Plaid Check or Income flow, or a Multi-Item Link flow. This provides you a single token to access all data associated with the user. You should only create one per end user. The `consumer_report_user_identity` object must be present in order to create a Plaid Check Consumer Report for a user. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If you call the endpoint multiple times with the same `client_user_id`, the first creation call will succeed and the rest will fail with an error message indicating that the user has been created for the given `client_user_id`. Ensure that you store the `user_token` along with your user\'s identifier in your database, as it is not possible to retrieve a previously created `user_token`. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userCreate(userCreateRequest, options) { return localVarFp.userCreate(userCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Returns Items associated with a User along with their corresponding statuses. * @summary Get Items associated with a User * @param {UserItemsGetRequest} userItemsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userItemsGet(userItemsGetRequest, options) { return localVarFp.userItemsGet(userItemsGetRequest, options).then((request) => request(axios, basePath)); }, /** * `/user/remove` deletes a user token and and associated information, including any Items associated with the token. Any subsequent calls to retrieve information using the same user token will result in an error stating the user does not exist. * @summary Remove user * @param {UserRemoveRequest} userRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userRemove(userRemoveRequest, options) { return localVarFp.userRemove(userRemoveRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint is used to create a third-party user token. This token can be shared with and used by a specified third-party client to access data associated with the user through supported endpoints. Ensure you store the `third_party_user_token` along with the `user_token` and `third_party_client_id`, as it is not possible to retrieve a previously created `third_party_user_token`. * @summary Create a third-party user token * @param {UserThirdPartyTokenCreateRequest} userThirdPartyTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest, options) { return localVarFp.userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userThirdPartyTokenRemove(userThirdPartyTokenRemoveRequest, options) { return localVarFp.userThirdPartyTokenRemove(userThirdPartyTokenRemoveRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint is used to update user information associated with an existing `user_token`. It can also be used to enable an existing `user_token` for use with Consumer Reports by Plaid Check, by adding a `consumer_report_user_identity` object to the user. Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. * @summary Update user information * @param {UserUpdateRequest} userUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ userUpdate(userUpdateRequest, options) { return localVarFp.userUpdate(userUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * Create an e-wallet. The response is the newly created e-wallet object. * @summary Create an e-wallet * @param {WalletCreateRequest} walletCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletCreate(walletCreateRequest, options) { return localVarFp.walletCreate(walletCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Fetch an e-wallet. The response includes the current balance. * @summary Fetch an e-wallet * @param {WalletGetRequest} walletGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletGet(walletGetRequest, options) { return localVarFp.walletGet(walletGetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint lists all e-wallets in descending order of creation. * @summary Fetch a list of e-wallets * @param {WalletListRequest} walletListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletList(walletListRequest, options) { return localVarFp.walletList(walletListRequest, options).then((request) => request(axios, basePath)); }, /** * Execute a transaction using the specified e-wallet. Specify the e-wallet to debit from, the counterparty to credit to, the idempotency key to prevent duplicate transactions, the amount and reference for the transaction. Transactions will settle in seconds to several days, depending on the underlying payment rail. * @summary Execute a transaction using an e-wallet * @param {WalletTransactionExecuteRequest} walletTransactionExecuteRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletTransactionExecute(walletTransactionExecuteRequest, options) { return localVarFp.walletTransactionExecute(walletTransactionExecuteRequest, options).then((request) => request(axios, basePath)); }, /** * Fetch a specific e-wallet transaction * @summary Fetch an e-wallet transaction * @param {WalletTransactionGetRequest} walletTransactionGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletTransactionGet(walletTransactionGetRequest, options) { return localVarFp.walletTransactionGet(walletTransactionGetRequest, options).then((request) => request(axios, basePath)); }, /** * This endpoint lists the latest transactions of the specified e-wallet. Transactions are returned in descending order by the `created_at` time. * @summary List e-wallet transactions * @param {WalletTransactionListRequest} walletTransactionListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ walletTransactionList(walletTransactionListRequest, options) { return localVarFp.walletTransactionList(walletTransactionListRequest, options).then((request) => request(axios, basePath)); }, /** * Create a new entity watchlist screening to check your customer against watchlists defined in the associated entity watchlist program. If your associated program has ongoing screening enabled, this is the profile information that will be used to monitor your customer over time. * @summary Create a watchlist screening for an entity * @param {WatchlistScreeningEntityCreateRequest} watchlistScreeningEntityCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityCreate(watchlistScreeningEntityCreateRequest, options) { return localVarFp.watchlistScreeningEntityCreate(watchlistScreeningEntityCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Retrieve an entity watchlist screening. * @summary Get an entity screening * @param {WatchlistScreeningEntityGetRequest} watchlistScreeningEntityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityGet(watchlistScreeningEntityGetRequest, options) { return localVarFp.watchlistScreeningEntityGet(watchlistScreeningEntityGetRequest, options).then((request) => request(axios, basePath)); }, /** * List all changes to the entity watchlist screening in reverse-chronological order. If the watchlist screening has not been edited, no history will be returned. * @summary List history for entity watchlist screenings * @param {WatchlistScreeningEntityHistoryListRequest} watchlistScreeningEntityHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityHistoryList(watchlistScreeningEntityHistoryListRequest, options) { return localVarFp.watchlistScreeningEntityHistoryList(watchlistScreeningEntityHistoryListRequest, options).then((request) => request(axios, basePath)); }, /** * List all hits for the entity watchlist screening. * @summary List hits for entity watchlist screenings * @param {WatchlistScreeningEntityHitListRequest} watchlistScreeningEntityHitListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityHitList(watchlistScreeningEntityHitListRequest, options) { return localVarFp.watchlistScreeningEntityHitList(watchlistScreeningEntityHitListRequest, options).then((request) => request(axios, basePath)); }, /** * List all entity screenings. * @summary List entity watchlist screenings * @param {WatchlistScreeningEntityListRequest} watchlistScreeningEntityListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityList(watchlistScreeningEntityListRequest, options) { return localVarFp.watchlistScreeningEntityList(watchlistScreeningEntityListRequest, options).then((request) => request(axios, basePath)); }, /** * Get an entity watchlist screening program * @summary Get entity watchlist screening program * @param {WatchlistScreeningEntityProgramGetRequest} watchlistScreeningEntityProgramGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityProgramGet(watchlistScreeningEntityProgramGetRequest, options) { return localVarFp.watchlistScreeningEntityProgramGet(watchlistScreeningEntityProgramGetRequest, options).then((request) => request(axios, basePath)); }, /** * List all entity watchlist screening programs * @summary List entity watchlist screening programs * @param {WatchlistScreeningEntityProgramListRequest} watchlistScreeningEntityProgramListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityProgramList(watchlistScreeningEntityProgramListRequest, options) { return localVarFp.watchlistScreeningEntityProgramList(watchlistScreeningEntityProgramListRequest, options).then((request) => request(axios, basePath)); }, /** * Create a review for an entity watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary Create a review for an entity watchlist screening * @param {WatchlistScreeningEntityReviewCreateRequest} watchlistScreeningEntityReviewCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityReviewCreate(watchlistScreeningEntityReviewCreateRequest, options) { return localVarFp.watchlistScreeningEntityReviewCreate(watchlistScreeningEntityReviewCreateRequest, options).then((request) => request(axios, basePath)); }, /** * List all reviews for a particular entity watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary List reviews for entity watchlist screenings * @param {WatchlistScreeningEntityReviewListRequest} watchlistScreeningEntityReviewListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityReviewList(watchlistScreeningEntityReviewListRequest, options) { return localVarFp.watchlistScreeningEntityReviewList(watchlistScreeningEntityReviewListRequest, options).then((request) => request(axios, basePath)); }, /** * Update an entity watchlist screening. * @summary Update an entity screening * @param {WatchlistScreeningEntityUpdateRequest} watchlistScreeningEntityUpdateRequest The entity screening was successfully updated. * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningEntityUpdate(watchlistScreeningEntityUpdateRequest, options) { return localVarFp.watchlistScreeningEntityUpdate(watchlistScreeningEntityUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * Create a new Watchlist Screening to check your customer against watchlists defined in the associated Watchlist Program. If your associated program has ongoing screening enabled, this is the profile information that will be used to monitor your customer over time. * @summary Create a watchlist screening for a person * @param {WatchlistScreeningIndividualCreateRequest} watchlistScreeningIndividualCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualCreate(watchlistScreeningIndividualCreateRequest, options) { return localVarFp.watchlistScreeningIndividualCreate(watchlistScreeningIndividualCreateRequest, options).then((request) => request(axios, basePath)); }, /** * Retrieve a previously created individual watchlist screening * @summary Retrieve an individual watchlist screening * @param {WatchlistScreeningIndividualGetRequest} watchlistScreeningIndividualGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualGet(watchlistScreeningIndividualGetRequest, options) { return localVarFp.watchlistScreeningIndividualGet(watchlistScreeningIndividualGetRequest, options).then((request) => request(axios, basePath)); }, /** * List all changes to the individual watchlist screening in reverse-chronological order. If the watchlist screening has not been edited, no history will be returned. * @summary List history for individual watchlist screenings * @param {WatchlistScreeningIndividualHistoryListRequest} watchlistScreeningIndividualHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualHistoryList(watchlistScreeningIndividualHistoryListRequest, options) { return localVarFp.watchlistScreeningIndividualHistoryList(watchlistScreeningIndividualHistoryListRequest, options).then((request) => request(axios, basePath)); }, /** * List all hits found by Plaid for a particular individual watchlist screening. * @summary List hits for individual watchlist screening * @param {WatchlistScreeningIndividualHitListRequest} watchlistScreeningIndividualHitListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualHitList(watchlistScreeningIndividualHitListRequest, options) { return localVarFp.watchlistScreeningIndividualHitList(watchlistScreeningIndividualHitListRequest, options).then((request) => request(axios, basePath)); }, /** * List previously created watchlist screenings for individuals * @summary List Individual Watchlist Screenings * @param {WatchlistScreeningIndividualListRequest} watchlistScreeningIndividualListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualList(watchlistScreeningIndividualListRequest, options) { return localVarFp.watchlistScreeningIndividualList(watchlistScreeningIndividualListRequest, options).then((request) => request(axios, basePath)); }, /** * Get an individual watchlist screening program * @summary Get individual watchlist screening program * @param {WatchlistScreeningIndividualProgramGetRequest} watchlistScreeningIndividualProgramGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualProgramGet(watchlistScreeningIndividualProgramGetRequest, options) { return localVarFp.watchlistScreeningIndividualProgramGet(watchlistScreeningIndividualProgramGetRequest, options).then((request) => request(axios, basePath)); }, /** * List all individual watchlist screening programs * @summary List individual watchlist screening programs * @param {WatchlistScreeningIndividualProgramListRequest} watchlistScreeningIndividualProgramListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualProgramList(watchlistScreeningIndividualProgramListRequest, options) { return localVarFp.watchlistScreeningIndividualProgramList(watchlistScreeningIndividualProgramListRequest, options).then((request) => request(axios, basePath)); }, /** * Create a review for the individual watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary Create a review for an individual watchlist screening * @param {WatchlistScreeningIndividualReviewCreateRequest} watchlistScreeningIndividualReviewCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualReviewCreate(watchlistScreeningIndividualReviewCreateRequest, options) { return localVarFp.watchlistScreeningIndividualReviewCreate(watchlistScreeningIndividualReviewCreateRequest, options).then((request) => request(axios, basePath)); }, /** * List all reviews for the individual watchlist screening. * @summary List reviews for individual watchlist screenings * @param {WatchlistScreeningIndividualReviewListRequest} watchlistScreeningIndividualReviewListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualReviewList(watchlistScreeningIndividualReviewListRequest, options) { return localVarFp.watchlistScreeningIndividualReviewList(watchlistScreeningIndividualReviewListRequest, options).then((request) => request(axios, basePath)); }, /** * Update a specific individual watchlist screening. This endpoint can be used to add additional customer information, correct outdated information, add a reference id, assign the individual to a reviewer, and update which program it is associated with. Please note that you may not update `search_terms` and `status` at the same time since editing `search_terms` may trigger an automatic `status` change. * @summary Update individual watchlist screening * @param {WatchlistScreeningIndividualUpdateRequest} watchlistScreeningIndividualUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ watchlistScreeningIndividualUpdate(watchlistScreeningIndividualUpdateRequest, options) { return localVarFp.watchlistScreeningIndividualUpdate(watchlistScreeningIndividualUpdateRequest, options).then((request) => request(axios, basePath)); }, /** * Plaid signs all outgoing webhooks and provides JSON Web Tokens (JWTs) so that you can verify the authenticity of any incoming webhooks to your application. A message signature is included in the `Plaid-Verification` header. The `/webhook_verification_key/get` endpoint provides a JSON Web Key (JWK) that can be used to verify a JWT. * @summary Get webhook verification key * @param {WebhookVerificationKeyGetRequest} webhookVerificationKeyGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} */ webhookVerificationKeyGet(webhookVerificationKeyGetRequest, options) { return localVarFp.webhookVerificationKeyGet(webhookVerificationKeyGetRequest, options).then((request) => request(axios, basePath)); }, }; }; exports.PlaidApiFactory = PlaidApiFactory; /** * PlaidApi - object-oriented interface * @export * @class PlaidApi * @extends {BaseAPI} */ class PlaidApi extends base_1.BaseAPI { /** * The `/accounts/balance/get` endpoint returns the real-time balance for each of an Item\'s accounts. While other endpoints, such as `/accounts/get`, return a balance object, only `/accounts/balance/get` forces the available and current balance fields to be refreshed rather than cached. This endpoint can be used for existing Items that were added via any of Plaid’s other products. This endpoint can be used as long as Link has been initialized with any other product, `balance` itself is not a product that can be used to initialize Link. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. * @summary Retrieve real-time balance data * @param {AccountsBalanceGetRequest} accountsBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ accountsBalanceGet(accountsBalanceGetRequest, options) { return exports.PlaidApiFp(this.configuration).accountsBalanceGet(accountsBalanceGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/accounts/get` endpoint can be used to retrieve a list of accounts associated with any linked Item. Plaid will only return active bank accounts — that is, accounts that are not closed and are capable of carrying a balance. To return new accounts that were created after the user linked their Item, you can listen for the [`NEW_ACCOUNTS_AVAILABLE`](https://plaid.com/docs/api/items/#new_accounts_available) webhook and then use Link\'s [update mode](https://plaid.com/docs/link/update-mode/) to request that the user share this new account with you. `/accounts/get` is free to use and retrieves cached information, rather than extracting fresh information from the institution. The balance returned will reflect the balance at the time of the last successful Item update. If the Item is enabled for a regularly updating product, such as Transactions, Investments, or Liabilities, the balance will typically update about once a day, as long as the Item is healthy. If the Item is enabled only for products that do not frequently update, such as Auth or Identity, balance data may be much older. For realtime balance information, use the paid endpoint `/accounts/balance/get` instead. * @summary Retrieve accounts * @param {AccountsGetRequest} accountsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ accountsGet(accountsGetRequest, options) { return exports.PlaidApiFp(this.configuration).accountsGet(accountsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Allows financial institutions to retrieve information about Plaid clients for the purpose of building control-tower experiences * @summary Retrieve information about a Plaid application * @param {ApplicationGetRequest} applicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ applicationGet(applicationGetRequest, options) { return exports.PlaidApiFp(this.configuration).applicationGet(applicationGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Plaid can provide an Audit Copy of any Asset Report directly to a participating third party on your behalf. For example, Plaid can supply an Audit Copy directly to Fannie Mae on your behalf if you participate in the Day 1 Certainty™ program. An Audit Copy contains the same underlying data as the Asset Report. To grant access to an Audit Copy, use the `/asset_report/audit_copy/create` endpoint to create an `audit_copy_token` and then pass that token to the third party who needs access. Each third party has its own `auditor_id`, for example `fannie_mae`. You’ll need to create a separate Audit Copy for each third party to whom you want to grant access to the Report. * @summary Create Asset Report Audit Copy * @param {AssetReportAuditCopyCreateRequest} assetReportAuditCopyCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ assetReportAuditCopyCreate(assetReportAuditCopyCreateRequest, options) { return exports.PlaidApiFp(this.configuration).assetReportAuditCopyCreate(assetReportAuditCopyCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/asset_report/audit_copy/get` allows auditors to get a copy of an Asset Report that was previously shared via the `/asset_report/audit_copy/create` endpoint. The caller of `/asset_report/audit_copy/create` must provide the `audit_copy_token` to the auditor. This token can then be used to call `/asset_report/audit_copy/create`. * @summary Retrieve an Asset Report Audit Copy * @param {AssetReportAuditCopyGetRequest} assetReportAuditCopyGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ assetReportAuditCopyGet(assetReportAuditCopyGetRequest, options) { return exports.PlaidApiFp(this.configuration).assetReportAuditCopyGet(assetReportAuditCopyGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/asset_report/audit_copy/remove` endpoint allows you to remove an Audit Copy. Removing an Audit Copy invalidates the `audit_copy_token` associated with it, meaning both you and any third parties holding the token will no longer be able to use it to access Report data. Items associated with the Asset Report, the Asset Report itself and other Audit Copies of it are not affected and will remain accessible after removing the given Audit Copy. * @summary Remove Asset Report Audit Copy * @param {AssetReportAuditCopyRemoveRequest} assetReportAuditCopyRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ assetReportAuditCopyRemove(assetReportAuditCopyRemoveRequest, options) { return exports.PlaidApiFp(this.configuration).assetReportAuditCopyRemove(assetReportAuditCopyRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/asset_report/create` endpoint initiates the process of creating an Asset Report, which can then be retrieved by passing the `asset_report_token` return value to the `/asset_report/get` or `/asset_report/pdf/get` endpoints. The Asset Report takes some time to be created and is not available immediately after calling `/asset_report/create`. The exact amount of time to create the report will vary depending on how many days of history are requested and will typically range from a few seconds to about one minute. When the Asset Report is ready to be retrieved using `/asset_report/get` or `/asset_report/pdf/get`, Plaid will fire a `PRODUCT_READY` webhook. For full details of the webhook schema, see [Asset Report webhooks](https://plaid.com/docs/api/products/assets/#webhooks). The `/asset_report/create` endpoint creates an Asset Report at a moment in time. Asset Reports are immutable. To get an updated Asset Report, use the `/asset_report/refresh` endpoint. * @summary Create an Asset Report * @param {AssetReportCreateRequest} assetReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ assetReportCreate(assetReportCreateRequest, options) { return exports.PlaidApiFp(this.configuration).assetReportCreate(assetReportCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * By default, an Asset Report will contain all of the accounts on a given Item. In some cases, you may not want the Asset Report to contain all accounts. For example, you might have the end user choose which accounts are relevant in Link using the Account Select view, which you can enable in the dashboard. Or, you might always exclude certain account types or subtypes, which you can identify by using the `/accounts/get` endpoint. To narrow an Asset Report to only a subset of accounts, use the `/asset_report/filter` endpoint. To exclude certain Accounts from an Asset Report, first use the `/asset_report/create` endpoint to create the report, then send the `asset_report_token` along with a list of `account_ids` to exclude to the `/asset_report/filter` endpoint, to create a new Asset Report which contains only a subset of the original Asset Report\'s data. Because Asset Reports are immutable, calling `/asset_report/filter` does not alter the original Asset Report in any way; rather, `/asset_report/filter` creates a new Asset Report with a new token and id. Asset Reports created via `/asset_report/filter` do not contain new Asset data, and are not billed. Plaid will fire a [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook once generation of the filtered Asset Report has completed. * @summary Filter Asset Report * @param {AssetReportFilterRequest} assetReportFilterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ assetReportFilter(assetReportFilterRequest, options) { return exports.PlaidApiFp(this.configuration).assetReportFilter(assetReportFilterRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/asset_report/get` endpoint retrieves the Asset Report in JSON format. Before calling `/asset_report/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. By default, an Asset Report includes transaction descriptions as returned by the bank, as opposed to parsed and categorized by Plaid. You can also receive cleaned and categorized transactions, as well as additional insights like merchant name or location information. We call this an Asset Report with Insights. An Asset Report with Insights provides transaction category, location, and merchant information in addition to the transaction strings provided in a standard Asset Report. To retrieve an Asset Report with Insights, call `/asset_report/get` endpoint with `include_insights` set to `true`. For latency-sensitive applications, you can optionally call `/asset_report/create` with `options.add_ons` set to `[\"fast_assets\"]`. This will cause Plaid to create two versions of the Asset Report: one with only current and available balance and identity information, and then later on the complete Asset Report. You will receive separate webhooks for each version of the Asset Report. * @summary Retrieve an Asset Report * @param {AssetReportGetRequest} assetReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ assetReportGet(assetReportGetRequest, options) { return exports.PlaidApiFp(this.configuration).assetReportGet(assetReportGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/asset_report/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/asset_report/pdf/get`, you must first create the Asset Report using `/asset_report/create` (or filter an Asset Report using `/asset_report/filter`) and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/asset_report/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). * @summary Retrieve a PDF Asset Report * @param {AssetReportPDFGetRequest} assetReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ assetReportPdfGet(assetReportPDFGetRequest, options) { return exports.PlaidApiFp(this.configuration).assetReportPdfGet(assetReportPDFGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * An Asset Report is an immutable snapshot of a user\'s assets. In order to \"refresh\" an Asset Report you created previously, you can use the `/asset_report/refresh` endpoint to create a new Asset Report based on the old one, but with the most recent data available. The new Asset Report will contain the same Items as the original Report, as well as the same filters applied by any call to `/asset_report/filter`. By default, the new Asset Report will also use the same parameters you submitted with your original `/asset_report/create` request, but the original `days_requested` value and the values of any parameters in the `options` object can be overridden with new values. To change these arguments, simply supply new values for them in your request to `/asset_report/refresh`. Submit an empty string (\"\") for any previously-populated fields you would like set as empty. * @summary Refresh an Asset Report * @param {AssetReportRefreshRequest} assetReportRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ assetReportRefresh(assetReportRefreshRequest, options) { return exports.PlaidApiFp(this.configuration).assetReportRefresh(assetReportRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/item/remove` endpoint allows you to invalidate an `access_token`, meaning you will not be able to create new Asset Reports with it. Removing an Item does not affect any Asset Reports or Audit Copies you have already created, which will remain accessible until you remove them specifically. The `/asset_report/remove` endpoint allows you to remove access to an Asset Report. Removing an Asset Report invalidates its `asset_report_token`, meaning you will no longer be able to use it to access Report data or create new Audit Copies. Removing an Asset Report does not affect the underlying Items, but does invalidate any `audit_copy_tokens` associated with the Asset Report. * @summary Delete an Asset Report * @param {AssetReportRemoveRequest} assetReportRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ assetReportRemove(assetReportRemoveRequest, options) { return exports.PlaidApiFp(this.configuration).assetReportRemove(assetReportRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/auth/get` endpoint returns the bank account and bank identification numbers (such as routing numbers, for US accounts) associated with an Item\'s checking, savings, and cash management accounts, along with high-level account data and balances when available. Versioning note: In API version 2017-03-08, the schema of the `numbers` object returned by this endpoint is substantially different. For details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2018-05-22). * @summary Retrieve auth data * @param {AuthGetRequest} authGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ authGet(authGetRequest, options) { return exports.PlaidApiFp(this.configuration).authGet(authGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/bank_transfer/balance/get` endpoint to see the available balance in your bank transfer account. Debit transfers increase this balance once their status is posted. Credit transfers decrease this balance when they are created. The transactable balance shows the amount in your account that you are able to use for transfers, and is essentially your available balance minus your minimum balance. Note that this endpoint can only be used with FBO accounts, when using Bank Transfers in the Full Service configuration. It cannot be used on your own account when using Bank Transfers in the BTS Platform configuration. * @summary Get balance of your Bank Transfer account * @param {BankTransferBalanceGetRequest} bankTransferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ bankTransferBalanceGet(bankTransferBalanceGetRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferBalanceGet(bankTransferBalanceGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/bank_transfer/cancel` endpoint to cancel a bank transfer. A transfer is eligible for cancelation if the `cancellable` property returned by `/bank_transfer/get` is `true`. * @summary Cancel a bank transfer * @param {BankTransferCancelRequest} bankTransferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ bankTransferCancel(bankTransferCancelRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferCancel(bankTransferCancelRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/bank_transfer/create` endpoint to initiate a new bank transfer. * @summary Create a bank transfer * @param {BankTransferCreateRequest} bankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ bankTransferCreate(bankTransferCreateRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferCreate(bankTransferCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/bank_transfer/event/list` endpoint to get a list of Plaid-initiated ACH or bank transfer events based on specified filter criteria. When using Auth with micro-deposit verification enabled, this endpoint can be used to fetch status updates on ACH micro-deposits. For more details, see [micro-deposit events](https://plaid.com/docs/auth/coverage/microdeposit-events/). * @summary List bank transfer events * @param {BankTransferEventListRequest} bankTransferEventListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ bankTransferEventList(bankTransferEventListRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferEventList(bankTransferEventListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/bank_transfer/event/sync` allows you to request up to the next 25 Plaid-initiated bank transfer events that happened after a specific `event_id`. When using Auth with micro-deposit verification enabled, this endpoint can be used to fetch status updates on ACH micro-deposits. For more details, see [micro-deposit events](https://www.plaid.com/docs/auth/coverage/microdeposit-events/). * @summary Sync bank transfer events * @param {BankTransferEventSyncRequest} bankTransferEventSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ bankTransferEventSync(bankTransferEventSyncRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferEventSync(bankTransferEventSyncRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/bank_transfer/get` fetches information about the bank transfer corresponding to the given `bank_transfer_id`. * @summary Retrieve a bank transfer * @param {BankTransferGetRequest} bankTransferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ bankTransferGet(bankTransferGetRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferGet(bankTransferGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/bank_transfer/list` endpoint to see a list of all your bank transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired bank transfers. * @summary List bank transfers * @param {BankTransferListRequest} bankTransferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ bankTransferList(bankTransferListRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferList(bankTransferListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * As an alternative to adding Items via Link, you can also use the `/bank_transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Bank Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/bank_transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid Account Manager. * @summary Migrate account into Bank Transfers * @param {BankTransferMigrateAccountRequest} bankTransferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ bankTransferMigrateAccount(bankTransferMigrateAccountRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferMigrateAccount(bankTransferMigrateAccountRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/bank_transfer/sweep/get` endpoint fetches information about the sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep * @param {BankTransferSweepGetRequest} bankTransferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ bankTransferSweepGet(bankTransferSweepGetRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferSweepGet(bankTransferSweepGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/bank_transfer/sweep/list` endpoint fetches information about the sweeps matching the given filters. * @summary List sweeps * @param {BankTransferSweepListRequest} bankTransferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ bankTransferSweepList(bankTransferSweepListRequest, options) { return exports.PlaidApiFp(this.configuration).bankTransferSweepList(bankTransferSweepListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use `/beacon/account_risk/v1/evaluate` to get risk insights for a linked account. * @summary Evaluate risk of a bank account * @param {BeaconAccountRiskEvaluateRequest} beaconAccountRiskEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconAccountRiskEvaluate(beaconAccountRiskEvaluateRequest, options) { return exports.PlaidApiFp(this.configuration).beaconAccountRiskEvaluate(beaconAccountRiskEvaluateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Returns a Beacon Duplicate for a given Beacon Duplicate id. A Beacon Duplicate represents a pair of similar Beacon Users within your organization. Two Beacon User revisions are returned for each Duplicate record in either the `beacon_user1` or `beacon_user2` response fields. The `analysis` field in the response indicates which fields matched between `beacon_user1` and `beacon_user2`. * @summary Get a Beacon Duplicate * @param {BeaconDuplicateGetRequest} beaconDuplicateGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconDuplicateGet(beaconDuplicateGetRequest, options) { return exports.PlaidApiFp(this.configuration).beaconDuplicateGet(beaconDuplicateGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Create a fraud report for a given Beacon User. * @summary Create a Beacon Report * @param {BeaconReportCreateRequest} beaconReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconReportCreate(beaconReportCreateRequest, options) { return exports.PlaidApiFp(this.configuration).beaconReportCreate(beaconReportCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Returns a Beacon report for a given Beacon report id. * @summary Get a Beacon Report * @param {BeaconReportGetRequest} beaconReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconReportGet(beaconReportGetRequest, options) { return exports.PlaidApiFp(this.configuration).beaconReportGet(beaconReportGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/beacon/report/list` endpoint to view all Beacon Reports you created for a specific Beacon User. The reports returned by this endpoint are exclusively reports you created for a specific user. A Beacon User can only have one active report at a time, but a new report can be created if a previous report has been deleted. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. * @summary List Beacon Reports for a Beacon User * @param {BeaconReportListRequest} beaconReportListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconReportList(beaconReportListRequest, options) { return exports.PlaidApiFp(this.configuration).beaconReportList(beaconReportListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Returns a Beacon Report Syndication for a given Beacon Report Syndication id. * @summary Get a Beacon Report Syndication * @param {BeaconReportSyndicationGetRequest} beaconReportSyndicationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconReportSyndicationGet(beaconReportSyndicationGetRequest, options) { return exports.PlaidApiFp(this.configuration).beaconReportSyndicationGet(beaconReportSyndicationGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/beacon/report_syndication/list` endpoint to view all Beacon Reports that have been syndicated to a specific Beacon User. This endpoint returns Beacon Report Syndications which are references to Beacon Reports created either by you, or another Beacon customer, that matched the specified Beacon User. A Beacon User can have multiple active Beacon Report Syndications at once. The results from this endpoint are paginated; the `next_cursor` field will be populated if there is another page of results that can be retrieved. To fetch the next page, pass the `next_cursor` value as the `cursor` parameter in the next request. * @summary List Beacon Report Syndications for a Beacon User * @param {BeaconReportSyndicationListRequest} beaconReportSyndicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconReportSyndicationList(beaconReportSyndicationListRequest, options) { return exports.PlaidApiFp(this.configuration).beaconReportSyndicationList(beaconReportSyndicationListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Get Account Insights for all Accounts linked to this Beacon User. The insights for each account are computed based on the information that was last retrieved from the financial institution. * @summary Get Account Insights for a Beacon User * @param {BeaconUserAccountInsightsGetRequest} beaconUserAccountInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest, options) { return exports.PlaidApiFp(this.configuration).beaconUserAccountInsightsGet(beaconUserAccountInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Create and scan a Beacon User against your Beacon Program, according to your program\'s settings. When you submit a new user to `/beacon/user/create`, several checks are performed immediately: - The user\'s PII (provided within the `user` object) is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. * @summary Create a Beacon User * @param {BeaconUserCreateRequest} beaconUserCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconUserCreate(beaconUserCreateRequest, options) { return exports.PlaidApiFp(this.configuration).beaconUserCreate(beaconUserCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Fetch a Beacon User. The Beacon User is returned with all of their associated information and a `status` based on the Beacon Network duplicate record and fraud checks. * @summary Get a Beacon User * @param {BeaconUserGetRequest} beaconUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconUserGet(beaconUserGetRequest, options) { return exports.PlaidApiFp(this.configuration).beaconUserGet(beaconUserGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List all changes to the Beacon User in reverse-chronological order. * @summary List a Beacon User\'s history * @param {BeaconUserHistoryListRequest} beaconUserHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconUserHistoryList(beaconUserHistoryListRequest, options) { return exports.PlaidApiFp(this.configuration).beaconUserHistoryList(beaconUserHistoryListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Update the status of a Beacon User. When updating a Beacon User\'s status via this endpoint, Plaid validates that the status change is consistent with the related state for this Beacon User. Specifically, we will check: 1. Whether there are any associated Beacon Reports connected to the Beacon User, and 2. Whether there are any confirmed Beacon Report Syndications connected to the Beacon User. When updating a Beacon User\'s status to \"rejected\", we enforce that either a Beacon Report has been created for the Beacon User or a Beacon Report Syndication has been confirmed. When updating a Beacon User\'s status to \"cleared\", we enforce that there are no active Beacon Reports or confirmed Beacon Report Syndications associated with the user. If you previously created a Beacon Report for this user, you must delete it before updating the Beacon User\'s status to \"cleared\". There are no restrictions on updating a Beacon User\'s status to \"pending_review\". If these conditions are not met, the request will be rejected with an error explaining the issue. * @summary Review a Beacon User * @param {BeaconUserReviewRequest} beaconUserReviewRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconUserReview(beaconUserReviewRequest, options) { return exports.PlaidApiFp(this.configuration).beaconUserReview(beaconUserReviewRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Update the identity data for a Beacon User in your Beacon Program or add new accounts to the Beacon User. Similar to `/beacon/user/create`, several checks are performed immediately when you submit an identity data change to `/beacon/user/update`: - The user\'s updated PII is searched against all other users within the Beacon Program you specified. If a match is found that violates your program\'s \"Duplicate Information Filtering\" settings, the user will be returned with a status of `pending_review`. - The user\'s updated PII is also searched against all fraud reports created by your organization across all of your Beacon Programs. If the user\'s data matches a fraud report that your team created, the user will be returned with a status of `rejected`. - Finally, the user\'s PII is searched against all fraud report shared with the Beacon Network by other companies. If a matching fraud report is found, the user will be returned with a `pending_review` status if your program has enabled automatic flagging based on network fraud. Plaid maintains a version history for each Beacon User, so the Beacon User\'s identity data before and after the update is retained as separate versions. * @summary Update the identity data of a Beacon User * @param {BeaconUserUpdateRequest} beaconUserUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ beaconUserUpdate(beaconUserUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).beaconUserUpdate(beaconUserUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Send a request to the `/categories/get` endpoint to get detailed information on categories returned by Plaid. This endpoint does not require authentication. All implementations are recommended to use the newer `personal_finance_category` taxonomy instead of the older `category` taxonomy supported by this endpoint. The [`personal_finance_category taxonomy` CSV file](https://plaid.com/documents/transactions-personal-finance-category-taxonomy.csv) is available for download and is not accessible via API. * @summary Get categories * @param {object} body * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ categoriesGet(body, options) { return exports.PlaidApiFp(this.configuration).categoriesGet(body, options).then((request) => request(this.axios, this.basePath)); } /** * List a historical log of Item consent events. Consent logs are only available for events occurring on or after November 7, 2024. Up to three years of consent logs will be available via the endpoint. * @summary List a historical log of item consent events * @param {ConsentEventsGetRequest} consentEventsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ consentEventsGet(consentEventsGetRequest, options) { return exports.PlaidApiFp(this.configuration).consentEventsGet(consentEventsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Retrieves all existing CRB Bank Income and Base reports for the consumer in PDF format. Response is PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. * @summary Retrieve a PDF Reports * @param {ConsumerReportPDFGetRequest} consumerReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ consumerReportPdfGet(consumerReportPDFGetRequest, options) { return exports.PlaidApiFp(this.configuration).consumerReportPdfGet(consumerReportPDFGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/cra/bank_income/create` creates a CRA report for income verification * @summary Create a CRA report for income verification * @param {CraBankIncomeCreateRequest} craBankIncomeCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craBankIncomeCreate(craBankIncomeCreateRequest, options) { return exports.PlaidApiFp(this.configuration).craBankIncomeCreate(craBankIncomeCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/cra/bank_income/get` returns the bank income report(s) for a specified user. * @summary Retrieve information from the bank accounts used for income verification * @param {CraBankIncomeGetRequest} craBankIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craBankIncomeGet(craBankIncomeGetRequest, options) { return exports.PlaidApiFp(this.configuration).craBankIncomeGet(craBankIncomeGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint allows you to retrieve the Base Report for your user, allowing you to receive comprehensive bank account and cash flow data. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn\'t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve a Base Report * @param {CraCheckReportBaseReportGetRequest} craCheckReportBaseReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options) { return exports.PlaidApiFp(this.configuration).craCheckReportBaseReportGet(craCheckReportBaseReportGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint allows you to retrieve the Cashflow Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the insights, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_cashflow_insights` product or have generated a report using `/cra/check_report/create`, we will generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. * @summary Retrieve cash flow insights from your user\'s banking data * @param {CraCheckReportCashflowInsightsGetRequest} craCheckReportCashflowInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options) { return exports.PlaidApiFp(this.configuration).craCheckReportCashflowInsightsGet(craCheckReportCashflowInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/cra/check_report/create` creates a Consumer Report powered by Plaid Check. You can call this endpoint to create a new report if `consumer_report_permissible_purpose` was omitted during Link token creation. If you did provide a `consumer_report_permissible_purpose` during Link token creation, then Plaid Check will automatically begin creating a Consumer Report once the user completes the Link process, and it is not necessary to call `/cra/check_report/create` before retrieving the report. `/cra/check_report/create` can also be used to refresh data in an existing report. A Consumer Report will last for 24 hours before expiring; you should call any `/get` endpoints on the report before it expires. If a report expires, you can call `/cra/check_report/create` again to re-generate it. Note that refreshing or regenerating a report is a billable event. * @summary Create a Consumer Report * @param {CraCheckReportCreateRequest} craCheckReportCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craCheckReportCreate(craCheckReportCreateRequest, options) { return exports.PlaidApiFp(this.configuration).craCheckReportCreate(craCheckReportCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint allows you to retrieve the Income Insights report for your user. You should call this endpoint after you\'ve received a `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. * @summary Retrieve cash flow information from your user\'s banks * @param {CraCheckReportIncomeInsightsGetRequest} craCheckReportIncomeInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest, options) { return exports.PlaidApiFp(this.configuration).craCheckReportIncomeInsightsGet(craCheckReportIncomeInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint allows you to retrieve the Network Insights product for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `cra_network_attributes` product or have generated a report using `/cra/check_report/create`, we will generate the attributes when you call this endpoint. * @summary Retrieve network attributes for the user * @param {CraCheckReportNetworkInsightsGetRequest} craCheckReportNetworkInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest, options) { return exports.PlaidApiFp(this.configuration).craCheckReportNetworkInsightsGet(craCheckReportNetworkInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint allows you to retrieve the Partner Insights report for your user. You should call this endpoint after you\'ve received the `CHECK_REPORT_READY` webhook, either after the Link session for the user or after calling `/cra/check_report/create`. If the most recent consumer report for the user doesn’t have sufficient data to generate the base report, or the consumer report has expired, you will receive an error indicating that you should create a new consumer report by calling `/cra/check_report/create`. If you did not initialize Link with the `credit_partner_insights` product or have generated a report using `/cra/check_report/create`, we will call our partners to generate the insights when you call this endpoint. In this case, you may optionally provide parameters under `options` to configure which insights you want to receive. * @summary Retrieve cash flow insights from partners * @param {CraCheckReportPartnerInsightsGetRequest} craCheckReportPartnerInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craCheckReportPartnerInsightsGet(craCheckReportPartnerInsightsGetRequest, options) { return exports.PlaidApiFp(this.configuration).craCheckReportPartnerInsightsGet(craCheckReportPartnerInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/cra/check_report/pdf/get` retrieves the most recent Consumer Report in PDF format. By default, the most recent Base Report (if it exists) for the user will be returned. To request that the most recent Income Insights report be included in the PDF as well, use the `add-ons` field. * @summary Retrieve Consumer Reports as a PDF * @param {CraCheckReportPDFGetRequest} craCheckReportPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craCheckReportPdfGet(craCheckReportPDFGetRequest, options) { return exports.PlaidApiFp(this.configuration).craCheckReportPdfGet(craCheckReportPDFGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/cra/loans/applications/register` registers loan applications and decisions. * @summary Register loan applications and decisions. * @param {CraLoansApplicationsRegisterRequest} craLoansApplicationsRegisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craLoansApplicationsRegister(craLoansApplicationsRegisterRequest, options) { return exports.PlaidApiFp(this.configuration).craLoansApplicationsRegister(craLoansApplicationsRegisterRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/cra/loans/register` registers a list of loans to their applicants. * @summary Register a list of loans to their applicants. * @param {CRALoansRegisterRequest} cRALoansRegisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craLoansRegister(cRALoansRegisterRequest, options) { return exports.PlaidApiFp(this.configuration).craLoansRegister(cRALoansRegisterRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/cra/loans/unregister` indicates the loans have reached a final status and no further updates are expected. * @summary Unregister a list of loans. * @param {CraLoansUnregisterRequest} craLoansUnregisterRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craLoansUnregister(craLoansUnregisterRequest, options) { return exports.PlaidApiFp(this.configuration).craLoansUnregister(craLoansUnregisterRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/cra/loans/update` updates loan information such as the status and payment history. * @summary Updates loan data. * @param {CraLoansUpdateRequest} craLoansUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craLoansUpdate(craLoansUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).craLoansUpdate(craLoansUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint allows you to retrieve a Monitoring Insights report by passing in the `user_token` referred to in the webhook you received. * @summary Retrieve a Monitoring Insights Report * @param {CraMonitoringInsightsGetRequest} craMonitoringInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craMonitoringInsightsGet(craMonitoringInsightsGetRequest, options) { return exports.PlaidApiFp(this.configuration).craMonitoringInsightsGet(craMonitoringInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint allows you to subscribe to insights for a user\'s linked CRA items, which are updated every day (best-effort). * @summary Subscribe to Monitoring Insights * @param {CraMonitoringInsightsSubscribeRequest} craMonitoringInsightsSubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craMonitoringInsightsSubscribe(craMonitoringInsightsSubscribeRequest, options) { return exports.PlaidApiFp(this.configuration).craMonitoringInsightsSubscribe(craMonitoringInsightsSubscribeRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint allows you to unsubscribe from previously subscribed Monitoring Insights. * @summary Unsubscribe from Monitoring Insights * @param {CraMonitoringInsightsUnsubscribeRequest} craMonitoringInsightsUnsubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craMonitoringInsightsUnsubscribe(craMonitoringInsightsUnsubscribeRequest, options) { return exports.PlaidApiFp(this.configuration).craMonitoringInsightsUnsubscribe(craMonitoringInsightsUnsubscribeRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/cra/partner_insights/get` returns cash flow insights for a specified user. * @summary Retrieve cash flow insights from the bank accounts used for income verification * @param {CraPartnerInsightsGetRequest} craPartnerInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ craPartnerInsightsGet(craPartnerInsightsGetRequest, options) { return exports.PlaidApiFp(this.configuration).craPartnerInsightsGet(craPartnerInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/payment_initiation/payment/token/create` endpoint has been deprecated. New Plaid customers will be unable to use this endpoint, and existing customers are encouraged to migrate to the newer, `link_token`-based flow. The recommended flow is to provide the `payment_id` to `/link/token/create`, which returns a `link_token` used to initialize Link. The `/payment_initiation/payment/token/create` is used to create a `payment_token`, which can then be used in Link initialization to enter a payment initiation flow. You can only use a `payment_token` once. If this attempt fails, the end user aborts the flow, or the token expires, you will need to create a new payment token. Creating a new payment token does not require end user input. * @summary Create payment token * @param {PaymentInitiationPaymentTokenCreateRequest} paymentInitiationPaymentTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ createPaymentToken(paymentInitiationPaymentTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).createPaymentToken(paymentInitiationPaymentTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `credit/asset_report/freddie_mac/get` endpoint retrieves the Asset Report in Freddie Mac\'s JSON format. * @summary Retrieve an Asset Report with Freddie Mac format. Only Freddie Mac can use this endpoint. * @param {{ [key: string]: object; }} requestBody * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditAssetReportFreddieMacGet(requestBody, options) { return exports.PlaidApiFp(this.configuration).creditAssetReportFreddieMacGet(requestBody, options).then((request) => request(this.axios, this.basePath)); } /** * Plaid can create an Audit Copy token of an Asset Report and/or Income Report to share with participating Government Sponsored Entity (GSE). If you participate in the Day 1 Certainty™ program, Plaid can supply an Audit Copy token directly to Fannie Mae on your behalf. An Audit Copy token contains the same underlying data as the Asset Report and/or Income Report (result of /credit/payroll_income/get). Use the `/credit/audit_copy_token/create` endpoint to create an `audit_copy_token` and then pass that token to the GSE who needs access. * @summary Create Asset or Income Report Audit Copy Token * @param {CreditAuditCopyTokenCreateRequest} creditAuditCopyTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditAuditCopyTokenCreate(creditAuditCopyTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).creditAuditCopyTokenCreate(creditAuditCopyTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/credit/audit_copy_token/update` endpoint updates an existing Audit Copy Token by adding the report tokens in the `report_tokens` field to the `audit_copy_token`. If the Audit Copy Token already contains a report of a certain type, it will be replaced with the token provided in the `report_tokens` field. * @summary Update an Audit Copy Token * @param {CreditAuditCopyTokenUpdateRequest} creditAuditCopyTokenUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditAuditCopyTokenUpdate(creditAuditCopyTokenUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).creditAuditCopyTokenUpdate(creditAuditCopyTokenUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/bank_employment/get` returns the employment report(s) derived from bank transaction data for a specified user. * @summary Retrieve information from the bank accounts used for employment verification * @param {CreditBankEmploymentGetRequest} creditBankEmploymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditBankEmploymentGet(creditBankEmploymentGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditBankEmploymentGet(creditBankEmploymentGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/bank_income/get` returns the bank income report(s) for a specified user. A single report corresponds to all institutions linked in a single Link session. To include multiple institutions in a single report, use [Multi-Item Link](https://plaid.com/docs/link/multi-item-link). To return older reports, use the `options.count` field. * @summary Retrieve information from the bank accounts used for income verification * @param {CreditBankIncomeGetRequest} creditBankIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditBankIncomeGet(creditBankIncomeGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditBankIncomeGet(creditBankIncomeGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/bank_income/pdf/get` returns the most recent bank income report for a specified user in PDF format. A single report corresponds to all institutions linked in a single Link session. To include multiple institutions in a single report, use [Multi-Item Link](https://plaid.com/docs/link/multi-item-link). * @summary Retrieve information from the bank accounts used for income verification in PDF format * @param {CreditBankIncomePDFGetRequest} creditBankIncomePDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditBankIncomePdfGet(creditBankIncomePDFGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditBankIncomePdfGet(creditBankIncomePDFGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/bank_income/refresh` refreshes the most recent bank income report data for a specific user. If the most recent bank income report is no longer valid (i.e. deleted), the endpoint will refresh the most recent valid report instead. * @summary Refresh a user\'s bank income information * @param {CreditBankIncomeRefreshRequest} creditBankIncomeRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditBankIncomeRefresh(creditBankIncomeRefreshRequest, options) { return exports.PlaidApiFp(this.configuration).creditBankIncomeRefresh(creditBankIncomeRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/bank_income/webhook/update` allows you to subscribe or unsubscribe a user for income webhook notifications. By default, all users start out unsubscribed. If a user is subscribed, on significant changes to the user\'s income profile, you will receive a `BANK_INCOME_REFRESH_UPDATE` webhook, prompting you to refresh bank income data for the user. * @summary Subscribe and unsubscribe to proactive notifications for a user\'s income profile * @param {CreditBankIncomeWebhookUpdateRequest} creditBankIncomeWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditBankIncomeWebhookUpdate(creditBankIncomeWebhookUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).creditBankIncomeWebhookUpdate(creditBankIncomeWebhookUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/bank_statements/uploads/get` returns parsed data from bank statements uploaded by users as part of the Document Income flow. If your account is not enabled for Document Parsing, contact your account manager to request access. * @summary Retrieve data for a user\'s uploaded bank statements * @param {CreditBankStatementsUploadsGetRequest} creditBankStatementsUploadsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditBankStatementsUploadsGet(creditBankStatementsUploadsGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditBankStatementsUploadsGet(creditBankStatementsUploadsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/employment/get` returns a list of items with employment information from a user\'s payroll provider that was verified by an end user. * @summary Retrieve a summary of an individual\'s employment information * @param {CreditEmploymentGetRequest} creditEmploymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditEmploymentGet(creditEmploymentGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditEmploymentGet(creditEmploymentGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `credit/asset_report/freddie_mac/get` endpoint retrieves the Verification of Assets and Verification of Employment reports. * @summary Retrieve an Asset Report with Freddie Mac format (aka VOA - Verification Of Assets), and a Verification Of Employment (VOE) report if this one is available. Only Freddie Mac can use this endpoint. * @param {CreditFreddieMacReportsGetRequest} creditFreddieMacReportsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditFreddieMacReportsGet(creditFreddieMacReportsGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditFreddieMacReportsGet(creditFreddieMacReportsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint gets payroll income information for a specific user, either as a result of the user connecting to their payroll provider or uploading a pay related document. * @summary Retrieve a user\'s payroll information * @param {CreditPayrollIncomeGetRequest} creditPayrollIncomeGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditPayrollIncomeGet(creditPayrollIncomeGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditPayrollIncomeGet(creditPayrollIncomeGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/payroll_income/parsing_config/update` updates the parsing configuration for a document income verification. * @summary Update the parsing configuration for a document income verification * @param {{ [key: string]: object; }} requestBody * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditPayrollIncomeParsingConfigUpdate(requestBody, options) { return exports.PlaidApiFp(this.configuration).creditPayrollIncomeParsingConfigUpdate(requestBody, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/payroll_income/precheck` is an optional endpoint that can be called before initializing a Link session for income verification. It evaluates whether a given user is supportable by digital income verification. If the user is eligible for digital verification, that information will be associated with the user token, and in this way will generate a Link UI optimized for the end user and their specific employer. If the user cannot be confirmed as eligible, the user can still use the income verification flow, but they may be required to manually upload a paystub to verify their income. While all request fields are optional, providing `employer` data will increase the chance of receiving a useful result. When testing in Sandbox, you can control the results by providing special test values in the `employer` and `access_tokens` fields. `employer_good` and `employer_bad` will result in `HIGH` and `LOW` confidence values, respectively. `employer_multi` will result in a `HIGH` confidence with multiple payroll options. Likewise, `access_good` and `access_bad` will result in `HIGH` and `LOW` confidence values, respectively. Any other value for `employer` and `access_tokens` in Sandbox will result in `UNKNOWN` confidence. * @summary Check income verification eligibility and optimize conversion * @param {CreditPayrollIncomePrecheckRequest} creditPayrollIncomePrecheckRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditPayrollIncomePrecheck(creditPayrollIncomePrecheckRequest, options) { return exports.PlaidApiFp(this.configuration).creditPayrollIncomePrecheck(creditPayrollIncomePrecheckRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/payroll_income/refresh` refreshes a given digital payroll income verification. * @summary Refresh a digital payroll income verification * @param {CreditPayrollIncomeRefreshRequest} creditPayrollIncomeRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditPayrollIncomeRefresh(creditPayrollIncomeRefreshRequest, options) { return exports.PlaidApiFp(this.configuration).creditPayrollIncomeRefresh(creditPayrollIncomeRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/payroll_income/risk_signals/get` can be used as part of the Document Income flow to assess a user-uploaded document for signs of potential fraud or tampering. It returns a risk score for each uploaded document that indicates the likelihood of the document being fraudulent, in addition to details on the individual risk signals contributing to the score. To trigger risk signal generation for an Item, call `/link/token/create` with `parsing_config` set to include `risk_signals`, or call `/credit/payroll_income/parsing_config/update`. Once risk signal generation has been triggered, `/credit/payroll_income/risk_signals/get` can be called at any time after the `INCOME_VERIFICATION_RISK_SIGNALS` webhook has been fired. `/credit/payroll_income/risk_signals/get` is offered as an add-on to Document Income and is billed separately. To request access to this endpoint, submit a product access request or contact your Plaid account manager. * @summary Retrieve fraud insights for a user\'s manually uploaded document(s). * @param {CreditPayrollIncomeRiskSignalsGetRequest} creditPayrollIncomeRiskSignalsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditPayrollIncomeRiskSignalsGet(creditPayrollIncomeRiskSignalsGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditPayrollIncomeRiskSignalsGet(creditPayrollIncomeRiskSignalsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Plaid can share an Asset Report directly with a participating third party on your behalf. The shared Asset Report is the exact same Asset Report originally created in `/asset_report/create`. To grant a third party access to an Asset Report, use the `/credit/relay/create` endpoint to create a `relay_token` and then pass that token to your third party. Each third party has its own `secondary_client_id`; for example, `ce5bd328dcd34123456`. You\'ll need to create a separate `relay_token` for each third party that needs access to the report on your behalf. * @summary Create a relay token to share an Asset Report with a partner client * @param {CreditRelayCreateRequest} creditRelayCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditRelayCreate(creditRelayCreateRequest, options) { return exports.PlaidApiFp(this.configuration).creditRelayCreate(creditRelayCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/relay/get` allows third parties to receive a report that was shared with them, using a `relay_token` that was created by the report owner. * @summary Retrieve the reports associated with a relay token that was shared with you * @param {CreditRelayGetRequest} creditRelayGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditRelayGet(creditRelayGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditRelayGet(creditRelayGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/credit/relay/pdf/get` allows third parties to receive a pdf report that was shared with them, using a `relay_token` that was created by the report owner. The `/credit/relay/pdf/get` endpoint retrieves the Asset Report in PDF format. Before calling `/credit/relay/pdf/get`, you must first create the Asset Report using `/credit/relay/create` and then wait for the [`PRODUCT_READY`](https://plaid.com/docs/api/products/assets/#product_ready) webhook to fire, indicating that the Report is ready to be retrieved. The response to `/credit/relay/pdf/get` is the PDF binary data. The `request_id` is returned in the `Plaid-Request-ID` header. [View a sample PDF Asset Report](https://plaid.com/documents/sample-asset-report.pdf). * @summary Retrieve the pdf reports associated with a relay token that was shared with you (beta) * @param {CreditRelayPDFGetRequest} creditRelayPDFGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditRelayPdfGet(creditRelayPDFGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditRelayPdfGet(creditRelayPDFGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/credit/relay/refresh` endpoint allows third parties to refresh a report that was relayed to them, using a `relay_token` that was created by the report owner. A new report will be created with the original report parameters, but with the most recent data available based on the `days_requested` value of the original report. * @summary Refresh a report of a relay token * @param {CreditRelayRefreshRequest} creditRelayRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditRelayRefresh(creditRelayRefreshRequest, options) { return exports.PlaidApiFp(this.configuration).creditRelayRefresh(creditRelayRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/credit/relay/remove` endpoint allows you to invalidate a `relay_token`. The third party holding the token will no longer be able to access or refresh the reports which the `relay_token` gives access to. The original report, associated Items, and other relay tokens that provide access to the same report are not affected and will remain accessible after removing the given `relay_token`. * @summary Remove relay token * @param {CreditRelayRemoveRequest} creditRelayRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditRelayRemove(creditRelayRemoveRequest, options) { return exports.PlaidApiFp(this.configuration).creditRelayRemove(creditRelayRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/credit/audit_copy_token/remove` endpoint allows you to remove an Audit Copy. Removing an Audit Copy invalidates the `audit_copy_token` associated with it, meaning both you and any third parties holding the token will no longer be able to use it to access Report data. Items associated with the Report data and other Audit Copies of it are not affected and will remain accessible after removing the given Audit Copy. * @summary Remove an Audit Copy token * @param {CreditAuditCopyTokenRemoveRequest} creditAuditCopyTokenRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditReportAuditCopyRemove(creditAuditCopyTokenRemoveRequest, options) { return exports.PlaidApiFp(this.configuration).creditReportAuditCopyRemove(creditAuditCopyTokenRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint can be used for your end users after they complete the Link flow. This endpoint returns a list of Link sessions that your user completed, where each session includes the results from the Link flow. These results include details about the Item that was created and some product related metadata (showing, for example, whether the user finished the bank income verification step). * @summary Retrieve Link sessions for your user * @param {CreditSessionsGetRequest} creditSessionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ creditSessionsGet(creditSessionsGetRequest, options) { return exports.PlaidApiFp(this.configuration).creditSessionsGet(creditSessionsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/dashboard_user/get` endpoint provides details (such as email address) about a specific Dashboard user based on the `dashboard_user_id` field, which is returned in the `audit_trail` object of certain Monitor and Beacon endpoints. This can be used to identify the specific reviewer who performed a Dashboard action. * @summary Retrieve a dashboard user * @param {DashboardUserGetRequest} dashboardUserGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ dashboardUserGet(dashboardUserGetRequest, options) { return exports.PlaidApiFp(this.configuration).dashboardUserGet(dashboardUserGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/dashboard_user/list` endpoint provides details (such as email address) all Dashboard users associated with your account. This can use used to audit or track the list of reviewers for Monitor, Beacon, and Identity Verification products. * @summary List dashboard users * @param {DashboardUserListRequest} dashboardUserListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ dashboardUserList(dashboardUserListRequest, options) { return exports.PlaidApiFp(this.configuration).dashboardUserList(dashboardUserListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint provides an alternative to `/deposit_switch/create` for customers who have not yet fully integrated with Plaid Exchange. Like `/deposit_switch/create`, it creates a deposit switch entity that will be persisted throughout the lifecycle of the switch. * @summary (Deprecated) Create a deposit switch without using Plaid Exchange * @param {DepositSwitchAltCreateRequest} depositSwitchAltCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ depositSwitchAltCreate(depositSwitchAltCreateRequest, options) { return exports.PlaidApiFp(this.configuration).depositSwitchAltCreate(depositSwitchAltCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint creates a deposit switch entity that will be persisted throughout the lifecycle of the switch. * @summary (Deprecated) Create a deposit switch * @param {DepositSwitchCreateRequest} depositSwitchCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ depositSwitchCreate(depositSwitchCreateRequest, options) { return exports.PlaidApiFp(this.configuration).depositSwitchCreate(depositSwitchCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint returns information related to how the user has configured their payroll allocation and the state of the switch. You can use this information to build logic related to the user\'s direct deposit allocation preferences. * @summary (Deprecated) Retrieve a deposit switch * @param {DepositSwitchGetRequest} depositSwitchGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ depositSwitchGet(depositSwitchGetRequest, options) { return exports.PlaidApiFp(this.configuration).depositSwitchGet(depositSwitchGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * In order for the end user to take action, you will need to create a public token representing the deposit switch. This token is used to initialize Link. It can be used one time and expires after 30 minutes. * @summary (Deprecated) Create a deposit switch token * @param {DepositSwitchTokenCreateRequest} depositSwitchTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ depositSwitchTokenCreate(depositSwitchTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).depositSwitchTokenCreate(depositSwitchTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/employers/search` allows you the ability to search Plaid’s database of known employers, for use with Deposit Switch. You can use this endpoint to look up a user\'s employer in order to confirm that they are supported. Users with non-supported employers can then be routed out of the Deposit Switch flow. The data in the employer database is currently limited. As the Deposit Switch and Income products progress through their respective beta periods, more employers are being regularly added. Because the employer database is frequently updated, we recommend that you do not cache or store data from this endpoint for more than a day. * @summary Search employer database * @param {EmployersSearchRequest} employersSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ employersSearch(employersSearchRequest, options) { return exports.PlaidApiFp(this.configuration).employersSearch(employersSearchRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/employment/verification/get` returns a list of employments through a user payroll that was verified by an end user. This endpoint has been deprecated; new integrations should use `/credit/employment/get` instead. * @summary (Deprecated) Retrieve a summary of an individual\'s employment information * @param {EmploymentVerificationGetRequest} employmentVerificationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ employmentVerificationGet(employmentVerificationGetRequest, options) { return exports.PlaidApiFp(this.configuration).employmentVerificationGet(employmentVerificationGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * A generic webhook receiver endpoint for FDX Event Notifications * @summary Webhook receiver for fdx notifications * @param {FDXNotification} fDXNotification * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ fdxNotifications(fDXNotification, options) { return exports.PlaidApiFp(this.configuration).fdxNotifications(fDXNotification, options).then((request) => request(this.axios, this.basePath)); } /** * Get a specific recipient * @summary Get Recipient * @param {string} recipientId Recipient Identifier. Uniquely identifies the recipient * @param {string} [oAUTHSTATEID] The value that is passed into the OAuth URI \'state\' query parameter. * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ getRecipient(recipientId, oAUTHSTATEID, options) { return exports.PlaidApiFp(this.configuration).getRecipient(recipientId, oAUTHSTATEID, options).then((request) => request(this.axios, this.basePath)); } /** * Returns a list of Recipients * @summary Get Recipients * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ getRecipients(options) { return exports.PlaidApiFp(this.configuration).getRecipients(options).then((request) => request(this.axios, this.basePath)); } /** * Use `/identity/documents/uploads/get` to retrieve identity details when using [Identity Document Upload](https://plaid.com/docs/identity/identity-document-upload/). * @summary Returns uploaded document identity * @param {IdentityDocumentsUploadsGetRequest} identityDocumentsUploadsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ identityDocumentsUploadsGet(identityDocumentsUploadsGetRequest, options) { return exports.PlaidApiFp(this.configuration).identityDocumentsUploadsGet(identityDocumentsUploadsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/identity/get` endpoint allows you to retrieve various account holder information on file with the financial institution, including names, emails, phone numbers, and addresses. Only name data is guaranteed to be returned; other fields will be empty arrays if not provided by the institution. Note: In API versions 2018-05-22 and earlier, the `owners` object is not returned, and instead identity information is returned in the top level `identity` object. For more details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2019-05-29). * @summary Retrieve identity data * @param {IdentityGetRequest} identityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ identityGet(identityGetRequest, options) { return exports.PlaidApiFp(this.configuration).identityGet(identityGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. * @summary Retrieve identity match score * @param {IdentityMatchRequest} identityMatchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ identityMatch(identityMatchRequest, options) { return exports.PlaidApiFp(this.configuration).identityMatch(identityMatchRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/identity/refresh` is an optional endpoint for users of the Identity product. It initiates an on-demand extraction to fetch the most up to date Identity information from the Financial Institution. This on-demand extraction takes place in addition to the periodic extractions that automatically occur for any Identity-enabled Item. If changes to Identity are discovered after calling `/identity/refresh`, Plaid will fire a webhook [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/identity/#default_update). As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/identity/refresh` is offered as an add-on to Identity and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh identity data * @param {IdentityRefreshRequest} identityRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ identityRefresh(identityRefreshRequest, options) { return exports.PlaidApiFp(this.configuration).identityRefresh(identityRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Try to autofill an Identity Verification based of the provided phone number, date of birth and country of residence. * @summary Create autofill for an Identity Verification * @param {IdentityVerificationAutofillCreateRequest} identityVerificationAutofillCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options) { return exports.PlaidApiFp(this.configuration).identityVerificationAutofillCreate(identityVerificationAutofillCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Create a new Identity Verification for the user specified by the `client_user_id` field. The requirements and behavior of the verification are determined by the `template_id` provided. If you don\'t know whether the associated user already has an active Identity Verification, you can specify `\"is_idempotent\": true` in the request body. With idempotency enabled, a new Identity Verification will only be created if one does not already exist for the associated `client_user_id` and `template_id`. If an Identity Verification is found, it will be returned unmodified with an `200 OK` HTTP status code. You can also use this endpoint to supply information you already have collected about the user; if any of these fields are specified, the screens prompting the user to enter them will be skipped during the Link flow. * @summary Create a new Identity Verification * @param {IdentityVerificationCreateRequest} identityVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ identityVerificationCreate(identityVerificationCreateRequest, options) { return exports.PlaidApiFp(this.configuration).identityVerificationCreate(identityVerificationCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Retrieve a previously created Identity Verification. * @summary Retrieve Identity Verification * @param {IdentityVerificationGetRequest} identityVerificationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ identityVerificationGet(identityVerificationGetRequest, options) { return exports.PlaidApiFp(this.configuration).identityVerificationGet(identityVerificationGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Filter and list Identity Verifications created by your account * @summary List Identity Verifications * @param {IdentityVerificationListRequest} identityVerificationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ identityVerificationList(identityVerificationListRequest, options) { return exports.PlaidApiFp(this.configuration).identityVerificationList(identityVerificationListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Allow a customer to retry their Identity Verification * @summary Retry an Identity Verification * @param {IdentityVerificationRetryRequest} identityVerificationRetryRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ identityVerificationRetry(identityVerificationRetryRequest, options) { return exports.PlaidApiFp(this.configuration).identityVerificationRetry(identityVerificationRetryRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/income/verification/create` begins the income verification process by returning an `income_verification_id`. You can then provide the `income_verification_id` to `/link/token/create` under the `income_verification` parameter in order to create a Link instance that will prompt the user to go through the income verification flow. Plaid will fire an `INCOME` webhook once the user completes the Payroll Income flow, or when the uploaded documents in the Document Income flow have finished processing. * @summary (Deprecated) Create an income verification instance * @param {IncomeVerificationCreateRequest} incomeVerificationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ incomeVerificationCreate(incomeVerificationCreateRequest, options) { return exports.PlaidApiFp(this.configuration).incomeVerificationCreate(incomeVerificationCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/income/verification/documents/download` provides the ability to download the source documents associated with the verification. If Document Income was used, the documents will be those the user provided in Link. For Payroll Income, the most recent files available for download from the payroll provider will be available from this endpoint. The response to `/income/verification/documents/download` is a ZIP file in binary data. If a `document_id` is passed, a single document will be contained in this file. If not, the response will contain all documents associated with the verification. The `request_id` is returned in the `Plaid-Request-ID` header. * @summary (Deprecated) Download the original documents used for income verification * @param {IncomeVerificationDocumentsDownloadRequest} incomeVerificationDocumentsDownloadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ incomeVerificationDocumentsDownload(incomeVerificationDocumentsDownloadRequest, options) { return exports.PlaidApiFp(this.configuration).incomeVerificationDocumentsDownload(incomeVerificationDocumentsDownloadRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/income/verification/paystubs/get` returns the information collected from the paystubs that were used to verify an end user\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/get` instead. * @summary (Deprecated) Retrieve information from the paystubs used for income verification * @param {IncomeVerificationPaystubsGetRequest} incomeVerificationPaystubsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options) { return exports.PlaidApiFp(this.configuration).incomeVerificationPaystubsGet(incomeVerificationPaystubsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/income/verification/precheck` is an optional endpoint that can be called before initializing a Link session for income verification. It evaluates whether a given user is supportable by digital income verification and returns a `precheck_id` that can be provided to `/link/token/create`. If the user is eligible for digital verification, providing the `precheck_id` in this way will generate a Link UI optimized for the end user and their specific employer. If the user cannot be confirmed as eligible, the `precheck_id` can still be provided to `/link/token/create` and the user can still use the income verification flow, but they may be required to manually upload a paystub to verify their income. While all request fields are optional, providing either `employer` or `transactions_access_tokens` data will increase the chance of receiving a useful result. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/precheck` instead. * @summary (Deprecated) Check digital income verification eligibility and optimize conversion * @param {IncomeVerificationPrecheckRequest} incomeVerificationPrecheckRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options) { return exports.PlaidApiFp(this.configuration).incomeVerificationPrecheck(incomeVerificationPrecheckRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/income/verification/taxforms/get` returns the information collected from forms that were used to verify an end user\'\'s income. It can be called once the status of the verification has been set to `VERIFICATION_STATUS_PROCESSING_COMPLETE`, as reported by the `INCOME: verification_status` webhook. Attempting to call the endpoint before verification has been completed will result in an error. This endpoint has been deprecated; new integrations should use `/credit/payroll_income/get` instead. * @summary (Deprecated) Retrieve information from the tax documents used for income verification * @param {IncomeVerificationTaxformsGetRequest} incomeVerificationTaxformsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ incomeVerificationTaxformsGet(incomeVerificationTaxformsGetRequest, options) { return exports.PlaidApiFp(this.configuration).incomeVerificationTaxformsGet(incomeVerificationTaxformsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Returns a JSON response containing details on all financial institutions currently supported by Plaid. Because Plaid supports thousands of institutions, results are paginated. If there is no overlap between an institution’s enabled products and a client’s enabled products, then the institution will be filtered out from the response. As a result, the number of institutions returned may not match the count specified in the call. * @summary Get details of all supported institutions * @param {InstitutionsGetRequest} institutionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ institutionsGet(institutionsGetRequest, options) { return exports.PlaidApiFp(this.configuration).institutionsGet(institutionsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Returns a JSON response containing details on a specified financial institution currently supported by Plaid. Versioning note: API versions 2019-05-29 and earlier allow use of the `public_key` parameter instead of the `client_id` and `secret` to authenticate to this endpoint. The `public_key` has been deprecated; all customers are encouraged to use `client_id` and `secret` instead. * @summary Get details of an institution * @param {InstitutionsGetByIdRequest} institutionsGetByIdRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ institutionsGetById(institutionsGetByIdRequest, options) { return exports.PlaidApiFp(this.configuration).institutionsGetById(institutionsGetByIdRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Returns a JSON response containing details for institutions that match the query parameters, up to a maximum of ten institutions per query. Versioning note: API versions 2019-05-29 and earlier allow use of the `public_key` parameter instead of the `client_id` and `secret` parameters to authenticate to this endpoint. The `public_key` parameter has since been deprecated; all customers are encouraged to use `client_id` and `secret` instead. * @summary Search institutions * @param {InstitutionsSearchRequest} institutionsSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ institutionsSearch(institutionsSearchRequest, options) { return exports.PlaidApiFp(this.configuration).institutionsSearch(institutionsSearchRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/investments/auth/get` endpoint allows developers to receive user-authorized data to facilitate the transfer of holdings * @summary Get data needed to authorize an investments transfer * @param {InvestmentsAuthGetRequest} investmentsAuthGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ investmentsAuthGet(investmentsAuthGetRequest, options) { return exports.PlaidApiFp(this.configuration).investmentsAuthGet(investmentsAuthGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/investments/holdings/get` endpoint allows developers to receive user-authorized stock position data for `investment`-type accounts. * @summary Get Investment holdings * @param {InvestmentsHoldingsGetRequest} investmentsHoldingsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ investmentsHoldingsGet(investmentsHoldingsGetRequest, options) { return exports.PlaidApiFp(this.configuration).investmentsHoldingsGet(investmentsHoldingsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/investments/refresh` is an optional endpoint for users of the Investments product. It initiates an on-demand extraction to fetch the newest investment holdings and transactions for an Item. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Investments-enabled Item. If changes to investments are discovered after calling `/investments/refresh`, Plaid will fire webhooks: [`HOLDINGS: DEFAULT_UPDATE`](https://plaid.com/docs/api/products/investments/#holdings-default_update) if any new holdings are detected, and [`INVESTMENTS_TRANSACTIONS: DEFAULT_UPDATE`](https://plaid.com/docs/api/products/investments/#investments_transactions-default_update) if any new investment transactions are detected. This webhook will typically not fire in the Sandbox environment, due to the lack of dynamic investment transactions and holdings data. To test this webhook in Sandbox, call `/sandbox/item/fire_webhook`. Updated holdings and investment transactions can be fetched by calling `/investments/holdings/get` and `/investments/transactions/get`. Note that the `/investments/refresh` endpoint is not supported by all institutions. If called on an Item from an institution that does not support this functionality, it will return a `PRODUCT_NOT_SUPPORTED` error. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/investments/refresh` is offered as an add-on to Investments and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh investment data * @param {InvestmentsRefreshRequest} investmentsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ investmentsRefresh(investmentsRefreshRequest, options) { return exports.PlaidApiFp(this.configuration).investmentsRefresh(investmentsRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/investments/transactions/get` endpoint allows developers to retrieve up to 24 months of user-authorized transaction data for investment accounts. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Due to the potentially large number of investment transactions associated with an Item, results are paginated. Manipulate the count and offset parameters in conjunction with the `total_investment_transactions` response body field to fetch all available investment transactions. Note that Investments does not have a webhook to indicate when initial transaction data has loaded (unless you use the `async_update` option). Instead, if transactions data is not ready when `/investments/transactions/get` is first called, Plaid will wait for the data. For this reason, calling `/investments/transactions/get` immediately after Link may take up to one to two minutes to return. Data returned by the asynchronous investments extraction flow (when `async_update` is set to true) may not be immediately available to `/investments/transactions/get`. To be alerted when the data is ready to be fetched, listen for the `HISTORICAL_UPDATE` webhook. If no investments history is ready when `/investments/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get investment transactions * @param {InvestmentsTransactionsGetRequest} investmentsTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ investmentsTransactionsGet(investmentsTransactionsGetRequest, options) { return exports.PlaidApiFp(this.configuration).investmentsTransactionsGet(investmentsTransactionsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Retrieve detailed information about a specific `Issue`. This endpoint returns a single `Issue` object. * @summary Get an Issue * @param {IssuesGetRequest} issuesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ issuesGet(issuesGetRequest, options) { return exports.PlaidApiFp(this.configuration).issuesGet(issuesGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Search for an issue associated with one of the following identifiers: `item_id`, `link_session_id` or Link session `request_id`. This endpoint returns a list of `Issue` objects, with an empty list indicating that no issues are associated with the provided identifier. At least one of the identifiers must be provided to perform the search. * @summary Search for an Issue * @param {IssuesSearchRequest} issuesSearchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ issuesSearch(issuesSearchRequest, options) { return exports.PlaidApiFp(this.configuration).issuesSearch(issuesSearchRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Allows a user to subscribe to updates on a specific `Issue` using a POST method. Subscribers will receive webhook notifications when the issue status changes, particularly when resolved. * @summary Subscribe to an Issue * @param {IssuesSubscribeRequest} issuesSubscribeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ issuesSubscribe(issuesSubscribeRequest, options) { return exports.PlaidApiFp(this.configuration).issuesSubscribe(issuesSubscribeRequest, options).then((request) => request(this.axios, this.basePath)); } /** * By default, the `access_token` associated with an Item does not expire and should be stored in a persistent, secure manner. You can use the `/item/access_token/invalidate` endpoint to rotate the `access_token` associated with an Item. The endpoint returns a new `access_token` and immediately invalidates the previous `access_token`. * @summary Invalidate access_token * @param {ItemAccessTokenInvalidateRequest} itemAccessTokenInvalidateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemAccessTokenInvalidate(itemAccessTokenInvalidateRequest, options) { return exports.PlaidApiFp(this.configuration).itemAccessTokenInvalidate(itemAccessTokenInvalidateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List a historical log of user consent events * @summary List a historical log of user consent events * @param {ItemActivityListRequest} itemActivityListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemActivityList(itemActivityListRequest, options) { return exports.PlaidApiFp(this.configuration).itemActivityList(itemActivityListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List a user’s connected applications * @summary List a user’s connected applications * @param {ItemApplicationListRequest} itemApplicationListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemApplicationList(itemApplicationListRequest, options) { return exports.PlaidApiFp(this.configuration).itemApplicationList(itemApplicationListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Enable consumers to update product access on selected accounts for an application. * @summary Update the scopes of access for a particular application * @param {ItemApplicationScopesUpdateRequest} itemApplicationScopesUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemApplicationScopesUpdate(itemApplicationScopesUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).itemApplicationScopesUpdate(itemApplicationScopesUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Unlink a user’s connected application. On an unlink request, Plaid will immediately revoke the Application’s access to the User’s data. The User will have to redo the OAuth authentication process in order to restore functionality. This endpoint only removes ongoing data access permissions, therefore the User will need to reach out to the Application itself in order to disable and delete their account and delete any data that the Application already received (if the Application does not do so by default). This endpoint should be called in real time as the User is unlinking an Application, and should not be batched in order to ensure that the change is reflected as soon as possible. * @summary Unlink a user’s connected application * @param {ItemApplicationUnlinkRequest} itemApplicationUnlinkRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemApplicationUnlink(itemApplicationUnlinkRequest, options) { return exports.PlaidApiFp(this.configuration).itemApplicationUnlink(itemApplicationUnlinkRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Note: As of July 2020, the `/item/public_token/create` endpoint is deprecated. Instead, use `/link/token/create` with an `access_token` to create a Link token for use with [update mode](https://plaid.com/docs/link/update-mode). If you need your user to take action to restore or resolve an error associated with an Item, generate a public token with the `/item/public_token/create` endpoint and then initialize Link with that `public_token`. A `public_token` is one-time use and expires after 30 minutes. You use a `public_token` to initialize Link in [update mode](https://plaid.com/docs/link/update-mode) for a particular Item. You can generate a `public_token` for an Item even if you did not use Link to create the Item originally. The `/item/public_token/create` endpoint is **not** used to create your initial `public_token`. If you have not already received an `access_token` for a specific Item, use Link to obtain your `public_token` instead. See the [Quickstart](https://plaid.com/docs/quickstart) for more information. * @summary Create public token * @param {ItemPublicTokenCreateRequest} itemPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemCreatePublicToken(itemPublicTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).itemCreatePublicToken(itemPublicTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Returns information about the status of an Item. * @summary Retrieve an Item * @param {ItemGetRequest} itemGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemGet(itemGetRequest, options) { return exports.PlaidApiFp(this.configuration).itemGet(itemGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/item/import` creates an Item via your Plaid Exchange Integration and returns an `access_token`. As part of an `/item/import` request, you will include a User ID (`user_auth.user_id`) and Authentication Token (`user_auth.auth_token`) that enable data aggregation through your Plaid Exchange API endpoints. These authentication principals are to be chosen by you. Upon creating an Item via `/item/import`, Plaid will automatically begin an extraction of that Item through the Plaid Exchange infrastructure you have already integrated. * @summary Import Item * @param {ItemImportRequest} itemImportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemImport(itemImportRequest, options) { return exports.PlaidApiFp(this.configuration).itemImport(itemImportRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Exchange a Link `public_token` for an API `access_token`. Link hands off the `public_token` client-side via the `onSuccess` callback once a user has successfully created an Item. The `public_token` is ephemeral and expires after 30 minutes. An `access_token` does not expire, but can be revoked by calling `/item/remove`. The response also includes an `item_id` that should be stored with the `access_token`. The `item_id` is used to identify an Item in a webhook. The `item_id` can also be retrieved by making an `/item/get` request. * @summary Exchange public token for an access token * @param {ItemPublicTokenExchangeRequest} itemPublicTokenExchangeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemPublicTokenExchange(itemPublicTokenExchangeRequest, options) { return exports.PlaidApiFp(this.configuration).itemPublicTokenExchange(itemPublicTokenExchangeRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/item/remove` endpoint allows you to remove an Item. Once removed, the `access_token`, as well as any processor tokens or bank account tokens associated with the Item, is no longer valid and cannot be used to access any data that was associated with the Item. Calling `/item/remove` is a recommended best practice when offboarding users or if a user chooses to disconnect an account linked via Plaid. For subscription products, such as Transactions, Liabilities, and Investments, calling `/item/remove` is required to end subscription billing for the Item. For money movement products such as Auth and Transfer, if the Item is at an institution that uses Tokenized Account Numbers (TANs), such as Chase or PNC, calling `/item/remove` will invalidate the TAN, and subsequent ACH transfer attempts using that TAN will be returned. In Limited Production, calling `/item/remove` does not impact the number of remaining Limited Production Items you have available. Removing an Item does not affect any Asset Reports or Audit Copies you have already created, which will remain accessible until you remove access to them specifically using the `/asset_report/remove` endpoint. Also note that for certain OAuth-based institutions, an Item removed via `/item/remove` may still show as an active connection in the institution\'s OAuth permission manager. API versions 2019-05-29 and earlier return a `removed` boolean as part of the response. * @summary Remove an Item * @param {ItemRemoveRequest} itemRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemRemove(itemRemoveRequest, options) { return exports.PlaidApiFp(this.configuration).itemRemove(itemRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The POST `/item/webhook/update` allows you to update the webhook URL associated with an Item. This request triggers a [`WEBHOOK_UPDATE_ACKNOWLEDGED`](https://plaid.com/docs/api/items/#webhook_update_acknowledged) webhook to the newly specified webhook URL. * @summary Update Webhook URL * @param {ItemWebhookUpdateRequest} itemWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ itemWebhookUpdate(itemWebhookUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).itemWebhookUpdate(itemWebhookUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/liabilities/get` endpoint returns various details about an Item with loan or credit accounts. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. To limit accounts listed in Link to types and subtypes supported by Liabilities, you can use the `account_filters` parameter when [creating a Link token](https://plaid.com/docs/api/link/#linktokencreate). The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/liabilities/get`. * @summary Retrieve Liabilities data * @param {LiabilitiesGetRequest} liabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ liabilitiesGet(liabilitiesGetRequest, options) { return exports.PlaidApiFp(this.configuration).liabilitiesGet(liabilitiesGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/link_delivery/create` endpoint to create a Hosted Link session. * @summary Create Hosted Link session * @param {LinkDeliveryCreateRequest} linkDeliveryCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ linkDeliveryCreate(linkDeliveryCreateRequest, options) { return exports.PlaidApiFp(this.configuration).linkDeliveryCreate(linkDeliveryCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/link_delivery/get` endpoint to get the status of a Hosted Link session. * @summary Get Hosted Link session * @param {LinkDeliveryGetRequest} linkDeliveryGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ linkDeliveryGet(linkDeliveryGetRequest, options) { return exports.PlaidApiFp(this.configuration).linkDeliveryGet(linkDeliveryGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Exchange an OAuth `link_correlation_id` for the corresponding `link_token`. The `link_correlation_id` is only available for \'payment_initiation\' products and is provided to the client via the OAuth `redirect_uri` as a query parameter. The `link_correlation_id` is ephemeral and expires in a brief period, after which it can no longer be exchanged for the \'link_token\'. * @summary Exchange the Link Correlation Id for a Link Token * @param {LinkOAuthCorrelationIdExchangeRequest} linkOAuthCorrelationIdExchangeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ linkOauthCorrelationIdExchange(linkOAuthCorrelationIdExchangeRequest, options) { return exports.PlaidApiFp(this.configuration).linkOauthCorrelationIdExchange(linkOAuthCorrelationIdExchangeRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/link/token/create` endpoint creates a `link_token`, which is required as a parameter when initializing Link. Once Link has been initialized, it returns a `public_token`. For most Plaid products, the `public_token` is saved and exchanged for an `access_token` via `/item/public_token/exchange` as part of the main Link flow. For more details, see the [Link flow overview](https://plaid.com/docs/link/#link-flow-overview). A `link_token` generated by `/link/token/create` is also used to initialize other Link flows, such as the [update mode](https://plaid.com/docs/link/update-mode) flow for tokens with expired credentials, or the Identity Verification flow. * @summary Create Link Token * @param {LinkTokenCreateRequest} linkTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ linkTokenCreate(linkTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).linkTokenCreate(linkTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/link/token/get` endpoint gets information about a Link session, including all callbacks fired during the session along with their metadata, including the public token. This endpoint is used with Link flows that don\'t provide a public token via frontend callbacks, such as the [Hosted Link flow](https://plaid.com/docs/link/hosted-link/) and the [Multi-Item Link flow](https://plaid.com/docs/link/multi-item-link/). It also can be useful for debugging purposes. * @summary Get Link Token * @param {LinkTokenGetRequest} linkTokenGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ linkTokenGet(linkTokenGetRequest, options) { return exports.PlaidApiFp(this.configuration).linkTokenGet(linkTokenGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint allows you to retrieve the Network Insights from a list of `access_tokens`. * @summary Retrieve network insights for the provided `access_tokens` * @param {NetworkInsightsReportGetRequest} networkInsightsReportGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ networkInsightsReportGet(networkInsightsReportGetRequest, options) { return exports.PlaidApiFp(this.configuration).networkInsightsReportGet(networkInsightsReportGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/network/status/get` endpoint can be used to check whether Plaid has a matching profile for the user. This is useful for determining if a user is eligible for a streamlined experience, such as Layer. Note: it is strongly recommended to check for Layer eligibility in the frontend. `/network/status/get` should only be used for checking Layer eligibility if a frontend check is not possible for your use case. For instructions on performing a frontend eligibility check, see the [Layer documentation](https://plaid.com/docs/layer/#integration-overview). * @summary Check a user\'s Plaid Network status * @param {NetworkStatusGetRequest} networkStatusGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ networkStatusGet(networkStatusGetRequest, options) { return exports.PlaidApiFp(this.configuration).networkStatusGet(networkStatusGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/partner/customer/create` endpoint is used by reseller partners to create end customers. To create end customers, it should be called in the Production environment only, even when creating Sandbox API keys. If called in the Sandbox environment, it will return a sample response, but no customer will be created and the API keys will not be valid. * @summary Creates a new end customer for a Plaid reseller. * @param {PartnerCustomerCreateRequest} partnerCustomerCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ partnerCustomerCreate(partnerCustomerCreateRequest, options) { return exports.PlaidApiFp(this.configuration).partnerCustomerCreate(partnerCustomerCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/partner/customer/enable` endpoint is used by reseller partners to enable an end customer in the full Production environment. * @summary Enables a Plaid reseller\'s end customer in the Production environment. * @param {PartnerCustomerEnableRequest} partnerCustomerEnableRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ partnerCustomerEnable(partnerCustomerEnableRequest, options) { return exports.PlaidApiFp(this.configuration).partnerCustomerEnable(partnerCustomerEnableRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/partner/customer/get` endpoint is used by reseller partners to retrieve data about a single end customer. * @summary Returns a Plaid reseller\'s end customer. * @param {PartnerCustomerGetRequest} partnerCustomerGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ partnerCustomerGet(partnerCustomerGetRequest, options) { return exports.PlaidApiFp(this.configuration).partnerCustomerGet(partnerCustomerGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/partner/customer/oauth_institutions/get` endpoint is used by reseller partners to retrieve OAuth-institution registration information about a single end customer. To learn how to set up a webhook to listen to status update events, visit the [reseller documentation](https://plaid.com/docs/account/resellers/#enabling-end-customers). * @summary Returns OAuth-institution registration information for a given end customer. * @param {PartnerCustomerOAuthInstitutionsGetRequest} partnerCustomerOAuthInstitutionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ partnerCustomerOauthInstitutionsGet(partnerCustomerOAuthInstitutionsGetRequest, options) { return exports.PlaidApiFp(this.configuration).partnerCustomerOauthInstitutionsGet(partnerCustomerOAuthInstitutionsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/partner/customer/remove` endpoint is used by reseller partners to remove an end customer. Removing an end customer will remove it from view in the Plaid Dashboard and deactivate its API keys. This endpoint can only be used to remove an end customer that has not yet been enabled in full Production. * @summary Removes a Plaid reseller\'s end customer. * @param {PartnerCustomerRemoveRequest} partnerCustomerRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ partnerCustomerRemove(partnerCustomerRemoveRequest, options) { return exports.PlaidApiFp(this.configuration).partnerCustomerRemove(partnerCustomerRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/payment_initiation/consent/create` endpoint is used to create a payment consent, which can be used to initiate payments on behalf of the user. Payment consents are created with `UNAUTHORISED` status by default and must be authorised by the user before payments can be initiated. Consents can be limited in time and scope, and have constraints that describe limitations for payments. * @summary Create payment consent * @param {PaymentInitiationConsentCreateRequest} paymentInitiationConsentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationConsentCreate(paymentInitiationConsentCreateRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationConsentCreate(paymentInitiationConsentCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/payment_initiation/consent/get` endpoint can be used to check the status of a payment consent, as well as to receive basic information such as recipient and constraints. * @summary Get payment consent * @param {PaymentInitiationConsentGetRequest} paymentInitiationConsentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationConsentGet(paymentInitiationConsentGetRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationConsentGet(paymentInitiationConsentGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/payment_initiation/consent/payment/execute` endpoint can be used to execute payments using payment consent. * @summary Execute a single payment using consent * @param {PaymentInitiationConsentPaymentExecuteRequest} paymentInitiationConsentPaymentExecuteRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationConsentPaymentExecute(paymentInitiationConsentPaymentExecuteRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationConsentPaymentExecute(paymentInitiationConsentPaymentExecuteRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/payment_initiation/consent/revoke` endpoint can be used to revoke the payment consent. Once the consent is revoked, it is not possible to initiate payments using it. * @summary Revoke payment consent * @param {PaymentInitiationConsentRevokeRequest} paymentInitiationConsentRevokeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationConsentRevoke(paymentInitiationConsentRevokeRequest, options).then((request) => request(this.axios, this.basePath)); } /** * After creating a payment recipient, you can use the `/payment_initiation/payment/create` endpoint to create a payment to that recipient. Payments can be one-time or standing order (recurring) and can be denominated in either EUR, GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency). If making domestic GBP-denominated payments, your recipient must have been created with BACS numbers. In general, EUR-denominated payments will be sent via SEPA Credit Transfer, GBP-denominated payments will be sent via the Faster Payments network and for non-Eurozone markets typically via the local payment scheme, but the payment network used will be determined by the institution. Payments sent via Faster Payments will typically arrive immediately, while payments sent via SEPA Credit Transfer or other local payment schemes will typically arrive in one business day. Standing orders (recurring payments) must be denominated in GBP and can only be sent to recipients in the UK. Once created, standing order payments cannot be modified or canceled via the API. An end user can cancel or modify a standing order directly on their banking application or website, or by contacting the bank. Standing orders will follow the payment rules of the underlying rails (Faster Payments in UK). Payments can be sent Monday to Friday, excluding bank holidays. If the pre-arranged date falls on a weekend or bank holiday, the payment is made on the next working day. It is not possible to guarantee the exact time the payment will reach the recipient’s account, although at least 90% of standing order payments are sent by 6am. In Limited Production, payments must be below 5 GBP or other chosen [currency](https://plaid.com/docs/api/products/payment-initiation/#payment_initiation-payment-create-request-amount-currency), and standing orders, variable recurring payments, and Virtual Accounts are not supported. * @summary Create a payment * @param {PaymentInitiationPaymentCreateRequest} paymentInitiationPaymentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationPaymentCreate(paymentInitiationPaymentCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/payment_initiation/payment/get` endpoint can be used to check the status of a payment, as well as to receive basic information such as recipient and payment amount. In the case of standing orders, the `/payment_initiation/payment/get` endpoint will provide information about the status of the overall standing order itself; the API cannot be used to retrieve payment status for individual payments within a standing order. * @summary Get payment details * @param {PaymentInitiationPaymentGetRequest} paymentInitiationPaymentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationPaymentGet(paymentInitiationPaymentGetRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationPaymentGet(paymentInitiationPaymentGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/payment_initiation/payment/list` endpoint can be used to retrieve all created payments. By default, the 10 most recent payments are returned. You can request more payments and paginate through the results using the optional `count` and `cursor` parameters. * @summary List payments * @param {PaymentInitiationPaymentListRequest} paymentInitiationPaymentListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationPaymentList(paymentInitiationPaymentListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Reverse a settled payment from a Plaid virtual account. The original payment must be in a settled state to be refunded. To refund partially, specify the amount as part of the request. If the amount is not specified, the refund amount will be equal to all of the remaining payment amount that has not been refunded yet. The refund will go back to the source account that initiated the payment. The original payment must have been initiated to a Plaid virtual account so that this account can be used to initiate the refund. Providing counterparty information such as date of birth and address increases the likelihood of refund being successful without human intervention. * @summary Reverse an existing payment * @param {PaymentInitiationPaymentReverseRequest} paymentInitiationPaymentReverseRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationPaymentReverse(paymentInitiationPaymentReverseRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Create a payment recipient for payment initiation. The recipient must be in Europe, within a country that is a member of the Single Euro Payment Area (SEPA) or a non-Eurozone country [supported](https://plaid.com/global) by Plaid. For a standing order (recurring) payment, the recipient must be in the UK. It is recommended to use `bacs` in the UK and `iban` in EU. The endpoint is idempotent: if a developer has already made a request with the same payment details, Plaid will return the same `recipient_id`. * @summary Create payment recipient * @param {PaymentInitiationRecipientCreateRequest} paymentInitiationRecipientCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationRecipientCreate(paymentInitiationRecipientCreateRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationRecipientCreate(paymentInitiationRecipientCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Get details about a payment recipient you have previously created. * @summary Get payment recipient * @param {PaymentInitiationRecipientGetRequest} paymentInitiationRecipientGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationRecipientGet(paymentInitiationRecipientGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/payment_initiation/recipient/list` endpoint list the payment recipients that you have previously created. * @summary List payment recipients * @param {PaymentInitiationRecipientListRequest} paymentInitiationRecipientListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentInitiationRecipientList(paymentInitiationRecipientListRequest, options) { return exports.PlaidApiFp(this.configuration).paymentInitiationRecipientList(paymentInitiationRecipientListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use `/payment_profile/create` endpoint to create a new payment profile. To initiate the account linking experience, call `/link/token/create` and provide the `payment_profile_token` in the `transfer.payment_profile_token` field. You can then use the `payment_profile_token` when creating transfers using `/transfer/authorization/create` and `/transfer/create`. * @summary Create payment profile * @param {PaymentProfileCreateRequest} paymentProfileCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentProfileCreate(paymentProfileCreateRequest, options) { return exports.PlaidApiFp(this.configuration).paymentProfileCreate(paymentProfileCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use `/payment_profile/get` endpoint to get the status of a given Payment Profile. * @summary Get payment profile * @param {PaymentProfileGetRequest} paymentProfileGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentProfileGet(paymentProfileGetRequest, options) { return exports.PlaidApiFp(this.configuration).paymentProfileGet(paymentProfileGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/payment_profile/remove` endpoint to remove a given Payment Profile. Once it’s removed, it can no longer be used to create transfers. * @summary Remove payment profile * @param {PaymentProfileRemoveRequest} paymentProfileRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ paymentProfileRemove(paymentProfileRemoveRequest, options) { return exports.PlaidApiFp(this.configuration).paymentProfileRemove(paymentProfileRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint returns the account associated with a given processor token. This endpoint retrieves cached information, rather than extracting fresh information from the institution. As a result, the account balance returned may not be up-to-date; for realtime balance information, use `/processor/balance/get` instead. Note that some information is nullable. * @summary Retrieve the account associated with a processor token * @param {ProcessorAccountGetRequest} processorAccountGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorAccountGet(processorAccountGetRequest, options) { return exports.PlaidApiFp(this.configuration).processorAccountGet(processorAccountGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Used to create a token suitable for sending to Apex to enable Plaid-Apex integrations. * @summary Create Apex bank account token * @param {ProcessorApexProcessorTokenCreateRequest} processorApexProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorApexProcessorTokenCreate(processorApexProcessorTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).processorApexProcessorTokenCreate(processorApexProcessorTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/processor/auth/get` endpoint returns the bank account and bank identification number (such as the routing number, for US accounts), for a checking, savings, or cash management account that\'\'s associated with a given `processor_token`. The endpoint also returns high-level account data and balances when available. Versioning note: API versions 2019-05-29 and earlier use a different schema for the `numbers` object returned by this endpoint. For details, see [Plaid API versioning](https://plaid.com/docs/api/versioning/#version-2020-09-14). * @summary Retrieve Auth data * @param {ProcessorAuthGetRequest} processorAuthGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorAuthGet(processorAuthGetRequest, options) { return exports.PlaidApiFp(this.configuration).processorAuthGet(processorAuthGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/processor/balance/get` endpoint returns the real-time balance for each of an Item\'s accounts. While other endpoints may return a balance object, only `/processor/balance/get` forces the available and current balance fields to be refreshed rather than cached. * @summary Retrieve Balance data * @param {ProcessorBalanceGetRequest} processorBalanceGetRequest The `/processor/balance/get` endpoint returns the real-time balance for the account associated with a given `processor_token`. The current balance is the total amount of funds in the account. The available balance is the current balance less any outstanding holds or debits that have not yet posted to the account. Note that not all institutions calculate the available balance. In the event that available balance is unavailable from the institution, Plaid will return an available balance value of `null`. * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorBalanceGet(processorBalanceGetRequest, options) { return exports.PlaidApiFp(this.configuration).processorBalanceGet(processorBalanceGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/processor/bank_transfer/create` endpoint to initiate a new bank transfer as a processor * @summary Create a bank transfer as a processor * @param {ProcessorBankTransferCreateRequest} processorBankTransferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorBankTransferCreate(processorBankTransferCreateRequest, options) { return exports.PlaidApiFp(this.configuration).processorBankTransferCreate(processorBankTransferCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/processor/identity/get` endpoint allows you to retrieve various account holder information on file with the financial institution, including names, emails, phone numbers, and addresses. * @summary Retrieve Identity data * @param {ProcessorIdentityGetRequest} processorIdentityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorIdentityGet(processorIdentityGetRequest, options) { return exports.PlaidApiFp(this.configuration).processorIdentityGet(processorIdentityGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/processor/identity/match` endpoint generates a match score, which indicates how well the provided identity data matches the identity information on file with the account holder\'s financial institution. Fields within the `balances` object will always be null when retrieved by `/identity/match`. Instead, use the free `/accounts/get` endpoint to request balance cached data, or `/accounts/balance/get` for real-time data. * @summary Retrieve identity match score * @param {ProcessorIdentityMatchRequest} processorIdentityMatchRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorIdentityMatch(processorIdentityMatchRequest, options) { return exports.PlaidApiFp(this.configuration).processorIdentityMatch(processorIdentityMatchRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint returns the stock position data of the account associated with a given processor token. * @summary Retrieve Investment Holdings * @param {ProcessorInvestmentsHoldingsGetRequest} processorInvestmentsHoldingsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorInvestmentsHoldingsGet(processorInvestmentsHoldingsGetRequest, options) { return exports.PlaidApiFp(this.configuration).processorInvestmentsHoldingsGet(processorInvestmentsHoldingsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/processor/investments/transactions/get` endpoint allows developers to retrieve up to 24 months of user-authorized transaction data for the investment account associated with the processor token. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Due to the potentially large number of investment transactions associated with the account, results are paginated. Manipulate the count and offset parameters in conjunction with the `total_investment_transactions` response body field to fetch all available investment transactions. Note that Investments does not have a webhook to indicate when initial transaction data has loaded (unless you use the `async_update` option). Instead, if transactions data is not ready when `/processor/investments/transactions/get` is first called, Plaid will wait for the data. For this reason, calling `/processor/investments/transactions/get` immediately after Link may take up to one to two minutes to return. Data returned by the asynchronous investments extraction flow (when `async_update` is set to true) may not be immediately available to `/processor/investments/transactions/get`. To be alerted when the data is ready to be fetched, listen for the `HISTORICAL_UPDATE` webhook. If no investments history is ready when `/processor/investments/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Investments Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get investment transactions data * @param {ProcessorInvestmentsTransactionsGetRequest} processorInvestmentsTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorInvestmentsTransactionsGet(processorInvestmentsTransactionsGetRequest, options) { return exports.PlaidApiFp(this.configuration).processorInvestmentsTransactionsGet(processorInvestmentsTransactionsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/processor/liabilities/get` endpoint returns various details about a loan or credit account. Liabilities data is available primarily for US financial institutions, with some limited coverage of Canadian institutions. Currently supported account types are account type `credit` with account subtype `credit card` or `paypal`, and account type `loan` with account subtype `student` or `mortgage`. The types of information returned by Liabilities can include balances and due dates, loan terms, and account details such as original loan amount and guarantor. Data is refreshed approximately once per day; the latest data can be retrieved by calling `/processor/liabilities/get`. Note: This request may take some time to complete if `liabilities` was not specified as an initial product when creating the processor token. This is because Plaid must communicate directly with the institution to retrieve the additional data. * @summary Retrieve Liabilities data * @param {ProcessorLiabilitiesGetRequest} processorLiabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorLiabilitiesGet(processorLiabilitiesGetRequest, options) { return exports.PlaidApiFp(this.configuration).processorLiabilitiesGet(processorLiabilitiesGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * After calling `/processor/signal/evaluate`, call `/processor/signal/decision/report` to report whether the transaction was initiated. If you are using the [Plaid Transfer product](https://www.plaid.com/docs/transfer) to create transfers, it is not necessary to use this endpoint, as Plaid already knows whether the transfer was initiated. * @summary Report whether you initiated an ACH transaction * @param {ProcessorSignalDecisionReportRequest} processorSignalDecisionReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorSignalDecisionReport(processorSignalDecisionReportRequest, options) { return exports.PlaidApiFp(this.configuration).processorSignalDecisionReport(processorSignalDecisionReportRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use `/processor/signal/evaluate` to evaluate a planned ACH transaction as a processor to get a return risk assessment (such as a risk score and risk tier) and additional risk signals. In order to obtain a valid score for an ACH transaction, Plaid must have an access token for the account, and the Item must be healthy (receiving product updates) or have recently been in a healthy state. If the transaction does not meet eligibility requirements, an error will be returned corresponding to the underlying cause. If `/processor/signal/evaluate` is called on the same transaction multiple times within a 24-hour period, cached results may be returned. For more information please refer to our error documentation on [item errors](/docs/errors/item/) and [Link in Update Mode](/docs/link/update-mode/). Note: This request may take some time to complete if Signal is being added to an existing Item. This is because Plaid must communicate directly with the institution when retrieving the data for the first time. To reduce this latency, you can call `/signal/prepare` on the Item before you need to request Signal data. * @summary Evaluate a planned ACH transaction * @param {ProcessorSignalEvaluateRequest} processorSignalEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorSignalEvaluate(processorSignalEvaluateRequest, options) { return exports.PlaidApiFp(this.configuration).processorSignalEvaluate(processorSignalEvaluateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * When a processor token is not initialized with Signal, call `/processor/signal/prepare` to opt-in that processor token to the Signal data collection process, which will improve the accuracy of the Signal score. If this endpoint is called with a processor token that is already initialized with Signal, it will return a 200 response and will not modify the processor token. * @summary Opt-in a processor token to Signal * @param {ProcessorSignalPrepareRequest} processorSignalPrepareRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorSignalPrepare(processorSignalPrepareRequest, options) { return exports.PlaidApiFp(this.configuration).processorSignalPrepare(processorSignalPrepareRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Call the `/processor/signal/return/report` endpoint to report a returned transaction that was previously sent to the `/processor/signal/evaluate` endpoint. Your feedback will be used by the model to incorporate the latest risk trend in your portfolio. If you are using the [Plaid Transfer product](https://www.plaid.com/docs/transfer) to create transfers, it is not necessary to use this endpoint, as Plaid already knows whether the transfer was returned. * @summary Report a return for an ACH transaction * @param {ProcessorSignalReturnReportRequest} processorSignalReturnReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorSignalReturnReport(processorSignalReturnReportRequest, options) { return exports.PlaidApiFp(this.configuration).processorSignalReturnReport(processorSignalReturnReportRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Used to create a token suitable for sending to Stripe to enable Plaid-Stripe integrations. For a detailed guide on integrating Stripe, see [Add Stripe to your app](https://plaid.com/docs/auth/partnerships/stripe/). Note that the Stripe bank account token is a one-time use token. To store bank account information for later use, you can use a Stripe customer object and create an associated bank account from the token, or you can use a Stripe Custom account and create an associated external bank account from the token. This bank account information should work indefinitely, unless the user\'s bank account information changes or they revoke Plaid\'s permissions to access their account. Stripe bank account information cannot be modified once the bank account token has been created. If you ever need to change the bank account details used by Stripe for a specific customer, have the user go through Link again and create a new bank account token from the new `access_token`. To revoke a bank account token, the entire underlying access token must be revoked using `/item/remove`. * @summary Create Stripe bank account token * @param {ProcessorStripeBankAccountTokenCreateRequest} processorStripeBankAccountTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorStripeBankAccountTokenCreate(processorStripeBankAccountTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).processorStripeBankAccountTokenCreate(processorStripeBankAccountTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Used to create a token suitable for sending to one of Plaid\'s partners to enable integrations. Note that Stripe partnerships use bank account tokens instead; see `/processor/stripe/bank_account_token/create` for creating tokens for use with Stripe integrations. If using multiple processors, multiple different processor tokens can be created for a single access token. Once created, a processor token for a given Item cannot be modified or updated. To revoke the processor\'s access, the entire Item must be deleted by calling `/item/remove`. * @summary Create processor token * @param {ProcessorTokenCreateRequest} processorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorTokenCreate(processorTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).processorTokenCreate(processorTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Used to get a processor token\'s product permissions. The `products` field will be an empty list if the processor can access all available products. * @summary Get a processor token\'s product permissions * @param {ProcessorTokenPermissionsGetRequest} processorTokenPermissionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorTokenPermissionsGet(processorTokenPermissionsGetRequest, options) { return exports.PlaidApiFp(this.configuration).processorTokenPermissionsGet(processorTokenPermissionsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Used to control a processor\'s access to products on the given processor token. By default, a processor will have access to all available products on the corresponding item. To restrict access to a particular set of products, call this endpoint with the desired products. To restore access to all available products, call this endpoint with an empty list. This endpoint can be called multiple times as your needs and your processor\'s needs change. * @summary Control a processor\'s access to products * @param {ProcessorTokenPermissionsSetRequest} processorTokenPermissionsSetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorTokenPermissionsSet(processorTokenPermissionsSetRequest, options) { return exports.PlaidApiFp(this.configuration).processorTokenPermissionsSet(processorTokenPermissionsSetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint allows you, the processor, to update the webhook URL associated with a processor token. This request triggers a `WEBHOOK_UPDATE_ACKNOWLEDGED` webhook to the newly specified webhook URL. * @summary Update a processor token\'s webhook URL * @param {ProcessorTokenWebhookUpdateRequest} processorTokenWebhookUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).processorTokenWebhookUpdate(processorTokenWebhookUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/processor/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/processor/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with a processor token, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/processor/transactions/get` will be the data available for the processor token as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To force Plaid to check for new transactions, you can use the `/processor/transactions/refresh` endpoint. Note that data may not be immediately available to `/processor/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/processor/transactions/get`, if it wasn\'t. If no transaction history is ready when `/processor/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get transaction data * @param {ProcessorTransactionsGetRequest} processorTransactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorTransactionsGet(processorTransactionsGetRequest, options) { return exports.PlaidApiFp(this.configuration).processorTransactionsGet(processorTransactionsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/processor/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user’s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on a processor token that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/processor/transactions/get` or `/processor/transactions/sync`). Once all historical transactions have been fetched, call `/processor/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/processor/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/processor/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/processor/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Fetch recurring transaction streams * @param {ProcessorTransactionsRecurringGetRequest} processorTransactionsRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest, options) { return exports.PlaidApiFp(this.configuration).processorTransactionsRecurringGet(processorTransactionsRecurringGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/processor/transactions/refresh` is an optional endpoint for users of the Transactions product. It initiates an on-demand extraction to fetch the newest transactions for a processor token. This on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled processor token. If changes to transactions are discovered after calling `/processor/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/processor/transactions/sync` and `/processor/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/processor/transactions/get` or `/processor/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/processor/transactions/refresh` is offered as an add-on to Transactions and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {ProcessorTransactionsRefreshRequest} processorTransactionsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorTransactionsRefresh(processorTransactionsRefreshRequest, options) { return exports.PlaidApiFp(this.configuration).processorTransactionsRefresh(processorTransactionsRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/processor/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/processor/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/processor/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/processor/transactions/sync` fails when retrieving a paginated update (e.g due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/processor/transactions/sync` was called within a few seconds of Item creation, `/processor/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/processor/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. To receive Transactions webhooks for a processor token, set its webhook URL via the [`/processor/token/webhook/update`](https://plaid.com/docs/api/processor-partners/#processortokenwebhookupdate) endpoint. * @summary Get incremental transaction updates on a processor token * @param {ProcessorTransactionsSyncRequest} processorTransactionsSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ processorTransactionsSync(processorTransactionsSyncRequest, options) { return exports.PlaidApiFp(this.configuration).processorTransactionsSync(processorTransactionsSyncRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/profile/network_status/get` endpoint can be used to check whether Plaid has a matching profile for the user. * @summary Check a user\'s Plaid Network status * @param {ProfileNetworkStatusGetRequest} profileNetworkStatusGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ profileNetworkStatusGet(profileNetworkStatusGetRequest, options) { return exports.PlaidApiFp(this.configuration).profileNetworkStatusGet(profileNetworkStatusGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/bank_income/fire_webhook` endpoint to manually trigger a Bank Income webhook in the Sandbox environment. * @summary Manually fire a bank income webhook in sandbox * @param {SandboxBankIncomeFireWebhookRequest} sandboxBankIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxBankIncomeFireWebhook(sandboxBankIncomeFireWebhookRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxBankIncomeFireWebhook(sandboxBankIncomeFireWebhookRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/bank_transfer/fire_webhook` endpoint to manually trigger a Bank Transfers webhook in the Sandbox environment. * @summary Manually fire a Bank Transfer webhook * @param {SandboxBankTransferFireWebhookRequest} sandboxBankTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxBankTransferFireWebhook(sandboxBankTransferFireWebhookRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxBankTransferFireWebhook(sandboxBankTransferFireWebhookRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/bank_transfer/simulate` endpoint to simulate a bank transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/bank_transfer/event/sync` or `/bank_transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a bank transfer event in Sandbox * @param {SandboxBankTransferSimulateRequest} sandboxBankTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxBankTransferSimulate(sandboxBankTransferSimulateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxBankTransferSimulate(sandboxBankTransferSimulateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/cra/cashflow_updates/update` endpoint to manually trigger an update for cashflow updates (Monitoring) in the Sandbox environment. * @summary Trigger an update for Cashflow Updates * @param {SandboxCraCashflowUpdatesUpdateRequest} sandboxCraCashflowUpdatesUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxCraCashflowUpdatesUpdate(sandboxCraCashflowUpdatesUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/income/fire_webhook` endpoint to manually trigger a Payroll or Document Income webhook in the Sandbox environment. * @summary Manually fire an Income webhook * @param {SandboxIncomeFireWebhookRequest} sandboxIncomeFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxIncomeFireWebhook(sandboxIncomeFireWebhookRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxIncomeFireWebhook(sandboxIncomeFireWebhookRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/sandbox/item/fire_webhook` endpoint is used to test that code correctly handles webhooks. This endpoint can trigger the following webhooks: `DEFAULT_UPDATE`: Webhook to be fired for a given Sandbox Item simulating a default update event for the respective product as specified with the `webhook_type` in the request body. Valid Sandbox `DEFAULT_UPDATE` webhook types include: `AUTH`, `IDENTITY`, `TRANSACTIONS`, `INVESTMENTS_TRANSACTIONS`, `LIABILITIES`, `HOLDINGS`. If the Item does not support the product, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `NEW_ACCOUNTS_AVAILABLE`: Fired to indicate that a new account is available on the Item and you can launch update mode to request access to it. `SMS_MICRODEPOSITS_VERIFICATION`: Fired when a given same day micro-deposit item is verified via SMS verification. `LOGIN_REPAIRED`: Fired when an Item recovers from the `ITEM_LOGIN_REQUIRED` without the user going through update mode in your app. `PENDING_DISCONNECT`: Fired when an Item will stop working in the near future (e.g. due to a planned bank migration) and must be sent through update mode to continue working. `RECURRING_TRANSACTIONS_UPDATE`: Recurring Transactions webhook to be fired for a given Sandbox Item. If the Item does not support Recurring Transactions, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `SYNC_UPDATES_AVAILABLE`: Transactions webhook to be fired for a given Sandbox Item. If the Item does not support Transactions, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `PRODUCT_READY`: Assets webhook to be fired when a given asset report has been successfully generated. If the Item does not support Assets, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `ERROR`: Assets webhook to be fired when asset report generation has failed. If the Item does not support Assets, a `SANDBOX_PRODUCT_NOT_ENABLED` error will result. `USER_PERMISSION_REVOKED`: Indicates an end user has revoked the permission that they previously granted to access an Item. May not always fire upon revocation, as some institutions’ consent portals do not trigger this webhook. Upon receiving this webhook, it is recommended to delete any stored data from Plaid associated with the account or Item. `USER_ACCOUNT_REVOKED`: Fired when an end user has revoked access to their account on the Data Provider\'s portal. This webhook is currently sent only for Chase and PNC Items, but may be sent in the future for other financial institutions. Upon receiving this webhook, it is recommended to delete any stored data from Plaid associated with the account or Item. Note that this endpoint is provided for developer ease-of-use and is not required for testing webhooks; webhooks will also fire in Sandbox under the same conditions that they would in Production (except for webhooks of type `TRANSFER`). * @summary Fire a test webhook * @param {SandboxItemFireWebhookRequest} sandboxItemFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxItemFireWebhook(sandboxItemFireWebhookRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxItemFireWebhook(sandboxItemFireWebhookRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/sandbox/item/reset_login/` forces an Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/item/reset_login`, You can then use Plaid Link update mode to restore the Item to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force a Sandbox Item into an error state * @param {SandboxItemResetLoginRequest} sandboxItemResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxItemResetLogin(sandboxItemResetLoginRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxItemResetLogin(sandboxItemResetLoginRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/sandbox/item/set_verification_status` endpoint can be used to change the verification status of an Item in in the Sandbox in order to simulate the Automated Micro-deposit flow. For more information on testing Automated Micro-deposits in Sandbox, see [Auth full coverage testing](https://plaid.com/docs/auth/coverage/testing#). * @summary Set verification status for Sandbox account * @param {SandboxItemSetVerificationStatusRequest} sandboxItemSetVerificationStatusRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxItemSetVerificationStatus(sandboxItemSetVerificationStatusRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxItemSetVerificationStatus(sandboxItemSetVerificationStatusRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Save the selected accounts when connecting to the Platypus Oauth institution * @summary Save the selected accounts when connecting to the Platypus Oauth institution * @param {SandboxOauthSelectAccountsRequest} sandboxOauthSelectAccountsRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxOauthSelectAccounts(sandboxOauthSelectAccountsRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxOauthSelectAccounts(sandboxOauthSelectAccountsRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/sandbox/payment_profile/reset_login/` forces a Payment Profile into a state where the login is no longer valid. This makes it easy to test update mode for Payment Profile in the Sandbox environment. After calling `/sandbox/payment_profile/reset_login`, calls to the `/transfer/authorization/create` with the Payment Profile will result in a `decision_rationale` `PAYMENT_PROFILE_LOGIN_REQUIRED`. You can then use update mode for Payment Profile to restore it into a good state. In order to invoke this endpoint, you must first [create a Payment Profile](https://plaid.com/docs/transfer/add-to-app/#create-a-payment-profile-optional) and [go through the Link flow](https://plaid.com/docs/transfer/add-to-app/#create-a-link-token). * @summary Reset the login of a Payment Profile * @param {SandboxPaymentProfileResetLoginRequest} sandboxPaymentProfileResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxPaymentProfileResetLogin(sandboxPaymentProfileResetLoginRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxPaymentProfileResetLogin(sandboxPaymentProfileResetLoginRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/payment/simulate` endpoint to simulate various payment events in the Sandbox environment. This endpoint will trigger the corresponding payment status webhook. * @summary Simulate a payment event in Sandbox * @param {SandboxPaymentSimulateRequest} sandboxPaymentSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxPaymentSimulate(sandboxPaymentSimulateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxPaymentSimulate(sandboxPaymentSimulateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/processor_token/create` endpoint to create a valid `processor_token` for an arbitrary institution ID and test credentials. The created `processor_token` corresponds to a new Sandbox Item. You can then use this `processor_token` with the `/processor/` API endpoints in Sandbox. You can also use `/sandbox/processor_token/create` with the [`user_custom` test username](https://plaid.com/docs/sandbox/user-custom) to generate a test account with custom data. * @summary Create a test Item and processor token * @param {SandboxProcessorTokenCreateRequest} sandboxProcessorTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxProcessorTokenCreate(sandboxProcessorTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxProcessorTokenCreate(sandboxProcessorTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/public_token/create` endpoint to create a valid `public_token` for an arbitrary institution ID, initial products, and test credentials. The created `public_token` maps to a new Sandbox Item. You can then call `/item/public_token/exchange` to exchange the `public_token` for an `access_token` and perform all API actions. `/sandbox/public_token/create` can also be used with the [`user_custom` test username](https://plaid.com/docs/sandbox/user-custom) to generate a test account with custom data, or with Plaid\'s [pre-populated Sandbox test accounts](https://plaid.com/docs/sandbox/test-credentials/). * @summary Create a test Item * @param {SandboxPublicTokenCreateRequest} sandboxPublicTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxPublicTokenCreate(sandboxPublicTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxPublicTokenCreate(sandboxPublicTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/fire_webhook` endpoint to manually trigger a `TRANSFER_EVENTS_UPDATE` webhook in the Sandbox environment. * @summary Manually fire a Transfer webhook * @param {SandboxTransferFireWebhookRequest} sandboxTransferFireWebhookRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferFireWebhook(sandboxTransferFireWebhookRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferFireWebhook(sandboxTransferFireWebhookRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/ledger/deposit/simulate` endpoint to simulate a ledger deposit event in the Sandbox environment. * @summary Simulate a ledger deposit event in Sandbox * @param {SandboxTransferLedgerDepositSimulateRequest} sandboxTransferLedgerDepositSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferLedgerDepositSimulate(sandboxTransferLedgerDepositSimulateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferLedgerDepositSimulate(sandboxTransferLedgerDepositSimulateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/ledger/simulate_available` endpoint to simulate converting pending balance to available balance for all originators in the Sandbox environment. * @summary Simulate converting pending balance to available balance * @param {SandboxTransferLedgerSimulateAvailableRequest} sandboxTransferLedgerSimulateAvailableRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferLedgerSimulateAvailable(sandboxTransferLedgerSimulateAvailableRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferLedgerSimulateAvailable(sandboxTransferLedgerSimulateAvailableRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/ledger/withdraw/simulate` endpoint to simulate a ledger withdraw event in the Sandbox environment. * @summary Simulate a ledger withdraw event in Sandbox * @param {SandboxTransferLedgerWithdrawSimulateRequest} sandboxTransferLedgerWithdrawSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferLedgerWithdrawSimulate(sandboxTransferLedgerWithdrawSimulateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferLedgerWithdrawSimulate(sandboxTransferLedgerWithdrawSimulateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/refund/simulate` endpoint to simulate a refund event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/transfer/event/sync` or `/transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a refund event in Sandbox * @param {SandboxTransferRefundSimulateRequest} sandboxTransferRefundSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferRefundSimulate(sandboxTransferRefundSimulateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/repayment/simulate` endpoint to trigger the creation of a repayment. As a side effect of calling this route, a repayment is created that includes all unreimbursed returns of guaranteed transfers. If there are no such returns, an 400 error is returned. * @summary Trigger the creation of a repayment * @param {SandboxTransferRepaymentSimulateRequest} sandboxTransferRepaymentSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferRepaymentSimulate(sandboxTransferRepaymentSimulateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferRepaymentSimulate(sandboxTransferRepaymentSimulateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/simulate` endpoint to simulate a transfer event in the Sandbox environment. Note that while an event will be simulated and will appear when using endpoints such as `/transfer/event/sync` or `/transfer/event/list`, no transactions will actually take place and funds will not move between accounts, even within the Sandbox. * @summary Simulate a transfer event in Sandbox * @param {SandboxTransferSimulateRequest} sandboxTransferSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferSimulate(sandboxTransferSimulateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferSimulate(sandboxTransferSimulateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/sweep/simulate` endpoint to create a sweep and associated events in the Sandbox environment. Upon calling this endpoint, all transfers with a sweep status of `swept` will become `swept_settled`, all `posted` or `pending` transfers with a sweep status of `unswept` will become `swept`, and all `returned` transfers with a sweep status of `swept` will become `return_swept`. * @summary Simulate creating a sweep * @param {SandboxTransferSweepSimulateRequest} sandboxTransferSweepSimulateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferSweepSimulate(sandboxTransferSweepSimulateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferSweepSimulate(sandboxTransferSweepSimulateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/test_clock/advance` endpoint to advance a `test_clock` in the Sandbox environment. A test clock object represents an independent timeline and has a `virtual_time` field indicating the current timestamp of the timeline. A test clock can be advanced by incrementing `virtual_time`, but may never go back to a lower `virtual_time`. If a test clock is advanced, we will simulate the changes that ought to occur during the time that elapsed. For example, a client creates a weekly recurring transfer with a test clock set at t. When the client advances the test clock by setting `virtual_time` = t + 15 days, 2 new originations should be created, along with the webhook events. The advancement of the test clock from its current `virtual_time` should be limited such that there are no more than 20 originations resulting from the advance operation on each `recurring_transfer` associated with the `test_clock`. For example, if the recurring transfer associated with this test clock originates once every 4 weeks, you can advance the `virtual_time` up to 80 weeks on each API call. * @summary Advance a test clock * @param {SandboxTransferTestClockAdvanceRequest} sandboxTransferTestClockAdvanceRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferTestClockAdvance(sandboxTransferTestClockAdvanceRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferTestClockAdvance(sandboxTransferTestClockAdvanceRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/test_clock/create` endpoint to create a `test_clock` in the Sandbox environment. A test clock object represents an independent timeline and has a `virtual_time` field indicating the current timestamp of the timeline. Test clocks are used for testing recurring transfers in Sandbox. A test clock can be associated with up to 5 recurring transfers. * @summary Create a test clock * @param {SandboxTransferTestClockCreateRequest} sandboxTransferTestClockCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferTestClockCreate(sandboxTransferTestClockCreateRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferTestClockCreate(sandboxTransferTestClockCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/test_clock/get` endpoint to get a `test_clock` in the Sandbox environment. * @summary Get a test clock * @param {SandboxTransferTestClockGetRequest} sandboxTransferTestClockGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferTestClockGet(sandboxTransferTestClockGetRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferTestClockGet(sandboxTransferTestClockGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/sandbox/transfer/test_clock/list` endpoint to see a list of all your test clocks in the Sandbox environment, by ascending `virtual_time`. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired test clocks. * @summary List test clocks * @param {SandboxTransferTestClockListRequest} sandboxTransferTestClockListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxTransferTestClockList(sandboxTransferTestClockListRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxTransferTestClockList(sandboxTransferTestClockListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/sandbox/user/reset_login/` functions the same as `/sandbox/item/reset_login`, but will modify Items related to a User. This endpoint forces each Item into an `ITEM_LOGIN_REQUIRED` state in order to simulate an Item whose login is no longer valid. This makes it easy to test Link\'s [update mode](https://plaid.com/docs/link/update-mode) flow in the Sandbox environment. After calling `/sandbox/user/reset_login`, You can then use Plaid Link update mode to restore Items associated with the User to a good state. An `ITEM_LOGIN_REQUIRED` webhook will also be fired after a call to this endpoint, if one is associated with the Item. In the Sandbox, Items will transition to an `ITEM_LOGIN_REQUIRED` error state automatically after 30 days, even if this endpoint is not called. * @summary Force item(s) for a Sandbox User into an error state * @param {SandboxUserResetLoginRequest} sandboxUserResetLoginRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ sandboxUserResetLogin(sandboxUserResetLoginRequest, options) { return exports.PlaidApiFp(this.configuration).sandboxUserResetLogin(sandboxUserResetLoginRequest, options).then((request) => request(this.axios, this.basePath)); } /** * After calling `/signal/evaluate`, call `/signal/decision/report` to report whether the transaction was initiated. * @summary Report whether you initiated an ACH transaction * @param {SignalDecisionReportRequest} signalDecisionReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ signalDecisionReport(signalDecisionReportRequest, options) { return exports.PlaidApiFp(this.configuration).signalDecisionReport(signalDecisionReportRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use `/signal/evaluate` to evaluate a planned ACH transaction to get a return risk assessment (such as a risk score and risk tier) and additional risk signals. In order to obtain a valid score for an ACH transaction, Plaid must have an access token for the account, and the Item must be healthy (receiving product updates) or have recently been in a healthy state. If the transaction does not meet eligibility requirements, an error will be returned corresponding to the underlying cause. If `/signal/evaluate` is called on the same transaction multiple times within a 24-hour period, cached results may be returned. For more information please refer to the error documentation on [Item errors](/docs/errors/item/) and [Link in Update Mode](/docs/link/update-mode/). Note: This request may take some time to complete if Signal is being added to an existing Item. This is because Plaid must communicate directly with the institution when retrieving the data for the first time. * @summary Evaluate a planned ACH transaction * @param {SignalEvaluateRequest} signalEvaluateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ signalEvaluate(signalEvaluateRequest, options) { return exports.PlaidApiFp(this.configuration).signalEvaluate(signalEvaluateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * When an Item is not initialized with Signal, call `/signal/prepare` to opt-in that Item to the Signal data collection process, developing a Signal score. This should be done on Items where Signal was added in the `additional_consented_products` array but not in the `products`, `optional_products`, or `required_if_supported_products` array. If `/signal/prepare` is skipped on an Item that is not initialized with Signal, the initial call to `/signal/evaluate` on that Item will be less accurate, because Signal will have access to less data for computing the Signal score. If run on an Item that is already initialized with Signal, this endpoint will return a 200 response and will not modify the Item. * @summary Opt-in an Item to Signal * @param {SignalPrepareRequest} signalPrepareRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ signalPrepare(signalPrepareRequest, options) { return exports.PlaidApiFp(this.configuration).signalPrepare(signalPrepareRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Call the `/signal/return/report` endpoint to report a returned transaction that was previously sent to the `/signal/evaluate` endpoint. Your feedback will be used by the model to incorporate the latest risk trend in your portfolio. * @summary Report a return for an ACH transaction * @param {SignalReturnReportRequest} signalReturnReportRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ signalReturnReport(signalReturnReportRequest, options) { return exports.PlaidApiFp(this.configuration).signalReturnReport(signalReturnReportRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use `/signal/schedule` to schedule a planned ACH transaction. * @summary Schedule a planned ACH transaction * @param {SignalScheduleRequest} signalScheduleRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ signalSchedule(signalScheduleRequest, options) { return exports.PlaidApiFp(this.configuration).signalSchedule(signalScheduleRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/statements/download` endpoint retrieves a single statement PDF in binary format. The response will contain a `Plaid-Content-Hash` header containing a SHA 256 checksum of the statement. This can be used to verify that the file being sent by Plaid is the same file that was downloaded to your system. * @summary Retrieve a single statement. * @param {StatementsDownloadRequest} statementsDownloadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ statementsDownload(statementsDownloadRequest, options) { return exports.PlaidApiFp(this.configuration).statementsDownload(statementsDownloadRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/statements/list` endpoint retrieves a list of all statements associated with an item. * @summary Retrieve a list of all statements associated with an item. * @param {StatementsListRequest} statementsListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ statementsList(statementsListRequest, options) { return exports.PlaidApiFp(this.configuration).statementsList(statementsListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/statements/refresh` initiates an on-demand extraction to fetch the statements for the provided dates. * @summary Refresh statements data. * @param {StatementsRefreshRequest} statementsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ statementsRefresh(statementsRefreshRequest, options) { return exports.PlaidApiFp(this.configuration).statementsRefresh(statementsRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/beta/transactions/v1/enhance` endpoint enriches raw transaction data provided directly by clients. The product is currently in beta. * @summary enhance locally-held transaction data * @param {TransactionsEnhanceGetRequest} transactionsEnhanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transactionsEnhance(transactionsEnhanceGetRequest, options) { return exports.PlaidApiFp(this.configuration).transactionsEnhance(transactionsEnhanceGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transactions/enrich` endpoint enriches raw transaction data generated by your own banking products or retrieved from other non-Plaid sources. * @summary Enrich locally-held transaction data * @param {TransactionsEnrichRequest} transactionsEnrichRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transactionsEnrich(transactionsEnrichRequest, options) { return exports.PlaidApiFp(this.configuration).transactionsEnrich(transactionsEnrichRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Note: All new implementations are encouraged to use `/transactions/sync` rather than `/transactions/get`. `/transactions/sync` provides the same functionality as `/transactions/get` and improves developer ease-of-use for handling transactions updates. The `/transactions/get` endpoint allows developers to receive user-authorized transaction data for credit, depository, and some loan-type accounts (only those with account subtype `student`; coverage may be limited). For transaction history from investments accounts, use the [Investments endpoint](https://plaid.com/docs/api/products/investments/) instead. Transaction data is standardized across financial institutions, and in many cases transactions are linked to a clean name, entity type, location, and category. Similarly, account data is standardized and returned with a clean name, number, balance, and other meta information where available. Transactions are returned in reverse-chronological order, and the sequence of transaction ordering is stable and will not shift. Transactions are not immutable and can also be removed altogether by the institution; a removed transaction will no longer appear in `/transactions/get`. For more details, see [Pending and posted transactions](https://plaid.com/docs/transactions/transactions-data/#pending-and-posted-transactions). Due to the potentially large number of transactions associated with an Item, results are paginated. Manipulate the `count` and `offset` parameters in conjunction with the `total_transactions` response body field to fetch all available transactions. Data returned by `/transactions/get` will be the data available for the Item as of the most recent successful check for new transactions. Plaid typically checks for new data multiple times a day, but these checks may occur less frequently, such as once a day, depending on the institution. To find out when the Item was last updated, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, you can use the `/transactions/refresh` endpoint. Note that data may not be immediately available to `/transactions/get`. Plaid will begin to prepare transactions data upon Item link, if Link was initialized with `transactions`, or upon the first call to `/transactions/get`, if it wasn\'t. To be alerted when transaction data is ready to be fetched, listen for the [`INITIAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#initial_update) and [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhooks. If no transaction history is ready when `/transactions/get` is called, it will return a `PRODUCT_NOT_READY` error. * @summary Get transaction data * @param {TransactionsGetRequest} transactionsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transactionsGet(transactionsGetRequest, options) { return exports.PlaidApiFp(this.configuration).transactionsGet(transactionsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transactions/recurring/get` endpoint allows developers to receive a summary of the recurring outflow and inflow streams (expenses and deposits) from a user’s checking, savings or credit card accounts. Additionally, Plaid provides key insights about each recurring stream including the category, merchant, last amount, and more. Developers can use these insights to build tools and experiences that help their users better manage cash flow, monitor subscriptions, reduce spend, and stay on track with bill payments. This endpoint is offered as an add-on to Transactions. To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. This endpoint can only be called on an Item that has already been initialized with Transactions (either during Link, by specifying it in `/link/token/create`; or after Link, by calling `/transactions/get` or `/transactions/sync`). When using Recurring Transactions, for best results, make sure to use the [`days_requested`](https://plaid.com/docs/api/link/#link-token-create-request-transactions-days-requested) parameter to request at least 180 days of history when initializing Items with Transactions. Once all historical transactions have been fetched, call `/transactions/recurring/get` to receive the Recurring Transactions streams and subscribe to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook. To know when historical transactions have been fetched, if you are using `/transactions/sync` listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#SyncUpdatesAvailableWebhook-historical-update-complete) webhook and check that the `historical_update_complete` field in the payload is `true`. If using `/transactions/get`, listen for the [`HISTORICAL_UPDATE`](https://plaid.com/docs/api/products/transactions/#historical_update) webhook. After the initial call, you can call `/transactions/recurring/get` endpoint at any point in the future to retrieve the latest summary of recurring streams. Listen to the [`RECURRING_TRANSACTIONS_UPDATE`](https://plaid.com/docs/api/products/transactions/#recurring_transactions_update) webhook to be notified when new updates are available. * @summary Fetch recurring transaction streams * @param {TransactionsRecurringGetRequest} transactionsRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transactionsRecurringGet(transactionsRecurringGetRequest, options) { return exports.PlaidApiFp(this.configuration).transactionsRecurringGet(transactionsRecurringGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/transactions/refresh` is an optional endpoint that initiates an on-demand extraction to fetch the newest transactions for an Item. The on-demand extraction takes place in addition to the periodic extractions that automatically occur one or more times per day for any Transactions-enabled Item. The Item must already have Transactions added as a product in order to call `/transactions/refresh`. If changes to transactions are discovered after calling `/transactions/refresh`, Plaid will fire a webhook: for `/transactions/sync` users, [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) will be fired if there are any transactions updated, added, or removed. For users of both `/transactions/sync` and `/transactions/get`, [`TRANSACTIONS_REMOVED`](https://plaid.com/docs/api/products/transactions/#transactions_removed) will be fired if any removed transactions are detected, and [`DEFAULT_UPDATE`](https://plaid.com/docs/api/products/transactions/#default_update) will be fired if any new transactions are detected. New transactions can be fetched by calling `/transactions/get` or `/transactions/sync`. Note that the `/transactions/refresh` endpoint is not supported for Capital One (`ins_128026`) non-depository accounts and will result in a `PRODUCTS_NOT_SUPPORTED` error if called on an Item that contains only non-depository accounts from that institution. As this endpoint triggers a synchronous request for fresh data, latency may be higher than for other Plaid endpoints (typically less than 10 seconds, but occasionally up to 30 seconds or more); if you encounter errors, you may find it necessary to adjust your timeout period when making requests. `/transactions/refresh` is offered as an optional add-on to Transactions and has a separate [fee model](/docs/account/billing/#per-request-flat-fee). To request access to this endpoint, submit a [product access request](https://dashboard.plaid.com/team/products) or contact your Plaid account manager. * @summary Refresh transaction data * @param {TransactionsRefreshRequest} transactionsRefreshRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transactionsRefresh(transactionsRefreshRequest, options) { return exports.PlaidApiFp(this.configuration).transactionsRefresh(transactionsRefreshRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transactions/rules/v1/create` endpoint creates transaction categorization rules. Rules will be applied on the Item\'s transactions returned in `/transactions/get` response. The product is currently in beta. To request access, contact transactions-feedback@plaid.com. * @summary Create transaction category rule * @param {TransactionsRulesCreateRequest} transactionsRulesCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transactionsRulesCreate(transactionsRulesCreateRequest, options) { return exports.PlaidApiFp(this.configuration).transactionsRulesCreate(transactionsRulesCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transactions/rules/v1/list` returns a list of transaction rules created for the Item associated with the access token. * @summary Return a list of rules created for the Item associated with the access token. * @param {TransactionsRulesListRequest} transactionsRulesListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transactionsRulesList(transactionsRulesListRequest, options) { return exports.PlaidApiFp(this.configuration).transactionsRulesList(transactionsRulesListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transactions/rules/v1/remove` endpoint is used to remove a transaction rule. * @summary Remove transaction rule * @param {TransactionsRulesRemoveRequest} transactionsRulesRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transactionsRulesRemove(transactionsRulesRemoveRequest, options) { return exports.PlaidApiFp(this.configuration).transactionsRulesRemove(transactionsRulesRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transactions/sync` endpoint retrieves transactions associated with an Item and can fetch updates using a cursor to track which updates have already been seen. For important instructions on integrating with `/transactions/sync`, see the [Transactions integration overview](https://plaid.com/docs/transactions/#integration-overview). If you are migrating from an existing integration using `/transactions/get`, see the [Transactions Sync migration guide](https://plaid.com/docs/transactions/sync-migration/). This endpoint supports `credit`, `depository`, and some `loan`-type accounts (only those with account subtype `student`). For `investments` accounts, use `/investments/transactions/get` instead. When retrieving paginated updates, track both the `next_cursor` from the latest response and the original cursor from the first call in which `has_more` was `true`; if a call to `/transactions/sync` fails when retrieving a paginated update (e.g due to the [`TRANSACTIONS_SYNC_MUTATION_DURING_PAGINATION`](https://plaid.com/docs/errors/transactions/#transactions_sync_mutation_during_pagination) error), the entire pagination request loop must be restarted beginning with the cursor for the first page of the update, rather than retrying only the single request that failed. If transactions data is not yet available for the Item, which can happen if the Item was not initialized with transactions during the `/link/token/create` call or if `/transactions/sync` was called within a few seconds of Item creation, `/transactions/sync` will return empty transactions arrays. Plaid typically checks for new transactions data between one and four times per day, depending on the institution. To find out when transactions were last updated for an Item, use the [Item Debugger](https://plaid.com/docs/account/activity/#troubleshooting-with-item-debugger) or call `/item/get`; the `item.status.transactions.last_successful_update` field will show the timestamp of the most recent successful update. To force Plaid to check for new transactions, use the `/transactions/refresh` endpoint. To be alerted when new transactions are available, listen for the [`SYNC_UPDATES_AVAILABLE`](https://plaid.com/docs/api/products/transactions/#sync_updates_available) webhook. * @summary Get incremental transaction updates on an Item * @param {TransactionsSyncRequest} transactionsSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transactionsSync(transactionsSyncRequest, options) { return exports.PlaidApiFp(this.configuration).transactionsSync(transactionsSyncRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/beta/transactions/user_insights/v1/get` gets user insights for clients who have enriched data with `/transactions/enrich`. The product is currently in beta. * @summary Obtain user insights based on transactions sent through /transactions/enrich * @param {TransactionsUserInsightsGetRequest} transactionsUserInsightsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transactionsUserInsightsGet(transactionsUserInsightsGetRequest, options) { return exports.PlaidApiFp(this.configuration).transactionsUserInsightsGet(transactionsUserInsightsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/authorization/cancel` endpoint to cancel a transfer authorization. A transfer authorization is eligible for cancellation if it has not yet been used to create a transfer. * @summary Cancel a transfer authorization * @param {TransferAuthorizationCancelRequest} transferAuthorizationCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferAuthorizationCancel(transferAuthorizationCancelRequest, options) { return exports.PlaidApiFp(this.configuration).transferAuthorizationCancel(transferAuthorizationCancelRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/authorization/create` endpoint to authorize a transfer. This endpoint must be called prior to calling `/transfer/create`. The transfer authorization will expire if not used after one hour. (You can contact your account manager to change the default authorization lifetime.) There are four possible outcomes to calling this endpoint: - If the `authorization.decision` in the response is `declined`, the proposed transfer has failed the risk check and you cannot proceed with the transfer. - If the `authorization.decision` is `user_action_required`, additional user input is needed, usually to fix a broken bank connection, before Plaid can properly assess the risk. You need to launch Link in update mode to complete the required user action. When calling `/link/token/create` to get a new Link token, instead of providing `access_token` in the request, you should set [`transfer.authorization_id`](https://plaid.com/docs/api/link/#link-token-create-request-transfer-authorization-id) as the `authorization.id`. After the Link flow is completed, you may re-attempt the authorization. - If the `authorization.decision` is `approved`, and the `authorization.rationale_code` is `null`, the transfer has passed the risk check and you can proceed to call `/transfer/create`. - If the `authorization.decision` is `approved` and the `authorization.rationale_code` is non-`null`, the risk check could not be run: you may proceed with the transfer, but should perform your own risk evaluation. For more details, see the response schema. In Plaid\'s Sandbox environment the decisions will be returned as follows: - To approve a transfer with `null` rationale code, make an authorization request with an `amount` less than the available balance in the account. - To approve a transfer with the rationale code `MANUALLY_VERIFIED_ITEM`, create an Item in Link through the [Same Day Micro-deposits flow](https://plaid.com/docs/auth/coverage/testing/#testing-same-day-micro-deposits). - To get an authorization decision of `user_action_required`, [reset the login for an Item](https://plaid.com/docs/sandbox/#item_login_required). - To decline a transfer with the rationale code `NSF`, the available balance on the account must be less than the authorization `amount`. See [Create Sandbox test data](https://plaid.com/docs/sandbox/user-custom/) for details on how to customize data in Sandbox. - To decline a transfer with the rationale code `RISK`, the available balance on the account must be exactly $0. See [Create Sandbox test data](https://plaid.com/docs/sandbox/user-custom/) for details on how to customize data in Sandbox. * @summary Create a transfer authorization * @param {TransferAuthorizationCreateRequest} transferAuthorizationCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferAuthorizationCreate(transferAuthorizationCreateRequest, options) { return exports.PlaidApiFp(this.configuration).transferAuthorizationCreate(transferAuthorizationCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * (Deprecated) Use the `/transfer/balance/get` endpoint to view a balance held with Plaid. * @summary (Deprecated) Retrieve a balance held with Plaid * @param {TransferBalanceGetRequest} transferBalanceGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferBalanceGet(transferBalanceGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferBalanceGet(transferBalanceGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/cancel` endpoint to cancel a transfer. A transfer is eligible for cancellation if the `cancellable` property returned by `/transfer/get` is `true`. * @summary Cancel a transfer * @param {TransferCancelRequest} transferCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferCancel(transferCancelRequest, options) { return exports.PlaidApiFp(this.configuration).transferCancel(transferCancelRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/capabilities/get` endpoint to determine the RTP eligibility information of an account to be used with Transfer. This endpoint works on all Transfer-capable Items, including those created by `/transfer/migrate_account`. To simulate RTP eligibility in Sandbox, log in using the username `user_good` and password `pass_good` and use the first two checking and savings accounts in the \"First Platypus Bank\" institution (ending in 0000 or 1111), which will return `true`. Any other account will return `false`. * @summary Get RTP eligibility information of a transfer * @param {TransferCapabilitiesGetRequest} transferCapabilitiesGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferCapabilitiesGet(transferCapabilitiesGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferCapabilitiesGet(transferCapabilitiesGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/configuration/get` endpoint to view your transfer product configurations. * @summary Get transfer product configuration * @param {TransferConfigurationGetRequest} transferConfigurationGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferConfigurationGet(transferConfigurationGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferConfigurationGet(transferConfigurationGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/create` endpoint to initiate a new transfer. This endpoint is retryable and idempotent; if a transfer with the provided `transfer_id` has already been created, it will return the transfer details without creating a new transfer. A transfer may still be created if a 500 error is returned; to detect this scenario, use [Transfer events](https://plaid.com/docs/transfer/reconciling-transfers/). * @summary Create a transfer * @param {TransferCreateRequest} transferCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferCreate(transferCreateRequest, options) { return exports.PlaidApiFp(this.configuration).transferCreate(transferCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Third-party sender customers can use `/transfer/diligence/document/upload` endpoint to upload a document on behalf of its end customer (i.e. originator) to Plaid. You’ll need to send a request of type multipart/form-data. You must provide the `client_id` in the `PLAID-CLIENT-ID` header and `secret` in the `PLAID-SECRET` header. * @summary Upload transfer diligence document on behalf of the originator * @param {TransferDiligenceDocumentUploadRequest} transferDiligenceDocumentUploadRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferDiligenceDocumentUpload(transferDiligenceDocumentUploadRequest, options) { return exports.PlaidApiFp(this.configuration).transferDiligenceDocumentUpload(transferDiligenceDocumentUploadRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/diligence/submit` endpoint to submit transfer diligence on behalf of the originator (i.e., the end customer). * @summary Submit transfer diligence on behalf of the originator * @param {TransferDiligenceSubmitRequest} transferDiligenceSubmitRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferDiligenceSubmit(transferDiligenceSubmitRequest, options) { return exports.PlaidApiFp(this.configuration).transferDiligenceSubmit(transferDiligenceSubmitRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/event/list` endpoint to get a list of transfer events based on specified filter criteria. * @summary List transfer events * @param {TransferEventListRequest} transferEventListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferEventList(transferEventListRequest, options) { return exports.PlaidApiFp(this.configuration).transferEventList(transferEventListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/transfer/event/sync` allows you to request up to the next 25 transfer events that happened after a specific `event_id`. Use the `/transfer/event/sync` endpoint to guarantee you have seen all transfer events. * @summary Sync transfer events * @param {TransferEventSyncRequest} transferEventSyncRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferEventSync(transferEventSyncRequest, options) { return exports.PlaidApiFp(this.configuration).transferEventSync(transferEventSyncRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/get` endpoint fetches information about the transfer corresponding to the given `transfer_id` or `authorization_id`. One of `transfer_id` or `authorization_id` must be populated but not both. * @summary Retrieve a transfer * @param {TransferGetRequest} transferGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferGet(transferGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferGet(transferGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/intent/create` endpoint to generate a transfer intent object and invoke the Transfer UI. * @summary Create a transfer intent object to invoke the Transfer UI * @param {TransferIntentCreateRequest} transferIntentCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferIntentCreate(transferIntentCreateRequest, options) { return exports.PlaidApiFp(this.configuration).transferIntentCreate(transferIntentCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/intent/get` endpoint to retrieve more information about a transfer intent. * @summary Retrieve more information about a transfer intent * @param {TransferIntentGetRequest} transferIntentGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferIntentGet(transferIntentGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferIntentGet(transferIntentGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/ledger/deposit` endpoint to deposit funds into Plaid Ledger. * @summary Deposit funds into a Plaid Ledger balance * @param {TransferLedgerDepositRequest} transferLedgerDepositRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferLedgerDeposit(transferLedgerDepositRequest, options) { return exports.PlaidApiFp(this.configuration).transferLedgerDeposit(transferLedgerDepositRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/ledger/distribute` endpoint to move available balance between the ledgers of the platform and one of its originators. * @summary Move available balance between the ledgers of the platform and one of its originators * @param {TransferLedgerDistributeRequest} transferLedgerDistributeRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferLedgerDistribute(transferLedgerDistributeRequest, options) { return exports.PlaidApiFp(this.configuration).transferLedgerDistribute(transferLedgerDistributeRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/ledger/get` endpoint to view a balance on the ledger held with Plaid. * @summary Retrieve Plaid Ledger balance * @param {TransferLedgerGetRequest} transferLedgerGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferLedgerGet(transferLedgerGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferLedgerGet(transferLedgerGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/ledger/withdraw` endpoint to withdraw funds from a Plaid Ledger balance. * @summary Withdraw funds from a Plaid Ledger balance * @param {TransferLedgerWithdrawRequest} transferLedgerWithdrawRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferLedgerWithdraw(transferLedgerWithdrawRequest, options) { return exports.PlaidApiFp(this.configuration).transferLedgerWithdraw(transferLedgerWithdrawRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/list` endpoint to see a list of all your transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired transfers. * @summary List transfers * @param {TransferListRequest} transferListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferList(transferListRequest, options) { return exports.PlaidApiFp(this.configuration).transferList(transferListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/metrics/get` endpoint to view your transfer product usage metrics. * @summary Get transfer product usage metrics * @param {TransferMetricsGetRequest} transferMetricsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferMetricsGet(transferMetricsGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferMetricsGet(transferMetricsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * As an alternative to adding Items via Link, you can also use the `/transfer/migrate_account` endpoint to migrate known account and routing numbers to Plaid Items. This endpoint is also required when adding an Item for use with wire transfers; if you intend to create wire transfers on this account, you must provide `wire_routing_number`. Note that Items created in this way are not compatible with endpoints for other products, such as `/accounts/balance/get`, and can only be used with Transfer endpoints. If you require access to other endpoints, create the Item through Link instead. Access to `/transfer/migrate_account` is not enabled by default; to obtain access, contact your Plaid Account Manager. * @summary Migrate account into Transfers * @param {TransferMigrateAccountRequest} transferMigrateAccountRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferMigrateAccount(transferMigrateAccountRequest, options) { return exports.PlaidApiFp(this.configuration).transferMigrateAccount(transferMigrateAccountRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/originator/create` endpoint to create a new originator and return an `originator_client_id`. * @summary Create a new originator * @param {TransferOriginatorCreateRequest} transferOriginatorCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferOriginatorCreate(transferOriginatorCreateRequest, options) { return exports.PlaidApiFp(this.configuration).transferOriginatorCreate(transferOriginatorCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/originator/funding_account/update` endpoint to update the funding account associated with the originator. * @summary Update the funding account associated with the originator * @param {TransferOriginatorFundingAccountUpdateRequest} transferOriginatorFundingAccountUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferOriginatorFundingAccountUpdate(transferOriginatorFundingAccountUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).transferOriginatorFundingAccountUpdate(transferOriginatorFundingAccountUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/originator/get` endpoint gets status updates for an originator\'s onboarding process. This information is also available via the Transfer page on the Plaid dashboard. * @summary Get status of an originator\'s onboarding * @param {TransferOriginatorGetRequest} transferOriginatorGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferOriginatorGet(transferOriginatorGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferOriginatorGet(transferOriginatorGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/originator/list` endpoint gets status updates for all of your originators\' onboarding. This information is also available via the Plaid dashboard. * @summary Get status of all originators\' onboarding * @param {TransferOriginatorListRequest} transferOriginatorListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferOriginatorList(transferOriginatorListRequest, options) { return exports.PlaidApiFp(this.configuration).transferOriginatorList(transferOriginatorListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/platform/originator/create` endpoint allows gathering information about the originator specific to the Scaled Platform Transfer offering, including the originator\'s agreement to legal terms required before accepting any further information related to the originator. * @summary Create an originator for scaled platform customers * @param {TransferPlatformOriginatorCreateRequest} transferPlatformOriginatorCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferPlatformOriginatorCreate(transferPlatformOriginatorCreateRequest, options) { return exports.PlaidApiFp(this.configuration).transferPlatformOriginatorCreate(transferPlatformOriginatorCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/platform/person/create` endpoint to create a person record associated with an originator and optionally submit person-specific requirements. * @summary Create a person associated with an originator * @param {TransferPlatformPersonCreateRequest} transferPlatformPersonCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferPlatformPersonCreate(transferPlatformPersonCreateRequest, options) { return exports.PlaidApiFp(this.configuration).transferPlatformPersonCreate(transferPlatformPersonCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/platform/requirement/submit` endpoint allows platforms to submit onboarding requirements for an originator as part of the Scaled Platform Transfer offering. * @summary Submit onboarding requirements for Scaled Platform originators * @param {TransferPlatformRequirementSubmitRequest} transferPlatformRequirementSubmitRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferPlatformRequirementSubmit(transferPlatformRequirementSubmitRequest, options) { return exports.PlaidApiFp(this.configuration).transferPlatformRequirementSubmit(transferPlatformRequirementSubmitRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/questionnaire/create` endpoint generates a Plaid-hosted onboarding UI URL. Redirect the originator to this URL to provide their due diligence information and agree to Plaid’s terms for ACH money movement. * @summary Generate a Plaid-hosted onboarding UI URL. * @param {TransferQuestionnaireCreateRequest} transferQuestionnaireCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferQuestionnaireCreate(transferQuestionnaireCreateRequest, options) { return exports.PlaidApiFp(this.configuration).transferQuestionnaireCreate(transferQuestionnaireCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/recurring/cancel` endpoint to cancel a recurring transfer. Scheduled transfer that hasn\'t been submitted to bank will be cancelled. * @summary Cancel a recurring transfer. * @param {TransferRecurringCancelRequest} transferRecurringCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferRecurringCancel(transferRecurringCancelRequest, options) { return exports.PlaidApiFp(this.configuration).transferRecurringCancel(transferRecurringCancelRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/recurring/create` endpoint to initiate a new recurring transfer. This capability is not currently supported for Transfer UI or Platform Payments (beta) customers. * @summary Create a recurring transfer * @param {TransferRecurringCreateRequest} transferRecurringCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferRecurringCreate(transferRecurringCreateRequest, options) { return exports.PlaidApiFp(this.configuration).transferRecurringCreate(transferRecurringCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/recurring/get` fetches information about the recurring transfer corresponding to the given `recurring_transfer_id`. * @summary Retrieve a recurring transfer * @param {TransferRecurringGetRequest} transferRecurringGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferRecurringGet(transferRecurringGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferRecurringGet(transferRecurringGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/recurring/list` endpoint to see a list of all your recurring transfers and their statuses. Results are paginated; use the `count` and `offset` query parameters to retrieve the desired recurring transfers. * @summary List recurring transfers * @param {TransferRecurringListRequest} transferRecurringListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferRecurringList(transferRecurringListRequest, options) { return exports.PlaidApiFp(this.configuration).transferRecurringList(transferRecurringListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/refund/cancel` endpoint to cancel a refund. A refund is eligible for cancellation if it has not yet been submitted to the payment network. * @summary Cancel a refund * @param {TransferRefundCancelRequest} transferRefundCancelRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferRefundCancel(transferRefundCancelRequest, options) { return exports.PlaidApiFp(this.configuration).transferRefundCancel(transferRefundCancelRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Use the `/transfer/refund/create` endpoint to create a refund for a transfer. A transfer can be refunded if the transfer was initiated in the past 180 days. Refunds come out of the available balance of the ledger used for the original debit transfer. If there are not enough funds in the available balance to cover the refund amount, the refund will be rejected. You can create a refund at any time. Plaid does not impose any hold time on refunds. * @summary Create a refund * @param {TransferRefundCreateRequest} transferRefundCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferRefundCreate(transferRefundCreateRequest, options) { return exports.PlaidApiFp(this.configuration).transferRefundCreate(transferRefundCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/refund/get` endpoint fetches information about the refund corresponding to the given `refund_id`. * @summary Retrieve a refund * @param {TransferRefundGetRequest} transferRefundGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferRefundGet(transferRefundGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferRefundGet(transferRefundGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/repayment/list` endpoint fetches repayments matching the given filters. Repayments are returned in reverse-chronological order (most recent first) starting at the given `start_time`. * @summary Lists historical repayments * @param {TransferRepaymentListRequest} transferRepaymentListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferRepaymentList(transferRepaymentListRequest, options) { return exports.PlaidApiFp(this.configuration).transferRepaymentList(transferRepaymentListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/repayment/return/list` endpoint retrieves the set of returns that were batched together into the specified repayment. The sum of amounts of returns retrieved by this request equals the amount of the repayment. * @summary List the returns included in a repayment * @param {TransferRepaymentReturnListRequest} transferRepaymentReturnListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferRepaymentReturnList(transferRepaymentReturnListRequest, options) { return exports.PlaidApiFp(this.configuration).transferRepaymentReturnList(transferRepaymentReturnListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/sweep/get` endpoint fetches a sweep corresponding to the given `sweep_id`. * @summary Retrieve a sweep * @param {TransferSweepGetRequest} transferSweepGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferSweepGet(transferSweepGetRequest, options) { return exports.PlaidApiFp(this.configuration).transferSweepGet(transferSweepGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * The `/transfer/sweep/list` endpoint fetches sweeps matching the given filters. * @summary List sweeps * @param {TransferSweepListRequest} transferSweepListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ transferSweepList(transferSweepListRequest, options) { return exports.PlaidApiFp(this.configuration).transferSweepList(transferSweepListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Returns user permissioned account data including identity and Item access tokens. * @summary Retrieve User Account * @param {UserAccountSessionGetRequest} userAccountSessionGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ userAccountSessionGet(userAccountSessionGetRequest, options) { return exports.PlaidApiFp(this.configuration).userAccountSessionGet(userAccountSessionGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint should be called for each of your end users before they begin a Plaid Check or Income flow, or a Multi-Item Link flow. This provides you a single token to access all data associated with the user. You should only create one per end user. The `consumer_report_user_identity` object must be present in order to create a Plaid Check Consumer Report for a user. If it is not provided during the `/user/create` call, it can be added later by calling `/user/update`. Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. If you call the endpoint multiple times with the same `client_user_id`, the first creation call will succeed and the rest will fail with an error message indicating that the user has been created for the given `client_user_id`. Ensure that you store the `user_token` along with your user\'s identifier in your database, as it is not possible to retrieve a previously created `user_token`. * @summary Create user * @param {UserCreateRequest} userCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ userCreate(userCreateRequest, options) { return exports.PlaidApiFp(this.configuration).userCreate(userCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Returns Items associated with a User along with their corresponding statuses. * @summary Get Items associated with a User * @param {UserItemsGetRequest} userItemsGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ userItemsGet(userItemsGetRequest, options) { return exports.PlaidApiFp(this.configuration).userItemsGet(userItemsGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * `/user/remove` deletes a user token and and associated information, including any Items associated with the token. Any subsequent calls to retrieve information using the same user token will result in an error stating the user does not exist. * @summary Remove user * @param {UserRemoveRequest} userRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ userRemove(userRemoveRequest, options) { return exports.PlaidApiFp(this.configuration).userRemove(userRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint is used to create a third-party user token. This token can be shared with and used by a specified third-party client to access data associated with the user through supported endpoints. Ensure you store the `third_party_user_token` along with the `user_token` and `third_party_client_id`, as it is not possible to retrieve a previously created `third_party_user_token`. * @summary Create a third-party user token * @param {UserThirdPartyTokenCreateRequest} userThirdPartyTokenCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest, options) { return exports.PlaidApiFp(this.configuration).userThirdPartyTokenCreate(userThirdPartyTokenCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint is used to delete a third-party user token. Once removed, the token can longer be used to access data associated with the user. Any subsequent calls to retrieve information using the same third-party user token will result in an error stating the third-party user token does not exist. * @summary Remove a third-party user token * @param {UserThirdPartyTokenRemoveRequest} userThirdPartyTokenRemoveRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ userThirdPartyTokenRemove(userThirdPartyTokenRemoveRequest, options) { return exports.PlaidApiFp(this.configuration).userThirdPartyTokenRemove(userThirdPartyTokenRemoveRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint is used to update user information associated with an existing `user_token`. It can also be used to enable an existing `user_token` for use with Consumer Reports by Plaid Check, by adding a `consumer_report_user_identity` object to the user. Plaid Check Consumer Reports can only be created for US-based users; the user\'s address country must be `US`. * @summary Update user information * @param {UserUpdateRequest} userUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ userUpdate(userUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).userUpdate(userUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Create an e-wallet. The response is the newly created e-wallet object. * @summary Create an e-wallet * @param {WalletCreateRequest} walletCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ walletCreate(walletCreateRequest, options) { return exports.PlaidApiFp(this.configuration).walletCreate(walletCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Fetch an e-wallet. The response includes the current balance. * @summary Fetch an e-wallet * @param {WalletGetRequest} walletGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ walletGet(walletGetRequest, options) { return exports.PlaidApiFp(this.configuration).walletGet(walletGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint lists all e-wallets in descending order of creation. * @summary Fetch a list of e-wallets * @param {WalletListRequest} walletListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ walletList(walletListRequest, options) { return exports.PlaidApiFp(this.configuration).walletList(walletListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Execute a transaction using the specified e-wallet. Specify the e-wallet to debit from, the counterparty to credit to, the idempotency key to prevent duplicate transactions, the amount and reference for the transaction. Transactions will settle in seconds to several days, depending on the underlying payment rail. * @summary Execute a transaction using an e-wallet * @param {WalletTransactionExecuteRequest} walletTransactionExecuteRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ walletTransactionExecute(walletTransactionExecuteRequest, options) { return exports.PlaidApiFp(this.configuration).walletTransactionExecute(walletTransactionExecuteRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Fetch a specific e-wallet transaction * @summary Fetch an e-wallet transaction * @param {WalletTransactionGetRequest} walletTransactionGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ walletTransactionGet(walletTransactionGetRequest, options) { return exports.PlaidApiFp(this.configuration).walletTransactionGet(walletTransactionGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * This endpoint lists the latest transactions of the specified e-wallet. Transactions are returned in descending order by the `created_at` time. * @summary List e-wallet transactions * @param {WalletTransactionListRequest} walletTransactionListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ walletTransactionList(walletTransactionListRequest, options) { return exports.PlaidApiFp(this.configuration).walletTransactionList(walletTransactionListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Create a new entity watchlist screening to check your customer against watchlists defined in the associated entity watchlist program. If your associated program has ongoing screening enabled, this is the profile information that will be used to monitor your customer over time. * @summary Create a watchlist screening for an entity * @param {WatchlistScreeningEntityCreateRequest} watchlistScreeningEntityCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningEntityCreate(watchlistScreeningEntityCreateRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningEntityCreate(watchlistScreeningEntityCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Retrieve an entity watchlist screening. * @summary Get an entity screening * @param {WatchlistScreeningEntityGetRequest} watchlistScreeningEntityGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningEntityGet(watchlistScreeningEntityGetRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningEntityGet(watchlistScreeningEntityGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List all changes to the entity watchlist screening in reverse-chronological order. If the watchlist screening has not been edited, no history will be returned. * @summary List history for entity watchlist screenings * @param {WatchlistScreeningEntityHistoryListRequest} watchlistScreeningEntityHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningEntityHistoryList(watchlistScreeningEntityHistoryListRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningEntityHistoryList(watchlistScreeningEntityHistoryListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List all hits for the entity watchlist screening. * @summary List hits for entity watchlist screenings * @param {WatchlistScreeningEntityHitListRequest} watchlistScreeningEntityHitListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningEntityHitList(watchlistScreeningEntityHitListRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningEntityHitList(watchlistScreeningEntityHitListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List all entity screenings. * @summary List entity watchlist screenings * @param {WatchlistScreeningEntityListRequest} watchlistScreeningEntityListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningEntityList(watchlistScreeningEntityListRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningEntityList(watchlistScreeningEntityListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Get an entity watchlist screening program * @summary Get entity watchlist screening program * @param {WatchlistScreeningEntityProgramGetRequest} watchlistScreeningEntityProgramGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningEntityProgramGet(watchlistScreeningEntityProgramGetRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningEntityProgramGet(watchlistScreeningEntityProgramGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List all entity watchlist screening programs * @summary List entity watchlist screening programs * @param {WatchlistScreeningEntityProgramListRequest} watchlistScreeningEntityProgramListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningEntityProgramList(watchlistScreeningEntityProgramListRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningEntityProgramList(watchlistScreeningEntityProgramListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Create a review for an entity watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary Create a review for an entity watchlist screening * @param {WatchlistScreeningEntityReviewCreateRequest} watchlistScreeningEntityReviewCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningEntityReviewCreate(watchlistScreeningEntityReviewCreateRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningEntityReviewCreate(watchlistScreeningEntityReviewCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List all reviews for a particular entity watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary List reviews for entity watchlist screenings * @param {WatchlistScreeningEntityReviewListRequest} watchlistScreeningEntityReviewListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningEntityReviewList(watchlistScreeningEntityReviewListRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningEntityReviewList(watchlistScreeningEntityReviewListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Update an entity watchlist screening. * @summary Update an entity screening * @param {WatchlistScreeningEntityUpdateRequest} watchlistScreeningEntityUpdateRequest The entity screening was successfully updated. * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningEntityUpdate(watchlistScreeningEntityUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningEntityUpdate(watchlistScreeningEntityUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Create a new Watchlist Screening to check your customer against watchlists defined in the associated Watchlist Program. If your associated program has ongoing screening enabled, this is the profile information that will be used to monitor your customer over time. * @summary Create a watchlist screening for a person * @param {WatchlistScreeningIndividualCreateRequest} watchlistScreeningIndividualCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningIndividualCreate(watchlistScreeningIndividualCreateRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningIndividualCreate(watchlistScreeningIndividualCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Retrieve a previously created individual watchlist screening * @summary Retrieve an individual watchlist screening * @param {WatchlistScreeningIndividualGetRequest} watchlistScreeningIndividualGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningIndividualGet(watchlistScreeningIndividualGetRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningIndividualGet(watchlistScreeningIndividualGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List all changes to the individual watchlist screening in reverse-chronological order. If the watchlist screening has not been edited, no history will be returned. * @summary List history for individual watchlist screenings * @param {WatchlistScreeningIndividualHistoryListRequest} watchlistScreeningIndividualHistoryListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningIndividualHistoryList(watchlistScreeningIndividualHistoryListRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningIndividualHistoryList(watchlistScreeningIndividualHistoryListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List all hits found by Plaid for a particular individual watchlist screening. * @summary List hits for individual watchlist screening * @param {WatchlistScreeningIndividualHitListRequest} watchlistScreeningIndividualHitListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningIndividualHitList(watchlistScreeningIndividualHitListRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningIndividualHitList(watchlistScreeningIndividualHitListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List previously created watchlist screenings for individuals * @summary List Individual Watchlist Screenings * @param {WatchlistScreeningIndividualListRequest} watchlistScreeningIndividualListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningIndividualList(watchlistScreeningIndividualListRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningIndividualList(watchlistScreeningIndividualListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Get an individual watchlist screening program * @summary Get individual watchlist screening program * @param {WatchlistScreeningIndividualProgramGetRequest} watchlistScreeningIndividualProgramGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningIndividualProgramGet(watchlistScreeningIndividualProgramGetRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningIndividualProgramGet(watchlistScreeningIndividualProgramGetRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List all individual watchlist screening programs * @summary List individual watchlist screening programs * @param {WatchlistScreeningIndividualProgramListRequest} watchlistScreeningIndividualProgramListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningIndividualProgramList(watchlistScreeningIndividualProgramListRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningIndividualProgramList(watchlistScreeningIndividualProgramListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Create a review for the individual watchlist screening. Reviews are compliance reports created by users in your organization regarding the relevance of potential hits found by Plaid. * @summary Create a review for an individual watchlist screening * @param {WatchlistScreeningIndividualReviewCreateRequest} watchlistScreeningIndividualReviewCreateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningIndividualReviewCreate(watchlistScreeningIndividualReviewCreateRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningIndividualReviewCreate(watchlistScreeningIndividualReviewCreateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * List all reviews for the individual watchlist screening. * @summary List reviews for individual watchlist screenings * @param {WatchlistScreeningIndividualReviewListRequest} watchlistScreeningIndividualReviewListRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningIndividualReviewList(watchlistScreeningIndividualReviewListRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningIndividualReviewList(watchlistScreeningIndividualReviewListRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Update a specific individual watchlist screening. This endpoint can be used to add additional customer information, correct outdated information, add a reference id, assign the individual to a reviewer, and update which program it is associated with. Please note that you may not update `search_terms` and `status` at the same time since editing `search_terms` may trigger an automatic `status` change. * @summary Update individual watchlist screening * @param {WatchlistScreeningIndividualUpdateRequest} watchlistScreeningIndividualUpdateRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ watchlistScreeningIndividualUpdate(watchlistScreeningIndividualUpdateRequest, options) { return exports.PlaidApiFp(this.configuration).watchlistScreeningIndividualUpdate(watchlistScreeningIndividualUpdateRequest, options).then((request) => request(this.axios, this.basePath)); } /** * Plaid signs all outgoing webhooks and provides JSON Web Tokens (JWTs) so that you can verify the authenticity of any incoming webhooks to your application. A message signature is included in the `Plaid-Verification` header. The `/webhook_verification_key/get` endpoint provides a JSON Web Key (JWK) that can be used to verify a JWT. * @summary Get webhook verification key * @param {WebhookVerificationKeyGetRequest} webhookVerificationKeyGetRequest * @param {*} [options] Override http request option. * @throws {RequiredError} * @memberof PlaidApi */ webhookVerificationKeyGet(webhookVerificationKeyGetRequest, options) { return exports.PlaidApiFp(this.configuration).webhookVerificationKeyGet(webhookVerificationKeyGetRequest, options).then((request) => request(this.axios, this.basePath)); } } exports.PlaidApi = PlaidApi; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxvQkFBb0I7QUFDcEIsb0JBQW9CO0FBQ3BCOzs7Ozs7Ozs7O0dBVUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUgsa0RBQWlFO0FBQ2pFLHlEQUF5RDtBQUN6RCxhQUFhO0FBQ2IscUNBQTROO0FBQzVOLGFBQWE7QUFDYixpQ0FBNEY7QUFFNUY7Ozs7R0FJRztBQUNILElBQVksUUFLWDtBQUxELFdBQVksUUFBUTtJQUNoQix1QkFBVyxDQUFBO0lBQ1gsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7SUFDWCx1QkFBVyxDQUFBO0FBQ2YsQ0FBQyxFQUxXLFFBQVEsR0FBUixnQkFBUSxLQUFSLGdCQUFRLFFBS25CO0FBa0NEOzs7TUFHTTtBQUNOLElBQVksY0FLWDtBQUxELFdBQVksY0FBYztJQUN0Qiw2REFBMkMsQ0FBQTtJQUMzQyxzQ0FBb0IsQ0FBQTtJQUNwQiw4Q0FBNEIsQ0FBQTtJQUM1QixxQ0FBbUIsQ0FBQTtBQUN2QixDQUFDLEVBTFcsY0FBYyxHQUFkLHNCQUFjLEtBQWQsc0JBQWMsUUFLekI7QUFtSUQ7OztNQUdNO0FBQ04sSUFBWSxtQ0FRWDtBQVJELFdBQVksbUNBQW1DO0lBQzNDLHVGQUFnRCxDQUFBO0lBQ2hELHNHQUErRCxDQUFBO0lBQy9ELGdHQUF5RCxDQUFBO0lBQ3pELDZFQUFzQyxDQUFBO0lBQ3RDLG1GQUE0QyxDQUFBO0lBQzVDLGlGQUEwQyxDQUFBO0lBQzFDLDJFQUFvQyxDQUFBO0FBQ3hDLENBQUMsRUFSVyxtQ0FBbUMsR0FBbkMsMkNBQW1DLEtBQW5DLDJDQUFtQyxRQVE5QztBQXVIRDs7O01BR007QUFDTixJQUFZLGlDQVdYO0FBWEQsV0FBWSxpQ0FBaUM7SUFDekMscUZBQWdELENBQUE7SUFDaEQsb0dBQStELENBQUE7SUFDL0QsOEZBQXlELENBQUE7SUFDekQsMkVBQXNDLENBQUE7SUFDdEMs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O1FBQ3pJLE9BQU8sa0JBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsa0NBQWtDLENBQUMseUNBQXlDLEVBQUUsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2TCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLHlCQUF5QixDQUFDLGdDQUFrRSxFQUFFLE9BQWE7UUFDOUcsT0FBTyxrQkFBVSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxnQ0FBZ0MsRUFBRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3JLLENBQUM7Q0FDSjtBQXA5R0QsNEJBbzlHQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIHRzbGludDpkaXNhYmxlICovXG4vKiBlc2xpbnQtZGlzYWJsZSAqL1xuLyoqXG4gKiBUaGUgUGxhaWQgQVBJXG4gKiBUaGUgUGxhaWQgUkVTVCBBUEkuIFBsZWFzZSBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkgZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBUaGUgdmVyc2lvbiBvZiB0aGUgT3BlbkFQSSBkb2N1bWVudDogMjAyMC0wOS0xNF8xLjYxNy4xXG4gKiBcbiAqXG4gKiBOT1RFOiBUaGlzIGNsYXNzIGlzIGF1dG8gZ2VuZXJhdGVkIGJ5IE9wZW5BUEkgR2VuZXJhdG9yIChodHRwczovL29wZW5hcGktZ2VuZXJhdG9yLnRlY2gpLlxuICogaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoXG4gKiBEbyBub3QgZWRpdCB0aGUgY2xhc3MgbWFudWFsbHkuXG4gKi9cblxuXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBnbG9iYWxBeGlvcywgeyBBeGlvc1Byb21pc2UsIEF4aW9zSW5zdGFuY2UgfSBmcm9tICdheGlvcyc7XG4vLyBTb21lIGltcG9ydHMgbm90IHVzZWQgZGVwZW5kaW5nIG9uIHRlbXBsYXRlIGNvbmRpdGlvbnNcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERVTU1ZX0JBU0VfVVJMLCBhc3NlcnRQYXJhbUV4aXN0cywgc2V0QXBpS2V5VG9PYmplY3QsIHNldEJhc2ljQXV0aFRvT2JqZWN0LCBzZXRCZWFyZXJBdXRoVG9PYmplY3QsIHNldE9BdXRoVG9PYmplY3QsIHNldFNlYXJjaFBhcmFtcywgc2VyaWFsaXplRGF0YUlmTmVlZGVkLCB0b1BhdGhTdHJpbmcsIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbiB9IGZyb20gJy4vY29tbW9uJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEJBU0VfUEFUSCwgQ09MTEVDVElPTl9GT1JNQVRTLCBSZXF1ZXN0QXJncywgQmFzZUFQSSwgUmVxdWlyZWRFcnJvciB9IGZyb20gJy4vYmFzZSc7XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuIFJlcXVpcmVkIGZvciB0cmFuc2ZlcnMgb24gYW4gQUNIIG5ldHdvcmsuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbQUNIIFNFQyBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9jcmVhdGluZy10cmFuc2ZlcnMvI2FjaC1zZWMtY29kZXMpLiAgQ29kZXMgc3VwcG9ydGVkIGZvciBjcmVkaXRzOiBgY2NkYCwgYHBwZGAgQ29kZXMgc3VwcG9ydGVkIGZvciBkZWJpdHM6IGBjY2RgLCBgdGVsYCwgYHdlYmAgIGBcXFwiY2NkXFxcImAgLSBDb3Jwb3JhdGUgQ3JlZGl0IG9yIERlYml0IC0gZnVuZCB0cmFuc2ZlciBiZXR3ZWVuIHR3byBjb3Jwb3JhdGUgYmFuayBhY2NvdW50cyAgYFxcXCJwcGRcXFwiYCAtIFByZWFycmFuZ2VkIFBheW1lbnQgb3IgRGVwb3NpdCAtIHRoZSB0cmFuc2ZlciBpcyBwYXJ0IG9mIGEgcHJlLWV4aXN0aW5nIHJlbGF0aW9uc2hpcCB3aXRoIGEgY29uc3VtZXIsIGUuZy4gYmlsbCBwYXltZW50ICBgXFxcInRlbFxcXCJgIC0gVGVsZXBob25lLUluaXRpYXRlZCBFbnRyeSAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeSAtIGRlYml0cyBmcm9tIGEgY29uc3VtZXLigJlzIGFjY291bnQgd2hlcmUgdGhlaXIgYXV0aG9yaXphdGlvbiBpcyBvYnRhaW5lZCBvdmVyIHRoZSBJbnRlcm5ldFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQUNIQ2xhc3Mge1xuICAgIENjZCA9ICdjY2QnLFxuICAgIFBwZCA9ICdwcGQnLFxuICAgIFRlbCA9ICd0ZWwnLFxuICAgIFdlYiA9ICd3ZWInXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIEFQUiBvbiB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQVBSXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQVBSIHtcbiAgICAvKipcbiAgICAgKiBBbm51YWwgUGVyY2VudGFnZSBSYXRlIGFwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGFwcl9wZXJjZW50YWdlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYmFsYW5jZSB0byB3aGljaCB0aGUgQVBSIGFwcGxpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgYXByX3R5cGU6IEFQUkFwclR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBtb25leSB0aGF0IGlzIHN1YmplY3RlZCB0byB0aGUgQVBSIGlmIGEgYmFsYW5jZSB3YXMgY2FycmllZCBiZXlvbmQgcGF5bWVudCBkdWUgZGF0ZS4gSG93IGl0IGlzIGNhbGN1bGF0ZWQgY2FuIHZhcnkgYnkgY2FyZCBpc3N1ZXIuIEl0IGlzIG9mdGVuIGNhbGN1bGF0ZWQgYXMgYW4gYXZlcmFnZSBkYWlseSBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFQUlxuICAgICAqL1xuICAgIGJhbGFuY2Vfc3ViamVjdF90b19hcHI6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIG1vbmV5IGNoYXJnZWQgZHVlIHRvIGludGVyZXN0IGZyb20gbGFzdCBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQVBSXG4gICAgICovXG4gICAgaW50ZXJlc3RfY2hhcmdlX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBUFJBcHJUeXBlRW51bSB7XG4gICAgQmFsYW5jZVRyYW5zZmVyQXByID0gJ2JhbGFuY2VfdHJhbnNmZXJfYXByJyxcbiAgICBDYXNoQXByID0gJ2Nhc2hfYXByJyxcbiAgICBQdXJjaGFzZUFwciA9ICdwdXJjaGFzZV9hcHInLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCdcbn1cblxuLyoqXG4gKiBBbGxvdyBvciBkaXNhbGxvdyBwcm9kdWN0IGFjY2VzcyBieSBhY2NvdW50LiBVbmxpc3RlZCAoZS5nLiBtaXNzaW5nKSBhY2NvdW50cyB3aWxsIGJlIGNvbnNpZGVyZWQgYG5ld19hY2NvdW50c2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGFjY291bnQgaWRlbnRpZmllciBmb3IgdGhpcyBhY2NvdW50LiBUaGlzIHZhbHVlIG11c3QgbWF0Y2ggdGhhdCByZXR1cm5lZCBieSB0aGUgZGF0YSBhY2Nlc3MgQVBJIGZvciB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFjY2Vzc1xuICAgICAqL1xuICAgIHVuaXF1ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBzZWUgdGhpcyBhY2NvdW50IChhbmQgYXNzb2NpYXRlZCBkZXRhaWxzLCBpbmNsdWRpbmcgYmFsYW5jZSkgaW4gdGhlIGxpc3Qgb2YgYWNjb3VudHMgIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhdXRob3JpemVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50X3Byb2R1Y3RfYWNjZXNzPzogQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudEFzc2V0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRBc3NldHMge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgdmVyaWZpY2F0aW9uIHN0YXR1cyBvZiBhbiBBdXRoIEl0ZW0gaW5pdGlhdGVkIHRocm91Z2ggQXV0b21hdGVkIG9yIE1hbnVhbCBtaWNyby1kZXBvc2l0cy4gIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gTm90ZTogRGF0YWJhc2UgTWF0Y2ggaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRBc3NldHNWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGFuZCBwZXJzaXN0ZW50IGlkZW50aWZpZXIgZm9yIGFjY291bnRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdHJhY2UgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBzYW1lIGFjY291bnQgYWNyb3NzIGRpZmZlcmVudCBJdGVtcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBpcyBjdXJyZW50bHkgYW4gb3B0LWluIGZpZWxkIGFuZCBvbmx5IHN1cHBvcnRlZCBmb3IgQ2hhc2UgSXRlbXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgd2l0aGluIHRoaXMgcmVwb3J0IGZvciB0aGlzIEl0ZW0sIHR5cGljYWxseSBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGF0IGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGRheXNfYXZhaWxhYmxlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb24gaGlzdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0UmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QXNzZXRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxBc3NldFJlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRSZXBvcnRJbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogQXNzZXRSZXBvcnRJbnZlc3RtZW50cztcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLkZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJzaGlwVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEFzc2V0c1xuICAgICAqL1xuICAgIG93bmVyc2hpcF90eXBlPzogT3duZXJzaGlwVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlZCBkYXRhIGFib3V0IHRoZSBoaXN0b3JpY2FsIGJhbGFuY2VzIG9uIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRBc3NldHNcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2JhbGFuY2VzOiBBcnJheTxIaXN0b3JpY2FsQmFsYW5jZT47XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEFzc2V0c1ZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCdcbn1cblxuLyoqXG4gKiBBIHNldCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgYmFsYW5jZSBmb3IgYW4gYWNjb3VudC4gQmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgYmFsYW5jZSBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZ1bmRzIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBsaW1pdGAgbGVzcyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UsIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgY3VycmVudGAgYmFsYW5jZSBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvdmVyZHJhZnQgbGltaXQuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGNhc2ggYXZhaWxhYmxlIHRvIHdpdGhkcmF3IGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBgYXZhaWxhYmxlYCAgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYGF2YWlsYWJsZWAgYmFsYW5jZSB2YWx1ZSBvZiBgbnVsbGAuICBBdmFpbGFibGUgYmFsYW5jZSBtYXkgYmUgY2FjaGVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1cC10by1kYXRlIGluIHJlYWx0aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIG9yIG93ZWQgYnkgdGhlIGFjY291bnQuICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgYSBwb3NpdGl2ZSBiYWxhbmNlIGluZGljYXRlcyB0aGUgYW1vdW50IG93ZWQ7IGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgbG9hbmAtdHlwZSBhY2NvdW50cywgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgcHJpbmNpcGFsIHJlbWFpbmluZyBvbiB0aGUgbG9hbiwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHN0dWRlbnQgbG9hbiBhY2NvdW50cyBhdCBTYWxsaWUgTWFlIChgaW5zXzExNjk0NGApLiBGb3IgU2FsbGllIE1hZSBzdHVkZW50IGxvYW5zLCB0aGUgYWNjb3VudFxcJ3MgYmFsYW5jZSBpbmNsdWRlcyBib3RoIHByaW5jaXBhbCBhbmQgYW55IG91dHN0YW5kaW5nIGludGVyZXN0LiBTaW1pbGFyIHRvIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIGEgcG9zaXRpdmUgYmFsYW5jZSBpcyB0eXBpY2FsbHkgZXhwZWN0ZWQsIHdoaWxlIGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCB2YWx1ZSBvZiBhc3NldHMgYXMgcHJlc2VudGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gIE5vdGUgdGhhdCBiYWxhbmNlIGluZm9ybWF0aW9uIG1heSBiZSBjYWNoZWQgdW5sZXNzIHRoZSB2YWx1ZSB3YXMgcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGA7IGlmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIFRyYW5zYWN0aW9ucywgdGhlIGJhbGFuY2Ugd2lsbCBiZSBhdCBsZWFzdCBhcyByZWNlbnQgYXMgdGhlIG1vc3QgcmVjZW50IFRyYW5zYWN0aW9uIHVwZGF0ZS4gSWYgeW91IHJlcXVpcmUgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGFzIHByb3ZpZGVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgV2hlbiByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgdGhpcyBmaWVsZCBtYXkgYmUgYG51bGxgLiBXaGVuIHRoaXMgaGFwcGVucywgYGF2YWlsYWJsZWAgaXMgZ3VhcmFudGVlZCBub3QgdG8gYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBjcmVkaXQgbGltaXQuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLWFycmFuZ2VkIG92ZXJkcmFmdCBsaW1pdCwgd2hpY2ggaXMgY29tbW9uIGZvciBjdXJyZW50IChjaGVja2luZykgYWNjb3VudHMgaW4gRXVyb3BlLiAgSW4gTm9ydGggQW1lcmljYSwgdGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgb25seSBhdmFpbGFibGUgZm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBhbmQgZXhwZWN0ZWQgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgYW5kIHRoZSBJdGVtIGNvbnRhaW5zIG9uZSBvciBtb3JlIGFjY291bnRzIHdpdGggYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IHR5cGUsIGluIHdoaWNoIGNhc2UgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBDYXBpdGFsIE9uZSBkZXBvc2l0b3J5IGFjY291bnRzIGFzIHdlbGwgYXMgYWxsIG90aGVyIGFjY291bnQgdHlwZXMgb24gYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBTZWUgW2FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgYWNjb3VudCB0eXBlcy4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGlzIG9sZGVyIHRoYW4gdGhlIGdpdmVuIHRpbWVzdGFtcCBmb3IgSXRlbXMgd2l0aCB0aGlzIGZpZWxkIHJlcXVpcmVkLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHNpbmdsZSBhY2NvdW50IGF0IGEgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50QmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRCYXNlIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgVGhlIGBhY2NvdW50X2lkYCBjYW4gYWxzbyBjaGFuZ2UgaWYgdGhlIGBhY2Nlc3NfdG9rZW5gIGlzIGRlbGV0ZWQgYW5kIHRoZSBzYW1lIGNyZWRlbnRpYWxzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoYXQgYGFjY2Vzc190b2tlbmAgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgYSBuZXcgYGFjY2Vzc190b2tlbmAgb24gYSBsYXRlciBkYXRlLiBJbiB0aGF0IGNhc2UsIHRoZSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIG9sZCBgYWNjb3VudF9pZGAuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBBY2NvdW50QmFsYW5jZTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgZWl0aGVyIHRoZSBhY2NvdW504oCZcyBkaXNwbGF5ZWQgbWFzayBvciB0aGUgYWNjb3VudOKAmXMgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW3igJlzIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRCYXNlXG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBtaWNyby1kZXBvc2l0cyBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc3Ryb25nIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6ICBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBBY2NvdW50QmFzZVZlcmlmaWNhdGlvblN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEJhc2VcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlIGFuZCBQTkMpLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIG1heSBiZSBwb3B1bGF0ZWQgZm9yIGFueSBhY2NvdW50OyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIHBlcnNpc3RlbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEhvbGRlckNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50QmFzZVxuICAgICAqL1xuICAgIGhvbGRlcl9jYXRlZ29yeT86IEFjY291bnRIb2xkZXJDYXRlZ29yeSB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEJhc2VWZXJpZmljYXRpb25TdGF0dXNFbnVtIHtcbiAgICBBdXRvbWF0aWNhbGx5VmVyaWZpZWQgPSAnYXV0b21hdGljYWxseV92ZXJpZmllZCcsXG4gICAgUGVuZGluZ0F1dG9tYXRpY1ZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb24nLFxuICAgIFBlbmRpbmdNYW51YWxWZXJpZmljYXRpb24gPSAncGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uJyxcbiAgICBNYW51YWxseVZlcmlmaWVkID0gJ21hbnVhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJyxcbiAgICBWZXJpZmljYXRpb25GYWlsZWQgPSAndmVyaWZpY2F0aW9uX2ZhaWxlZCcsXG4gICAgRGF0YWJhc2VNYXRjaGVkID0gJ2RhdGFiYXNlX21hdGNoZWQnLFxuICAgIERhdGFiYXNlSW5zaWdodHNQYXNzID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3MnLFxuICAgIERhdGFiYXNlSW5zaWdodHNQYXNzV2l0aENhdXRpb24gPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb24nLFxuICAgIERhdGFiYXNlSW5zaWdodHNGYWlsID0gJ2RhdGFiYXNlX2luc2lnaHRzX2ZhaWwnXG59XG5cbi8qKlxuICogRW51bWVyYXRlcyB0aGUgYWNjb3VudCBzdWJ0eXBlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3aXNoZXMgZm9yIHRoZSB1c2VyIHRvIGJlIGFibGUgdG8gc2VsZWN0IGZyb20uIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8gUGxhaWQgZG9jdW1lbnRhdGlvbiBvbiBhY2NvdW50IGZpbHRlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50RmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgY3JlZGl0PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBiZSBmaWx0ZXJlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGxvYW4/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIGZpbHRlcmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyXG4gICAgICovXG4gICAgaW52ZXN0bWVudD86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRoZSBgYWNjb3VudF9maWx0ZXJzYCBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudEZpbHRlcnNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogRGVwb3NpdG9yeUZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50RmlsdGVyc1Jlc3BvbnNlXG4gICAgICovXG4gICAgbG9hbj86IExvYW5GaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRGaWx0ZXJzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50PzogSW52ZXN0bWVudEZpbHRlcjtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHRoZSBhY2NvdW50XFwncyBjYXRlZ29yaXphdGlvbiBhcyBlaXRoZXIgYSBwZXJzb25hbCBvciBhIGJ1c2luZXNzIGFjY291bnQuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IGluIGJldGE7IHRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudEhvbGRlckNhdGVnb3J5IHtcbiAgICBCdXNpbmVzcyA9ICdidXNpbmVzcycsXG4gICAgUGVyc29uYWwgPSAncGVyc29uYWwnLFxuICAgIFVucmVjb2duaXplZCA9ICd1bnJlY29nbml6ZWQnXG59XG5cbi8qKlxuICogSWRlbnRpdHkgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHkge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBiYWxhbmNlczogQWNjb3VudEJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGVpdGhlciB0aGUgYWNjb3VudOKAmXMgZGlzcGxheWVkIG1hc2sgb3IgdGhlIGFjY291bnTigJlzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVt4oCZcyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBtaWNyby1kZXBvc2l0cyBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc3Ryb25nIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6ICBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogQWNjb3VudElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlIGFuZCBQTkMpLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIG1heSBiZSBwb3B1bGF0ZWQgZm9yIGFueSBhY2NvdW50OyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBwZXJzaXN0ZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRIb2xkZXJDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3MgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGFzcycsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1Bhc3NXaXRoQ2F1dGlvbiA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbicsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c0ZhaWwgPSAnZGF0YWJhc2VfaW5zaWdodHNfZmFpbCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5QWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlBbGxPZiB7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uOyBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbGlua2VkIGFjY291bnQgaXMgYSBidXNpbmVzcyBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlBbGxPZlxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBJZGVudGl0eSBpbmZvcm1hdGlvbiBhYm91dCBhbiBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWQge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBUaGUgYGFjY291bnRfaWRgIGNhbiBhbHNvIGNoYW5nZSBpZiB0aGUgYGFjY2Vzc190b2tlbmAgaXMgZGVsZXRlZCBhbmQgdGhlIHNhbWUgY3JlZGVudGlhbHMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhhdCBgYWNjZXNzX3Rva2VuYCBhcmUgdXNlZCB0byBnZW5lcmF0ZSBhIG5ldyBgYWNjZXNzX3Rva2VuYCBvbiBhIGxhdGVyIGRhdGUuIEluIHRoYXQgY2FzZSwgdGhlIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgb2xkIGBhY2NvdW50X2lkYC4gIElmIGFuIGFjY291bnQgd2l0aCBhIHNwZWNpZmljIGBhY2NvdW50X2lkYCBkaXNhcHBlYXJzIGluc3RlYWQgb2YgY2hhbmdpbmcsIHRoZSBhY2NvdW50IGlzIGxpa2VseSBjbG9zZWQuIENsb3NlZCBhY2NvdW50cyBhcmUgbm90IHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUEkuICBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBhY2NvdW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBlaXRoZXIgdGhlIGFjY291bnTigJlzIGRpc3BsYXllZCBtYXNrIG9yIHRoZSBhY2NvdW504oCZcyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbeKAmXMgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50LCBlaXRoZXIgYXNzaWduZWQgYnkgdGhlIHVzZXIgb3IgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBpdHNlbGZcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYWNjb3VudCBhcyBnaXZlbiBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICB0eXBlOiBBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgc3VidHlwZTogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gQXV0aCBJdGVtIGluaXRpYXRlZCB0aHJvdWdoIG1pY3JvLWRlcG9zaXRzIG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbi4gUmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgb25seS4gIGBwZW5kaW5nX2F1dG9tYXRpY192ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIGF1dG9tYXRpYyB2ZXJpZmljYXRpb24gIGBwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb25gOiBUaGUgSXRlbSBpcyBwZW5kaW5nIG1hbnVhbCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbi4gSXRlbXMgcmVtYWluIGluIHRoaXMgc3RhdGUgdW50aWwgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVzIHRoZSBtaWNyby1kZXBvc2l0LiAgYGF1dG9tYXRpY2FsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gYXV0b21hdGljYWxseSB2ZXJpZmllZCAgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIE1hdGNoLiAgYGRhdGFiYXNlX2luc2lnaHRzX3Bhc3NgOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzdHJvbmcgc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzX3dpdGhfY2F1dGlvbmA6IFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGFuZCBoYXZlIHNvbWUgc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gIGBkYXRhYmFzZV9pbnNpZ2h0c19mYWlsYDogIFRoZSBJdGVtXFwncyBudW1iZXJzIGhhdmUgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzIGFuZCBoYXZlIHNpZ25hbCBmb3IgYmVpbmcgaW52YWxpZCBhbmQvb3IgaGF2ZSBubyBzaWduYWwgZm9yIGJlaW5nIHZhbGlkLiBPbmx5IHJldHVybmVkIGZvciBBdXRoIEl0ZW1zIGNyZWF0ZWQgdmlhIERhdGFiYXNlIEluc2lnaHRzLiBOb3RlOiBEYXRhYmFzZSBJbnNpZ2h0cyBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkVmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9pbnNpZ2h0cz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhbmQgcGVyc2lzdGVudCBpZGVudGlmaWVyIGZvciBhY2NvdW50cyB0aGF0IGNhbiBiZSB1c2VkIHRvIHRyYWNlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBhY2NvdW50IGFjcm9zcyBkaWZmZXJlbnQgSXRlbXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBvbmx5IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgdGhhdCB1c2UgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoaS5lLiwgQ2hhc2UgYW5kIFBOQykuIEJlY2F1c2UgdGhlc2UgYWNjb3VudHMgaGF2ZSBhIGRpZmZlcmVudCBhY2NvdW50IG51bWJlciBlYWNoIHRpbWUgdGhleSBhcmUgbGlua2VkLCB0aGlzIGZpZWxkIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGFjY291bnQgbnVtYmVyIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGFjY291bnQgYWNyb3NzIG11bHRpcGxlIEl0ZW1zIGZvciBwYXltZW50cyB1c2UgY2FzZXMsIGhlbHBpbmcgdG8gcmVkdWNlIGR1cGxpY2F0ZSBJdGVtcyBvciBhdHRlbXB0ZWQgZnJhdWQuIEluIFNhbmRib3gsIHRoaXMgZmllbGQgbWF5IGJlIHBvcHVsYXRlZCBmb3IgYW55IGFjY291bnQ7IGluIFByb2R1Y3Rpb24sIGl0IHdpbGwgb25seSBiZSBwb3B1bGF0ZWQgZm9yIGFjY291bnRzIGF0IGFwcGxpY2FibGUgaW5zdGl0dXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgaG9sZGVyX2NhdGVnb3J5PzogQWNjb3VudEhvbGRlckNhdGVnb3J5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBPbmx5IHJldHVybmVkIGJ5IElkZW50aXR5IG9yIEFzc2V0cyBlbmRwb2ludHMuIEZvciBidXNpbmVzcyBhY2NvdW50cywgdGhlIG5hbWUgcmVwb3J0ZWQgbWF5IGJlIGVpdGhlciB0aGUgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBvciB0aGUgbmFtZSBvZiB0aGUgYnVzaW5lc3MsIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb247IGRldGVjdGluZyB3aGV0aGVyIHRoZSBsaW5rZWQgYWNjb3VudCBpcyBhIGJ1c2luZXNzIGFjY291bnQgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIE11bHRpcGxlIG93bmVycyBvbiBhIHNpbmdsZSBhY2NvdW50IHdpbGwgYmUgcmVwcmVzZW50ZWQgaW4gdGhlIHNhbWUgYG93bmVyYCBvYmplY3QsIG5vdCBpbiBtdWx0aXBsZSBvd25lciBvYmplY3RzIHdpdGhpbiB0aGUgYXJyYXkuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGUgYG93bmVyc2Agb2JqZWN0IGlzIG5vdCByZXR1cm5lZCwgYW5kIGluc3RlYWQgaWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgaW4gdGhlIHRvcCBsZXZlbCBgaWRlbnRpdHlgIG9iamVjdC4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE5LTA1LTI5KVxuICAgICAqIEB0eXBlIHtBcnJheTxPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgZG9jdW1lbnRzIHRoYXQgd2VyZSB1cGxvYWRlZCBhcyBwcm9vZiBvZiBhY2NvdW50IG93bmVyc2hpcC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkXG4gICAgICovXG4gICAgZG9jdW1lbnRzPzogQXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD4gfCBudWxsO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzcyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzc1dpdGhDYXV0aW9uID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzRmFpbCA9ICdkYXRhYmFzZV9pbnNpZ2h0c19mYWlsJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZEFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5RG9jdW1lbnRVcGxvYWRBbGxPZiB7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gT25seSByZXR1cm5lZCBieSBJZGVudGl0eSBvciBBc3NldHMgZW5kcG9pbnRzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uOyBkZXRlY3Rpbmcgd2hldGhlciB0aGUgbGlua2VkIGFjY291bnQgaXMgYSBidXNpbmVzcyBhY2NvdW50IGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSlcbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZEFsbE9mXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxPd25lcj47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgZG9jdW1lbnRzIHRoYXQgd2VyZSB1cGxvYWRlZCBhcyBwcm9vZiBvZiBhY2NvdW50IG93bmVyc2hpcC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZD59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkQWxsT2ZcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxJZGVudGl0eURvY3VtZW50VXBsb2FkPiB8IG51bGw7XG59XG4vKipcbiAqIElkZW50aXR5IG1hdGNoIHNjb3JlcyBmb3IgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gVGhpcyB2YWx1ZSB3aWxsIG5vdCBjaGFuZ2UgdW5sZXNzIFBsYWlkIGNhblxcJ3QgcmVjb25jaWxlIHRoZSBhY2NvdW50IHdpdGggdGhlIGRhdGEgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gVGhpcyBtYXkgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHRoZSBuYW1lIG9mIHRoZSBhY2NvdW50IGNoYW5nZXMuIElmIHRoaXMgaGFwcGVucyBhIG5ldyBgYWNjb3VudF9pZGAgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgYWNjb3VudC4gIFRoZSBgYWNjb3VudF9pZGAgY2FuIGFsc28gY2hhbmdlIGlmIHRoZSBgYWNjZXNzX3Rva2VuYCBpcyBkZWxldGVkIGFuZCB0aGUgc2FtZSBjcmVkZW50aWFscyB0aGF0IHdlcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGF0IGBhY2Nlc3NfdG9rZW5gIGFyZSB1c2VkIHRvIGdlbmVyYXRlIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIG9uIGEgbGF0ZXIgZGF0ZS4gSW4gdGhhdCBjYXNlLCB0aGUgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBvbGQgYGFjY291bnRfaWRgLiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgYmFsYW5jZXM6IEFjY291bnRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBlaXRoZXIgdGhlIGFjY291bnTigJlzIGRpc3BsYXllZCBtYXNrIG9yIHRoZSBhY2NvdW504oCZcyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbeKAmXMgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEF1dGggSXRlbSBpbml0aWF0ZWQgdGhyb3VnaCBtaWNyby1kZXBvc2l0cyBvciBkYXRhYmFzZSB2ZXJpZmljYXRpb24uIFJldHVybmVkIGZvciBBdXRoIEl0ZW1zIG9ubHkuICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgbWljcm8tZGVwb3NpdC4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgICBgbWFudWFsbHlfdmVyaWZpZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gbWFudWFsbHkgdmVyaWZpZWQgIGB2ZXJpZmljYXRpb25fZXhwaXJlZGA6IFBsYWlkIHdhcyB1bmFibGUgdG8gYXV0b21hdGljYWxseSB2ZXJpZnkgdGhlIGRlcG9zaXQgd2l0aGluIDcgY2FsZW5kYXIgZGF5cyBhbmQgd2lsbCBubyBsb25nZXIgYXR0ZW1wdCB0byB2YWxpZGF0ZSB0aGUgSXRlbS4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYHZlcmlmaWNhdGlvbl9mYWlsZWRgOiBUaGUgSXRlbSBmYWlsZWQgbWFudWFsIG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uIGJlY2F1c2UgdGhlIHVzZXIgZXhoYXVzdGVkIGFsbCAzIHZlcmlmaWNhdGlvbiBhdHRlbXB0cy4gVXNlcnMgbWF5IHJldHJ5IGJ5IHN1Ym1pdHRpbmcgdGhlaXIgaW5mb3JtYXRpb24gYWdhaW4gdGhyb3VnaCBMaW5rLiAgYGRhdGFiYXNlX21hdGNoZWRgOiBUaGUgSXRlbSBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcy4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBNYXRjaC4gIGBkYXRhYmFzZV9pbnNpZ2h0c19wYXNzYDogVGhlIEl0ZW1cXCdzIG51bWJlcnMgaGF2ZSBiZWVuIHZlcmlmaWVkIHVzaW5nIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgYW5kIGhhdmUgc3Ryb25nIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfcGFzc193aXRoX2NhdXRpb25gOiBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzb21lIHNpZ25hbCBmb3IgYmVpbmcgdmFsaWQuIE9ubHkgcmV0dXJuZWQgZm9yIEF1dGggSXRlbXMgY3JlYXRlZCB2aWEgRGF0YWJhc2UgSW5zaWdodHMuIE5vdGU6IERhdGFiYXNlIEluc2lnaHRzIGlzIGN1cnJlbnRseSBhIGJldGEgZmVhdHVyZSwgcGxlYXNlIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uICBgZGF0YWJhc2VfaW5zaWdodHNfZmFpbGA6ICBUaGUgSXRlbVxcJ3MgbnVtYmVycyBoYXZlIGJlZW4gdmVyaWZpZWQgdXNpbmcgUGxhaWRcXCdzIGRhdGEgc291cmNlcyBhbmQgaGF2ZSBzaWduYWwgZm9yIGJlaW5nIGludmFsaWQgYW5kL29yIGhhdmUgbm8gc2lnbmFsIGZvciBiZWluZyB2YWxpZC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy4gTm90ZTogRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGEgYmV0YSBmZWF0dXJlLCBwbGVhc2UgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gICBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1cz86IEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25faW5zaWdodHM/OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYW5kIHBlcnNpc3RlbnQgaWRlbnRpZmllciBmb3IgYWNjb3VudHMgdGhhdCBjYW4gYmUgdXNlZCB0byB0cmFjZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYWNjb3VudCBhY3Jvc3MgZGlmZmVyZW50IEl0ZW1zIGZvciBkZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb25seSBmb3IgSXRlbXMgYXQgaW5zdGl0dXRpb25zIHRoYXQgdXNlIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKGkuZS4sIENoYXNlIGFuZCBQTkMpLiBCZWNhdXNlIHRoZXNlIGFjY291bnRzIGhhdmUgYSBkaWZmZXJlbnQgYWNjb3VudCBudW1iZXIgZWFjaCB0aW1lIHRoZXkgYXJlIGxpbmtlZCwgdGhpcyBmaWVsZCBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBhY2NvdW50IG51bWJlciB0byB1bmlxdWVseSBpZGVudGlmeSBhbiBhY2NvdW50IGFjcm9zcyBtdWx0aXBsZSBJdGVtcyBmb3IgcGF5bWVudHMgdXNlIGNhc2VzLCBoZWxwaW5nIHRvIHJlZHVjZSBkdXBsaWNhdGUgSXRlbXMgb3IgYXR0ZW1wdGVkIGZyYXVkLiBJbiBTYW5kYm94LCB0aGlzIGZpZWxkIG1heSBiZSBwb3B1bGF0ZWQgZm9yIGFueSBhY2NvdW50OyBpbiBQcm9kdWN0aW9uLCBpdCB3aWxsIG9ubHkgYmUgcG9wdWxhdGVkIGZvciBhY2NvdW50cyBhdCBhcHBsaWNhYmxlIGluc3RpdHV0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgcGVyc2lzdGVudF9hY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50SG9sZGVyQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBob2xkZXJfY2F0ZWdvcnk/OiBBY2NvdW50SG9sZGVyQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOYW1lTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBOYW1lTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Bob25lTnVtYmVyTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IFBob25lTnVtYmVyTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtYWlsQWRkcmVzc01hdGNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlXG4gICAgICovXG4gICAgYWRkcmVzcz86IEFkZHJlc3NNYXRjaFNjb3JlIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlVmVyaWZpY2F0aW9uU3RhdHVzRW51bSB7XG4gICAgQXV0b21hdGljYWxseVZlcmlmaWVkID0gJ2F1dG9tYXRpY2FsbHlfdmVyaWZpZWQnLFxuICAgIFBlbmRpbmdBdXRvbWF0aWNWZXJpZmljYXRpb24gPSAncGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uJyxcbiAgICBQZW5kaW5nTWFudWFsVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfbWFudWFsX3ZlcmlmaWNhdGlvbicsXG4gICAgTWFudWFsbHlWZXJpZmllZCA9ICdtYW51YWxseV92ZXJpZmllZCcsXG4gICAgVmVyaWZpY2F0aW9uRXhwaXJlZCA9ICd2ZXJpZmljYXRpb25fZXhwaXJlZCcsXG4gICAgVmVyaWZpY2F0aW9uRmFpbGVkID0gJ3ZlcmlmaWNhdGlvbl9mYWlsZWQnLFxuICAgIERhdGFiYXNlTWF0Y2hlZCA9ICdkYXRhYmFzZV9tYXRjaGVkJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzcyA9ICdkYXRhYmFzZV9pbnNpZ2h0c19wYXNzJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzUGFzc1dpdGhDYXV0aW9uID0gJ2RhdGFiYXNlX2luc2lnaHRzX3Bhc3Nfd2l0aF9jYXV0aW9uJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzRmFpbCA9ICdkYXRhYmFzZV9pbnNpZ2h0c19mYWlsJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2Yge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOYW1lTWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZUFsbE9mXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IE5hbWVNYXRjaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGhvbmVOdW1iZXJNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBQaG9uZU51bWJlck1hdGNoU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbWFpbEFkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogRW1haWxBZGRyZXNzTWF0Y2hTY29yZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NNYXRjaFNjb3JlfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50SWRlbnRpdHlNYXRjaFNjb3JlQWxsT2ZcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQWRkcmVzc01hdGNoU2NvcmUgfCBudWxsO1xufVxuLyoqXG4gKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIHNwZWNpZmljIHByb2R1Y3RzIG9uIHRoaXMgYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGFjY291bnQgZGF0YS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRfZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYmFuayBzdGF0ZW1lbnRzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGF4IGRvY3VtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIHRheF9kb2N1bWVudHM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogQWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGFjY2VzcyBzcGVjaWZpYyBwcm9kdWN0cyBvbiB0aGlzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFByb2R1Y3RBY2Nlc3NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgYWNjb3VudCBkYXRhLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRQcm9kdWN0QWNjZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2RhdGE/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyB0aGUgYXBwbGljYXRpb24gdG8gYWNjZXNzIGJhbmsgc3RhdGVtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IHRoZSBhcHBsaWNhdGlvbiB0byBhY2Nlc3MgdGF4IGRvY3VtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50UHJvZHVjdEFjY2Vzc051bGxhYmxlXG4gICAgICovXG4gICAgdGF4X2RvY3VtZW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgYXBwbGljYXRpb24gcmVxdWlyZXMgdGhhdCBhY2NvdW50cyBiZSBsaW1pdGVkIHRvIGEgc3BlY2lmaWMgY2FyZGluYWxpdHkuIGBNVUxUSV9TRUxFQ1RgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgdXNlciBzaG91bGQgYmUgYWxsb3dlZCB0byBwaWNrIG11bHRpcGxlIGFjY291bnRzLiBgU0lOR0xFX1NFTEVDVGA6IGluZGljYXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHBpY2sgb25seSBhIHNpbmdsZSBhY2NvdW50LiBgQUxMYDogaW5kaWNhdGVzIHRoYXQgdGhlIHVzZXIgbXVzdCBzaGFyZSBhbGwgb2YgdGhlaXIgYWNjb3VudHMgYW5kIHNob3VsZCBub3QgYmUgZ2l2ZW4gdGhlIG9wcG9ydHVuaXR5IHRvIGRlLXNlbGVjdFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWNjb3VudFNlbGVjdGlvbkNhcmRpbmFsaXR5IHtcbiAgICBTaW5nbGVTZWxlY3QgPSAnU0lOR0xFX1NFTEVDVCcsXG4gICAgTXVsdGlTZWxlY3QgPSAnTVVMVElfU0VMRUNUJyxcbiAgICBBbGwgPSAnQUxMJ1xufVxuXG4vKipcbiAqIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRTdWJ0eXBlIHtcbiAgICBfNDAxYSA9ICc0MDFhJyxcbiAgICBfNDAxayA9ICc0MDFrJyxcbiAgICBfNDAzQiA9ICc0MDNCJyxcbiAgICBfNDU3YiA9ICc0NTdiJyxcbiAgICBfNTI5ID0gJzUyOScsXG4gICAgQXV0byA9ICdhdXRvJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBCdXNpbmVzcyA9ICdidXNpbmVzcycsXG4gICAgQ2FzaElzYSA9ICdjYXNoIGlzYScsXG4gICAgQ2FzaE1hbmFnZW1lbnQgPSAnY2FzaCBtYW5hZ2VtZW50JyxcbiAgICBDZCA9ICdjZCcsXG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIENvbW1lcmNpYWwgPSAnY29tbWVyY2lhbCcsXG4gICAgQ29uc3RydWN0aW9uID0gJ2NvbnN0cnVjdGlvbicsXG4gICAgQ29uc3VtZXIgPSAnY29uc3VtZXInLFxuICAgIENyZWRpdENhcmQgPSAnY3JlZGl0IGNhcmQnLFxuICAgIENyeXB0b0V4Y2hhbmdlID0gJ2NyeXB0byBleGNoYW5nZScsXG4gICAgRWJ0ID0gJ2VidCcsXG4gICAgRWR1Y2F0aW9uU2F2aW5nc0FjY291bnQgPSAnZWR1Y2F0aW9uIHNhdmluZ3MgYWNjb3VudCcsXG4gICAgRml4ZWRBbm51aXR5ID0gJ2ZpeGVkIGFubnVpdHknLFxuICAgIEdpYyA9ICdnaWMnLFxuICAgIEhlYWx0aFJlaW1idXJzZW1lbnRBcnJhbmdlbWVudCA9ICdoZWFsdGggcmVpbWJ1cnNlbWVudCBhcnJhbmdlbWVudCcsXG4gICAgSG9tZUVxdWl0eSA9ICdob21lIGVxdWl0eScsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgSXNhID0gJ2lzYScsXG4gICAgSXJhID0gJ2lyYScsXG4gICAgS2VvZ2ggPSAna2VvZ2gnLFxuICAgIExpZiA9ICdsaWYnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnbGlmZSBpbnN1cmFuY2UnLFxuICAgIExpbmVPZkNyZWRpdCA9ICdsaW5lIG9mIGNyZWRpdCcsXG4gICAgTGlyYSA9ICdsaXJhJyxcbiAgICBMb2FuID0gJ2xvYW4nLFxuICAgIExyaWYgPSAnbHJpZicsXG4gICAgTHJzcCA9ICdscnNwJyxcbiAgICBNb25leU1hcmtldCA9ICdtb25leSBtYXJrZXQnLFxuICAgIE1vcnRnYWdlID0gJ21vcnRnYWdlJyxcbiAgICBNdXR1YWxGdW5kID0gJ211dHVhbCBmdW5kJyxcbiAgICBOb25DdXN0b2RpYWxXYWxsZXQgPSAnbm9uLWN1c3RvZGlhbCB3YWxsZXQnLFxuICAgIE5vblRheGFibGVCcm9rZXJhZ2VBY2NvdW50ID0gJ25vbi10YXhhYmxlIGJyb2tlcmFnZSBhY2NvdW50JyxcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgT3RoZXJJbnN1cmFuY2UgPSAnb3RoZXIgaW5zdXJhbmNlJyxcbiAgICBPdGhlckFubnVpdHkgPSAnb3RoZXIgYW5udWl0eScsXG4gICAgT3ZlcmRyYWZ0ID0gJ292ZXJkcmFmdCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBQZW5zaW9uID0gJ3BlbnNpb24nLFxuICAgIFByZXBhaWQgPSAncHJlcGFpZCcsXG4gICAgUHJpZiA9ICdwcmlmJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBSZHNwID0gJ3Jkc3AnLFxuICAgIFJlc3AgPSAncmVzcCcsXG4gICAgUmV0aXJlbWVudCA9ICdyZXRpcmVtZW50JyxcbiAgICBSbGlmID0gJ3JsaWYnLFxuICAgIFJvdGggPSAncm90aCcsXG4gICAgUm90aDQwMWsgPSAncm90aCA0MDFrJyxcbiAgICBScmlmID0gJ3JyaWYnLFxuICAgIFJyc3AgPSAncnJzcCcsXG4gICAgU2Fyc2VwID0gJ3NhcnNlcCcsXG4gICAgU2F2aW5ncyA9ICdzYXZpbmdzJyxcbiAgICBTZXBJcmEgPSAnc2VwIGlyYScsXG4gICAgU2ltcGxlSXJhID0gJ3NpbXBsZSBpcmEnLFxuICAgIFNpcHAgPSAnc2lwcCcsXG4gICAgU3RvY2tQbGFuID0gJ3N0b2NrIHBsYW4nLFxuICAgIFN0dWRlbnQgPSAnc3R1ZGVudCcsXG4gICAgVGhyaWZ0U2F2aW5nc1BsYW4gPSAndGhyaWZ0IHNhdmluZ3MgcGxhbicsXG4gICAgVGZzYSA9ICd0ZnNhJyxcbiAgICBUcnVzdCA9ICd0cnVzdCcsXG4gICAgVWdtYSA9ICd1Z21hJyxcbiAgICBVdG1hID0gJ3V0bWEnLFxuICAgIFZhcmlhYmxlQW5udWl0eSA9ICd2YXJpYWJsZSBhbm51aXR5J1xufVxuXG4vKipcbiAqIGBpbnZlc3RtZW50OmAgSW52ZXN0bWVudCBhY2NvdW50LiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyB0eXBlIGlzIGNhbGxlZCBgYnJva2VyYWdlYCBpbnN0ZWFkLiAgYGNyZWRpdDpgIENyZWRpdCBjYXJkICBgZGVwb3NpdG9yeTpgIERlcG9zaXRvcnkgYWNjb3VudCAgYGxvYW46YCBMb2FuIGFjY291bnQgIGBvdGhlcjpgIE5vbi1zcGVjaWZpZWQgYWNjb3VudCB0eXBlICBTZWUgdGhlIFtBY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgYWNjb3VudCB0eXBlcyBhbmQgY29ycmVzcG9uZGluZyBzdWJ0eXBlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFjY291bnRUeXBlIHtcbiAgICBJbnZlc3RtZW50ID0gJ2ludmVzdG1lbnQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIERlcG9zaXRvcnkgPSAnZGVwb3NpdG9yeScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBCcm9rZXJhZ2UgPSAnYnJva2VyYWdlJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBmcm9tIHBlcmZvcm1pbmcgZGF0YWJhc2UgdmVyaWZpY2F0aW9uIGZvciB0aGUgYWNjb3VudC4gT25seSByZXR1cm5lZCBmb3IgQXV0aCBJdGVtcyBjcmVhdGVkIHZpYSBEYXRhYmFzZSBJbnNpZ2h0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzTmV0d29ya1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgbmV0d29ya19zdGF0dXM6IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1ByZXZpb3VzUmV0dXJuc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgcHJldmlvdXNfcmV0dXJucz86IEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c1ByZXZpb3VzUmV0dXJucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzQWNjb3VudE51bWJlckZvcm1hdH1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXJfZm9ybWF0OiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNBY2NvdW50TnVtYmVyRm9ybWF0O1xufVxuLyoqXG4gKiBJbmRpY2F0b3Igb2YgYWNjb3VudCBudW1iZXIgZm9ybWF0IHZhbGlkaXR5IGZvciBpbnN0aXR1dGlvbi4gIGB2YWxpZGA6IGluZGljYXRlcyB0aGF0IHRoZSBhY2NvdW50IG51bWJlciBoYXMgYSBjb3JyZWN0IGZvcm1hdCBmb3IgdGhlIGluc3RpdHV0aW9uLiAgYGludmFsaWRgOiBpbmRpY2F0ZXMgdGhhdCB0aGUgYWNjb3VudCBudW1iZXIgaGFzIGFuIGluY29ycmVjdCBmb3JtYXQgZm9yIHRoZSBpbnN0aXR1dGlvbi4gIGB1bmtub3duYDogaW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGZvcm1hdCBpcyBjb3JyZWN0IGZvciB0aGUgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNBY2NvdW50TnVtYmVyRm9ybWF0IHtcbiAgICBWYWxpZCA9ICd2YWxpZCcsXG4gICAgSW52YWxpZCA9ICdpbnZhbGlkJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nXG59XG5cbi8qKlxuICogU3RhdHVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlciBpbiB0aGUgUGxhaWQgbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWNjb3VudFZlcmlmaWNhdGlvbkluc2lnaHRzTmV0d29ya1N0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHdlIGZvdW5kIGF0IGxlYXN0IG9uZSBtYXRjaGluZyBhY2NvdW50IGZvciB0aGUgQUNIIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNOZXR3b3JrU3RhdHVzXG4gICAgICovXG4gICAgaGFzX251bWJlcnNfbWF0Y2g6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGF0IGxlYXN0IG9uZSBtYXRjaGluZyBhY2NvdW50IGZvciB0aGUgQUNIIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyIGlzIGFscmVhZHkgdmVyaWZpZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRWZXJpZmljYXRpb25JbnNpZ2h0c05ldHdvcmtTdGF0dXNcbiAgICAgKi9cbiAgICBpc19udW1iZXJzX21hdGNoX3ZlcmlmaWVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBrbm93biBBQ0ggcmV0dXJucyBmb3IgdGhlIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnMge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIFBsYWlkXFwncyBkYXRhIHNvdXJjZXMgaW5jbHVkZSBhIGtub3duIGFkbWluaXN0cmF0aXZlIEFDSCByZXR1cm4gZm9yIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50VmVyaWZpY2F0aW9uSW5zaWdodHNQcmV2aW91c1JldHVybnNcbiAgICAgKi9cbiAgICBoYXNfcHJldmlvdXNfYWRtaW5pc3RyYXRpdmVfcmV0dXJuOiBib29sZWFuO1xufVxuLyoqXG4gKiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2RldGFpbHM/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBPcHRpb25hbCBwYXJhbWV0ZXJzIHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGBudWxsYC4gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpLCAqYW5kKiBvbmUgb3IgbW9yZSBhY2NvdW50IHR5cGVzIGJlaW5nIHJlcXVlc3RlZCBpcyBhIG5vbi1kZXBvc2l0b3J5IGFjY291bnQgKHN1Y2ggYXMgYSBjcmVkaXQgY2FyZCkgYXMgQ2FwaXRhbCBPbmUgZG9lcyBub3QgcHJvdmlkZSByZWFsLXRpbWUgYmFsYW5jZSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIEluIHRoaXMgY2FzZSwgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBhbGwgb3RoZXIgaW5zdGl0dXRpb25zLCBhcyB3ZWxsIGFzIGZvciBkZXBvc2l0b3J5IGFjY291bnRzIGF0IENhcGl0YWwgT25lIChpbmNsdWRpbmcgYWxsIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzKSB0aGlzIGZpZWxkIGlzIGlnbm9yZWQgYW5kIHJlYWwtdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uIHdpbGwgYmUgZmV0Y2hlZC4gIElmIHRoaXMgZmllbGQgaXMgbm90IGlnbm9yZWQsIGFuZCBubyBhY2NlcHRhYmxlIGJhbGFuY2UgaXMgYXZhaWxhYmxlLCBhbiBgSU5WQUxJRF9SRVNVTFRgIGVycm9yIHdpdGggdGhlIGNvZGUgYExBU1RfVVBEQVRFRF9EQVRFVElNRV9PVVRfT0ZfUkFOR0VgIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBtaW5fbGFzdF91cGRhdGVkX2RhdGV0aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUbyBlbmFibGUgQmFsYW5jZSBQbHVzIChiZXRhKSwgc2VuZCB0aGlzIG9iamVjdCBhcyBwYXJ0IG9mIHRoZSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCByZXF1ZXN0LiBPbmx5IGF2YWlsYWJsZSB0byBjdXN0b21lcnMgcGFydGljaXBhdGluZyBpbiB0aGUgQmFsYW5jZSBQbHVzIGJldGEgcHJvZ3JhbTsgdG8gZW5yb2xsIGluIHRoZSBiZXRhLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLiBJZiB0aGlzIG9iamVjdCBpcyBwcmVzZW50IGluIHRoZSByZXF1ZXN0LCB0aGUgW2BwYXltZW50X3Jpc2tfYXNzZXNzbWVudGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYmFsYW5jZS9iYWxhbmNlLXBsdXMvI2FjY291bnRzLWJhbGFuY2UtZ2V0LXJlc3BvbnNlLXBheW1lbnQtcmlzay1hc3Nlc3NtZW50LXJpc2stbGV2ZWwpIG9iamVjdCB3aWxsIGJlIHByZXNlbnQgaW4gdGhlIHJlc3BvbnNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgdGhhdCBpcyB0aGUgZnVuZGluZyBzb3VyY2UgZm9yIHRoZSBwcm9wb3NlZCB0cmFuc2FjdGlvbi4gVGhlIGBhY2NvdW50X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGFzIHdlbGwgYXMgdGhlIFtgb25TdWNjZXNzYF0oL2RvY3MvbGluay9pb3MvI2xpbmstaW9zLW9uc3VjY2Vzcy1saW5rU3VjY2Vzcy1tZXRhZGF0YS1hY2NvdW50cy1pZCkgY2FsbGJhY2sgbWV0YWRhdGEuICBUaGlzIHdpbGwgcmV0dXJuIGFuIFtgSU5WQUxJRF9BQ0NPVU5UX0lEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtaW5wdXQvI2ludmFsaWRfYWNjb3VudF9pZCkgZXJyb3IgaWYgdGhlIGFjY291bnQgaGFzIGJlZW4gcmVtb3ZlZCBhdCB0aGUgYmFuayBvciBpZiB0aGUgYGFjY291bnRfaWRgIGlzIG5vIGxvbmdlciB2YWxpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0byByZWZlciB0byB0aGlzIHRyYW5zYWN0aW9uLiBGb3IgeW91ciBjb252ZW5pZW5jZSBtYXBwaW5nIHlvdXIgaW50ZXJuYWwgZGF0YSwgeW91IGNvdWxkIHVzZSB5b3VyIGludGVybmFsIGlkZW50aWZpZXIgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdFBheW1lbnREZXRhaWxzXG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGFtb3VudCwgaW4gVVNEIChlLmcuIGAxMDIuMDVgKVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBgYW1vdW50YCBtdWx0aXBsaWVkIGJ5IHRoZSBgYmFsYW5jZV90aHJlc2hvbGRfcGVyY2VudGFnZWAgKGFzIGEgcGVyY2VudGFnZSkgZXhjZWVkcyB0aGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudCwgdGhlbiBbYHBheW1lbnRfcmlza19hc3Nlc3NtZW50LmV4Y2VlZHNfYmFsYW5jZV90aHJlc2hvbGRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2JhbGFuY2UvYmFsYW5jZS1wbHVzLyNhY2NvdW50cy1iYWxhbmNlLWdldC1yZXNwb25zZS1wYXltZW50LXJpc2stYXNzZXNzbWVudC1leGNlZWRzLWJhbGFuY2UtdGhyZXNob2xkKSBpbiB0aGUgcmVzcG9uc2Ugd2lsbCBiZSB0cnVlLCBvdGhlcndpc2UsIGl0IHdpbGwgYmUgZmFsc2UuIEZvciBleGFtcGxlLCBpZiB0aGUgYGFtb3VudGAgaXMgMjAwIGFuZCB0aGUgYGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2VgIGlzIDkwLCB0aGVuIHRoZSBhY2NvdW50IGJhbGFuY2UgbXVzdCBiZSBhdCBsZWFzdCAxODAgZm9yIGBleGNlZWRzX2JhbGFuY2VfdGhyZXNob2xkYCB0byBiZSBmYWxzZS4gICBCeSBkZWZhdWx0LCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugd2lsbCBiZSB1c2VkIGZvciB0aGlzIGNhbGN1bGF0aW9uOyBpZiBpdCBjYW5ub3QgYmUgb2J0YWluZWQsIHRoZSBjdXJyZW50IGJhbGFuY2Ugd2lsbCBiZSB1c2VkLiAgIFRoaXMgZmllbGQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY3VzdG9tZXJzIHVzaW5nIGluZGlyZWN0IEl0ZW1zIGFuZCB3aG8gZG8gbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byByYXcgYmFsYW5jZSBkYXRhLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlcXVlc3RQYXltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2U/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBiYWxhbmNlIGhhcyB0byBiZSByZWZyZXNoZWQgaW4gcmVhbCB0aW1lIGFzIHBhcnQgb2YgdGhlIEFQSSBjYWxsIHdoZW4gdXNpbmcgQmFsYW5jZSBQbHVzLiBTZXR0aW5nIHRoaXMgdG8gZmllbGQgdG8gYHRydWVgIHdpbGwgcmVzdWx0IGluIG1vcmUgcmVjZW50IGJhbGFuY2VzLCBidXQgbGF0ZW5jeSBtYXkgYmUgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlLiBJZiBtYWtpbmcgYSByZWd1bGFyIChub24tQmFsYW5jZSBQbHVzKSBCYWxhbmNlIGNhbGwsIHdpdGhvdXQgdGhlIGBwYXltZW50X2RldGFpbHNgIG9iamVjdCBwcmVzZW50LCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCB3aWxsIGFsd2F5cyByZXR1cm4gcmVhbC10aW1lIGJhbGFuY2VzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0UGF5bWVudERldGFpbHNcbiAgICAgKi9cbiAgICByZXF1aXJlc19yZWFsX3RpbWVfYmFsYW5jZV9yZWZyZXNoPzogYm9vbGVhbjtcbn1cbi8qKlxuICogUHJvdmlkZXMgYSBkZXRhaWxlZCByaXNrIGFzc2Vzc21lbnQgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb24uIEZvciB0aGlzIGZpZWxkIHRvIGJlIHJldHVybmVkLCB0aGUgY2xpZW50IG11c3QgYmUgZW5yb2xsZWQgaW4gdGhlIEJhbGFuY2UgUGx1cyBiZXRhIHByb2dyYW0gYW5kIHRoZSBbYHBheW1lbnRfZGV0YWlsc2BdKGh0dHA6Ly9wbGFpZC5jb20vZG9jcy9iYWxhbmNlL2JhbGFuY2UtcGx1cy8jYWNjb3VudHMtYmFsYW5jZS1nZXQtcmVxdWVzdC1wYXltZW50LWRldGFpbHMpIG9iamVjdCBtdXN0IGhhdmUgYmVlbiBzZW50IGluIHRoZSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFsYW5jZVBsdXNSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50XG4gICAgICovXG4gICAgcmlza19sZXZlbDogQmFsYW5jZVBsdXNSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbGFuY2VQbHVzQXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzOiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXM7XG4gICAgLyoqXG4gICAgICogQSByaXNrIHNjb3JlIHJhbmdpbmcgZnJvbSAxLTk5LCByZWZsZWN0aW5nIHRoZSBsaWtlbGlob29kIG9mIEFDSCBkZWJpdCByZXR1cm4uIEEgaGlnaGVyIHNjb3JlIGluZGljYXRlcyBhIGdyZWF0ZXIgcmlzayBvZiByZXR1cm4sIG9mdGVuIGR1ZSB0byBvdmVyZHJhd24gYWNjb3VudHMgb3IgYWNjb3VudCBpbmVsaWdpYmlsaXR5IHRvIHJlY2VpdmUgQUNIIHRyYW5zYWN0aW9ucy4gVHlwaWNhbCByZXR1cm4gY29kZXMgaW5jbHVkZSBcXFwiUjAxXFxcIiwgXFxcIlIwMlxcXCIsIFxcXCJSMDNcXFwiLCBcXFwiUjA0XFxcIiwgXFxcIlIwNlxcXCIsIFxcXCJSMDhcXFwiLCBcXFwiUjA5XFxcIiwgXFxcIlIxM1xcXCIsIFxcXCJSMTZcXFwiLCBcXFwiUjE3XFxcIiwgXFxcIlIyMFxcXCIsIFxcXCJSMjNcXFwiLCBldGMuLCB3aXRoIGEgdHVybmFyb3VuZCBvZiAyIGJhbmtpbmcgZGF5cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgb2YgdGhlIGxhc3Qgc3VjY2Vzc2Z1bCBiYWxhbmNlIHVwZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50XG4gICAgICovXG4gICAgYmFsYW5jZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBvYmplY3RzLCBlYWNoIHJlcHJlc2VudGluZyBhIHNwZWNpZmljIHJlYXNvbiBjb250cmlidXRpbmcgdG8gdGhlIHJpc2sgYXNzZXNzbWVudCBvZiBhbiBBQ0ggdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBzdXBwbGllZCBmb3IgdHJhbnNhY3Rpb25zIGNsYXNzaWZpZWQgYXMgYEhJR0hgLCBgTUVESVVNLUhJR0hgLCBvciBgTUVESVVNYCByaXNrLlxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrUmVhc29uPn1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNCYWxhbmNlR2V0UmVzcG9uc2VQYXltZW50Umlza0Fzc2Vzc21lbnRcbiAgICAgKi9cbiAgICByaXNrX3JlYXNvbnM/OiBBcnJheTxSaXNrUmVhc29uPjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBwcm9wb3NlZCB0cmFuc2FjdGlvbiBleGNlZWRzIHRoZSBiYWxhbmNlIHRocmVzaG9sZCBzZXQgaW4gdGhlIHJlcXVlc3QuIGB0cnVlYCBpbmRpY2F0ZXMgaGlnaGVyIHJpc2s7IGBmYWxzZWAgaW5kaWNhdGVzIGxvd2VyIHJpc2suIElmIHRoZSBgYW1vdW50YCBtdWx0aXBsaWVkIGJ5IHRoZSBgYmFsYW5jZV90aHJlc2hvbGRfcGVyY2VudGFnZWAgKGFzIGEgcGVyY2VudGFnZSkgZXhjZWVkcyB0aGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudCwgdGhlbiBgZXhjZWVkc19iYWxhbmNlX3RocmVzaG9sZGAgd2lsbCBiZSB0cnVlLCBvdGhlcndpc2UsIGl0IHdpbGwgYmUgZmFsc2UuIEZvciBleGFtcGxlLCBpZiB0aGUgYGFtb3VudGAgaXMgMjAwIGFuZCB0aGUgYGJhbGFuY2VfdGhyZXNob2xkX3BlcmNlbnRhZ2VgIGlzIDkwLCB0aGVuIHRoZSBhY2NvdW50IGJhbGFuY2UgbXVzdCBiZSBhdCBsZWFzdCAxODAgZm9yIGBleGNlZWRzX2JhbGFuY2VfdGhyZXNob2xkYCB0byBiZSBmYWxzZS4gICBCeSBkZWZhdWx0LCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugd2lsbCBiZSB1c2VkIGZvciB0aGlzIGNhbGN1bGF0aW9uOyBpZiBpdCBjYW5ub3QgYmUgb2J0YWluZWQsIHRoZSBjdXJyZW50IGJhbGFuY2Ugd2lsbCBiZSB1c2VkLiAgIFRoaXMgZmllbGQgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY3VzdG9tZXJzIHVzaW5nIGluZGlyZWN0IEl0ZW1zIGFuZCB3aG8gZG8gbm90IGhhdmUgZGlyZWN0IGFjY2VzcyB0byByYXcgYmFsYW5jZSBkYXRhLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudFxuICAgICAqL1xuICAgIGV4Y2VlZHNfYmFsYW5jZV90aHJlc2hvbGQ6IGJvb2xlYW47XG59XG4vKipcbiAqIEFjY291bnRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hY2NvdW50cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFjY291bnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYWNjb3VudHMvZ2V0YCByZXN1bHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFjY291bnRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2FjY291bnRzL2dldGAgYW5kIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBY2NvdW50c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWNjb3VudHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gSWYgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgd2FzIGNhbGxlZCwgZWFjaCBhY2NvdW50IHdpbGwgaW5jbHVkZSByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEJhc2U+fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgQWNjb3VudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRzQmFsYW5jZUdldFJlc3BvbnNlUGF5bWVudFJpc2tBc3Nlc3NtZW50fVxuICAgICAqIEBtZW1iZXJvZiBBY2NvdW50c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9yaXNrX2Fzc2Vzc21lbnQ/OiBBY2NvdW50c0JhbGFuY2VHZXRSZXNwb25zZVBheW1lbnRSaXNrQXNzZXNzbWVudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjY291bnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBzdGF0ZSBvZiB0aGUgYWN0aW9uL2FjdGl2aXR5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQWN0aW9uU3RhdGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgQXR0ZW1wdCA9ICdBVFRFTVBUJyxcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRScsXG4gICAgU2tpcHBlZCA9ICdTS0lQUEVEJ1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIGNvbnNlbnQgYWN0aXZpdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFjdGl2aXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWN0aXZpdHkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY3Rpdml0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgYWN0aXZpdHk6IEFjdGl2aXR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGlzIGFjdGl2aXR5IHdhcyBpbml0aWF0ZWQgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgKFlZWVktTU0tREQpIGZvcm1hdCBpbiBVVEMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBpbml0aWF0ZWRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY3Rpdml0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBcHBsaWNhdGlvbiBJRCBvZiB0aGUgY2xpZW50IHdobyBpbml0aWF0ZWQgdGhlIGFjdGl2aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgaW5pdGlhdG9yOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjdGlvblN0YXRlfVxuICAgICAqIEBtZW1iZXJvZiBBY3Rpdml0eVxuICAgICAqL1xuICAgIHN0YXRlOiBBY3Rpb25TdGF0ZTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFjdGl2aXR5XG4gICAgICovXG4gICAgdGFyZ2V0X2FwcGxpY2F0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1DcmVhdGVBdXRoZW50aWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQWN0aXZpdHlcbiAgICAgKi9cbiAgICBhdXRoZW50aWNhdGlvbj86IEl0ZW1DcmVhdGVBdXRoZW50aWNhdGlvbjtcbn1cbi8qKlxuICogVHlwZXMgb2YgY29uc2VudCBhY3Rpdml0aWVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBY3Rpdml0eVR5cGUge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgSXRlbUNyZWF0ZSA9ICdJVEVNX0NSRUFURScsXG4gICAgSXRlbUltcG9ydCA9ICdJVEVNX0lNUE9SVCcsXG4gICAgSXRlbVVwZGF0ZSA9ICdJVEVNX1VQREFURScsXG4gICAgSXRlbVVubGluayA9ICdJVEVNX1VOTElOSycsXG4gICAgUG9ydGFsVW5saW5rID0gJ1BPUlRBTF9VTkxJTksnLFxuICAgIFBvcnRhbEl0ZW1zRGVsZXRlID0gJ1BPUlRBTF9JVEVNU19ERUxFVEUnLFxuICAgIEl0ZW1SZW1vdmUgPSAnSVRFTV9SRU1PVkUnLFxuICAgIEludmFyaWFudENoZWNrZXJEZWxldGlvbiA9ICdJTlZBUklBTlRfQ0hFQ0tFUl9ERUxFVElPTicsXG4gICAgU2NvcGVzVXBkYXRlID0gJ1NDT1BFU19VUERBVEUnXG59XG5cbi8qKlxuICogQSBwaHlzaWNhbCBtYWlsaW5nIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBkYXRhOiBBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgYWRkcmVzcyBhcyB0aGUgcHJpbWFyeSBhZGRyZXNzIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTm90UmVxdWlyZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTm90UmVxdWlyZWRcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHN0YXRlYC4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU5vdFJlcXVpcmVkXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc0RhdGFOb3RSZXF1aXJlZFxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBjb21wb25lbnRzIGNvbXByaXNpbmcgYW4gYWRkcmVzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFkZHJlc3NEYXRhTnVsbGFibGVOb1JlcXVpcmVkRmllbGRzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGFkZHJlc3MgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBhZGRyZXNzIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoZSBzY29yZSBjYW4gcmFuZ2UgZnJvbSAwIHRvIDEwMCB3aGVyZSAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoIGFuZCAwIGlzIGEgbm8gbWF0Y2guIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFkZHJlc3NNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgYWRkcmVzcy4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCwgOTktOTAgaXMgYSBzdHJvbmcgbWF0Y2gsIDg5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIHdlYWsgbWF0Y2guIFR5cGljYWxseSwgdGhlIG1hdGNoIHRocmVzaG9sZCBzaG91bGQgYmUgc2V0IHRvIGEgc2NvcmUgb2YgNzAgb3IgaGlnaGVyLiBJZiB0aGUgYWRkcmVzcyBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc01hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBzY29yZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogcG9zdGFsIGNvZGUgd2FzIHByb3ZpZGVkIGZvciBib3RoIGFuZCB3YXMgYSBtYXRjaFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIGlzX3Bvc3RhbF9jb2RlX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEEgcGh5c2ljYWwgbWFpbGluZyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRyZXNzTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgZGF0YTogQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIGFkZHJlc3MgYXMgdGhlIHByaW1hcnkgYWRkcmVzcyBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwcmltYXJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgaXMgYmVpbmcgdXNlZCBmb3IgY29tbWVyY2lhbCBvciByZXNpZGVudGlhbCBwdXJwb3Nlcy4gIE5vdGU6IFRoaXMgdmFsdWUgd2lsbCBiZSBgbm9fZGF0YWAgd2hlbiBQbGFpZCBkb2VzIG5vdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBkZXRlcm1pbmUgdGhlIGFkZHJlc3NcXCdzIHVzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFkZHJlc3NQdXJwb3NlTGFiZWwge1xuICAgIFJlc2lkZW50aWFsID0gJ3Jlc2lkZW50aWFsJyxcbiAgICBDb21tZXJjaWFsID0gJ2NvbW1lcmNpYWwnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IHRoZSBhcHBsaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIGZvciBkaXNwbGF5IHB1cnBvc2VzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBkaXNwbGF5X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgZ3JhbnRlZCBwcm9kdWN0aW9uIGFjY2VzcyBhdCBQbGFpZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0IGluIFVUQy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGpvaW5fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgVVJMIHRoYXQgbGlua3MgdG8gdGhlIGFwcGxpY2F0aW9uIGxvZ28gaW1hZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIGZvciB0aGUgYXBwbGljYXRpb25cXCdzIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgY2xpZW504oCZcyBicm9hZCB1c2UgY2FzZSBhcyBhc3Nlc3NlZCBieSBQbGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIHVzZV9jYXNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiBjbGllbnTigJlzIGxlZ2FsIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGNvbXBhbnlfbGVnYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNpdHkgb2YgdGhlIGNsaWVudOKAmXMgaGVhZHF1YXJ0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlZ2lvbiBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwb3N0YWwgY29kZSBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgY29kZSBvZiB0aGUgY2xpZW504oCZcyBoZWFkcXVhcnRlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFwcGxpY2F0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgd2lsbCBtYXAgdG8gdGhlIGFwcGxpY2F0aW9uIElEIHRoYXQgaXMgcmV0dXJuZWQgZnJvbSAvaXRlbS9hcHBsaWNhdGlvbi9saXN0LCBvciBwcm92aWRlZCB0byB0aGUgaW5zdGl0dXRpb24gaW4gYW4gb2F1dGggcmVkaXJlY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXBwbGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXBwbGljYXRpb25HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXBwbGljYXRpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXBwbGljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFwcGxpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBcHBsaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXBwbGljYXRpb246IEFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldERldGFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUlM6IEFzc2V0T3duZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldEhvbGRlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9IT0xERVI6IEFzc2V0SG9sZGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTlM6IEFzc2V0VHJhbnNhY3Rpb25zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWYWxpZGF0aW9uU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGFuIGFzc2V0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldERldGFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0RGV0YWlsIHtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRVbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgYWxwaGFudW1lcmljIHN0cmluZyBpZGVudGlmeWluZyBhbiBhc3NldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0QWNjb3VudElkZW50aWZpZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2NvdW50IFJlcG9ydCBBcyBvZiBEYXRlIC8gQ3JlYXRlIERhdGUuIEZvcm1hdCBZWVlZLU1NLUREXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEFzT2ZEYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0IGRlc2NyaXB0aW9uIHRoYXQgZnVydGhlciBkZWZpbmVzIHRoZSBBc3NldC4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzaGFyZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdG9ja3MsIGJvbmRzIG9yIG11dHVhbCBmdW5kcywgcmV0aXJlbWVudCBmdW5kcyBvciBidXNpbmVzcyBvd25lZCB0aGF0IHRoZSBib3Jyb3dlciBoYXMgZGlzY2xvc2VkIChuYW1lZCkgYXMgYW4gYXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFzc2V0IEFjY291bnQgQXZhaWxhYmxlIEJhbGFuY2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEF2YWlsYWJsZUJhbGFuY2VBbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHZlbmRvciBjcmVhdGVkIHVuaXF1ZSBJZGVudGlmaWVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldEN1cnJlbnRCYWxhbmNlQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXREZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFR5cGU6IEFzc2V0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIEFzc2V0IERlY3JpcHRpb24gc29tZSBleGFtcGxlcyBhcmUgSW52ZXN0bWVudCBUYXgtRGVmZXJyZWQgLCBMb2FuLCA0MDFLLCA0MDNCLCBDaGVja2luZywgTW9uZXkgTWFya2V0LCBDcmVkaXQgQ2FyZCxST1RILDUyOSxCaWxsZXIsUk9MTE9WRVIsQ0QsU2F2aW5ncyxJbnZlc3RtZW50IFRheGFibGUsIElSQSwgTW9ydGdhZ2UsIExpbmUgT2YgQ3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBOdW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgbWFkZSB0byB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBFeGFtcGxlIFdoZW4gbG9va2luZyBmb3IgMyBtb250aHMgb2YgZGF0YSBmcm9tIHRoZSBGSSwgcGFzcyBpbiA5MCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0RGV0YWlsXG4gICAgICovXG4gICAgQXNzZXREYXlzUmVxdWVzdGVkQ291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBPd25lcnNoaXAgdHlwZSBvZiB0aGUgYXNzZXQgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldERldGFpbFxuICAgICAqL1xuICAgIEFzc2V0T3duZXJzaGlwVHlwZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0SG9sZGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldEhvbGRlclxuICAgICAqL1xuICAgIE5BTUU6IEFzc2V0SG9sZGVyTmFtZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldEhvbGRlck5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldEhvbGRlck5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bnBhcnNlZCBuYW1lIG9mIGVpdGhlciBhbiBpbmRpdmlkdWFsIG9yIGEgbGVnYWwgZW50aXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0SG9sZGVyTmFtZVxuICAgICAqL1xuICAgIEZ1bGxOYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0T3duZXIge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgT3duZXIgRnVsbCBOYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0T3duZXJcbiAgICAgKi9cbiAgICBBc3NldE93bmVyVGV4dDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldE93bmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0T3duZXJzIHtcbiAgICAvKipcbiAgICAgKiBNdWx0aXBsZSBPY2N1cmFuY2VzIG9mIEFjY291bnQgT3duZXJzIEZ1bGwgTmFtZSB1cCB0byA0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRPd25lcnNcbiAgICAgKi9cbiAgICBBU1NFVF9PV05FUjogQXJyYXk8QXNzZXRPd25lcj47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHlvdSBkZXRlcm1pbmUgYW5kIHN1Ym1pdCBmb3IgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdXJhdGlvbiBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHlvdSByZXF1ZXN0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRcbiAgICAgKi9cbiAgICB1c2VyOiBBc3NldFJlcG9ydFVzZXI7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSBQbGFpZCBhYm91dCBlYWNoIG9mIHRoZSBJdGVtcyBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxBc3NldFJlcG9ydEl0ZW0+O1xufVxuLyoqXG4gKiBBIHNldCBvZiBmaWVsZHMgZGVzY3JpYmluZyB0aGUgYmFsYW5jZSBmb3IgYW4gYWNjb3VudC4gQmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgYmFsYW5jZSBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiBmdW5kcyBhdmFpbGFibGUgdG8gYmUgd2l0aGRyYXduIGZyb20gdGhlIGFjY291bnQsIGFzIGRldGVybWluZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgbGltaXRgIGxlc3MgdGhlIGBjdXJyZW50YCBiYWxhbmNlLCBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgdHlwaWNhbGx5IGVxdWFscyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgbGVzcyBhbnkgcGVuZGluZyBvdXRmbG93cyBwbHVzIGFueSBwZW5kaW5nIGluZmxvd3MuIEZvciBgZGVwb3NpdG9yeWAtdHlwZSBhY2NvdW50cywgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgZG9lcyBub3QgaW5jbHVkZSB0aGUgb3ZlcmRyYWZ0IGxpbWl0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBjYXNoIGF2YWlsYWJsZSB0byB3aXRoZHJhdyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYGF2YWlsYWJsZWAgIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUsIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGBhdmFpbGFibGVgIGJhbGFuY2UgdmFsdWUgb2YgYG51bGxgLiAgQXZhaWxhYmxlIGJhbGFuY2UgbWF5IGJlIGNhY2hlZCBhbmQgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgdXAtdG8tZGF0ZSBpbiByZWFsdGltZSB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIElmIGBjdXJyZW50YCBpcyBgbnVsbGAgdGhpcyBmaWVsZCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGF2YWlsYWJsZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIG9yIG93ZWQgYnkgdGhlIGFjY291bnQuICBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgYSBwb3NpdGl2ZSBiYWxhbmNlIGluZGljYXRlcyB0aGUgYW1vdW50IG93ZWQ7IGEgbmVnYXRpdmUgYW1vdW50IGluZGljYXRlcyB0aGUgbGVuZGVyIG93aW5nIHRoZSBhY2NvdW50IGhvbGRlci4gIEZvciBgbG9hbmAtdHlwZSBhY2NvdW50cywgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgcHJpbmNpcGFsIHJlbWFpbmluZyBvbiB0aGUgbG9hbiwgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHN0dWRlbnQgbG9hbiBhY2NvdW50cyBhdCBTYWxsaWUgTWFlIChgaW5zXzExNjk0NGApLiBGb3IgU2FsbGllIE1hZSBzdHVkZW50IGxvYW5zLCB0aGUgYWNjb3VudFxcJ3MgYmFsYW5jZSBpbmNsdWRlcyBib3RoIHByaW5jaXBhbCBhbmQgYW55IG91dHN0YW5kaW5nIGludGVyZXN0LiAgRm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzIChvciBgYnJva2VyYWdlYC10eXBlIGFjY291bnRzIGZvciBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciksIHRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIHZhbHVlIG9mIGFzc2V0cyBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZSB0aGF0IGJhbGFuY2UgaW5mb3JtYXRpb24gbWF5IGJlIGNhY2hlZCB1bmxlc3MgdGhlIHZhbHVlIHdhcyByZXR1cm5lZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YDsgaWYgdGhlIEl0ZW0gaXMgZW5hYmxlZCBmb3IgVHJhbnNhY3Rpb25zLCB0aGUgYmFsYW5jZSB3aWxsIGJlIGF0IGxlYXN0IGFzIHJlY2VudCBhcyB0aGUgbW9zdCByZWNlbnQgVHJhbnNhY3Rpb24gdXBkYXRlLiBJZiB5b3UgcmVxdWlyZSByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgYXMgcHJvdmlkZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBXaGVuIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLCB0aGlzIGZpZWxkIG1heSBiZSBgbnVsbGAuIFdoZW4gdGhpcyBoYXBwZW5zLCBgYXZhaWxhYmxlYCBpcyBndWFyYW50ZWVkIG5vdCB0byBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgY3JlZGl0IGxpbWl0LiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGlzIHJlcHJlc2VudHMgdGhlIHByZS1hcnJhbmdlZCBvdmVyZHJhZnQgbGltaXQsIHdoaWNoIGlzIGNvbW1vbiBmb3IgY3VycmVudCAoY2hlY2tpbmcpIGFjY291bnRzIGluIEV1cm9wZS4gIEluIE5vcnRoIEFtZXJpY2EsIHRoaXMgZmllbGQgaXMgdHlwaWNhbGx5IG9ubHkgYXZhaWxhYmxlIGZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsaW1pdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGJvcnJvd2VkIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBhcyBkZXRlcm1pbmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBpbnZlc3RtZW50LXR5cGUgYWNjb3VudHMsIHRoZSBtYXJnaW4gYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYm9ycm93ZWQgYXNzZXRzIGluIHRoZSBhY2NvdW50LCBhcyBwcmVzZW50ZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBUaGlzIGlzIGNvbW1vbmx5IHJlZmVycmVkIHRvIGFzIG1hcmdpbiBvciBhIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIG1hcmdpbl9sb2FuX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYmFsYW5jZS4gQWx3YXlzIG51bGwgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBY2NvdW50QmFsYW5jZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEFjY291bnRCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgYW5kIGV4cGVjdGVkIHdoZW4gdGhlIGluc3RpdHV0aW9uIGlzIGBpbnNfMTI4MDI2YCAoQ2FwaXRhbCBPbmUpIGFuZCB0aGUgSXRlbSBjb250YWlucyBvbmUgb3IgbW9yZSBhY2NvdW50cyB3aXRoIGEgbm9uLWRlcG9zaXRvcnkgYWNjb3VudCB0eXBlLCBpbiB3aGljaCBjYXNlIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgQ2FwaXRhbCBPbmUgZGVwb3NpdG9yeSBhY2NvdW50cyBhcyB3ZWxsIGFzIGFsbCBvdGhlciBhY2NvdW50IHR5cGVzIG9uIGFsbCBvdGhlciBpbnN0aXR1dGlvbnMsIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gU2VlIFthY2NvdW50IHR5cGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIGFjY291bnQgdHlwZXMuICBJZiB0aGUgYmFsYW5jZSB0aGF0IGlzIHB1bGxlZCBpcyBvbGRlciB0aGFuIHRoZSBnaXZlbiB0aW1lc3RhbXAgZm9yIEl0ZW1zIHdpdGggdGhpcyBmaWVsZCByZXF1aXJlZCwgYW4gYElOVkFMSURfUkVRVUVTVGAgZXJyb3Igd2l0aCB0aGUgY29kZSBvZiBgTEFTVF9VUERBVEVEX0RBVEVUSU1FX09VVF9PRl9SQU5HRWAgd2lsbCBiZSByZXR1cm5lZCB3aXRoIHRoZSBtb3N0IHJlY2VudCB0aW1lc3RhbXAgZm9yIHRoZSByZXF1ZXN0ZWQgYWNjb3VudCBjb250YWluZWQgaW4gdGhlIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QWNjb3VudEJhbGFuY2VcbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgQXNzZXQgUmVwb3J0LiAgYGZhc3RfYXNzZXRzYDogV2hlbiBGYXN0IEFzc2V0cyBpcyByZXF1ZXN0ZWQsIFBsYWlkIHdpbGwgY3JlYXRlIHR3byB2ZXJzaW9ucyBvZiB0aGUgQXNzZXQgUmVwb3J0OiB0aGUgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IElkZW50aXR5IGFuZCBCYWxhbmNlIGluZm9ybWF0aW9uLCBhbmQgdGhlIEZ1bGwgQXNzZXQgUmVwb3J0LCB3aGljaCB3aWxsIGFsc28gY29udGFpbiBUcmFuc2FjdGlvbnMgaW5mb3JtYXRpb24uIEEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2sgd2lsbCBiZSBmaXJlZCBmb3IgZWFjaCBBc3NldCBSZXBvcnQgd2hlbiBpdCBpcyByZWFkeSwgYW5kIHRoZSBgcmVwb3J0X3R5cGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgd2hldGhlciB0aGUgd2ViaG9vayBpcyBmaXJpbmcgZm9yIHRoZSBgZnVsbGAgb3IgYGZhc3RgIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgdGhlIEZhc3QgQXNzZXQgUmVwb3J0LCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgd2l0aCBgZmFzdF9yZXBvcnRgIHNldCB0byBgdHJ1ZWAuIFRoZXJlIGlzIG5vIGFkZGl0aW9uYWwgY2hhcmdlIGZvciB1c2luZyBGYXN0IEFzc2V0cy4gVG8gY3JlYXRlIGEgRmFzdCBBc3NldCBSZXBvcnQsIFBsYWlkIG11c3Qgc3VjY2Vzc2Z1bGx5IHJldHJpZXZlIGJvdGggSWRlbnRpdHkgYW5kIEJhbGFuY2UgZGF0YTsgaWYgUGxhaWQgZW5jb3VudGVycyBhbiBlcnJvciBvYnRhaW5pbmcgdGhpcyBkYXRhLCB0aGUgRmFzdCBBc3NldCBSZXBvcnQgd2lsbCBub3QgYmUgY3JlYXRlZC4gSG93ZXZlciwgYXMgbG9uZyBhcyBQbGFpZCBjYW4gb2J0YWluIFRyYW5zYWN0aW9ucyBkYXRhLCB0aGUgRnVsbCBBc3NldCBSZXBvcnQgd2lsbCBzdGlsbCBiZSBhdmFpbGFibGUuICBgaW52ZXN0bWVudHNgOiBSZXF1ZXN0IGFuIEFzc2V0IFJlcG9ydCB3aXRoIEludmVzdG1lbnRzLiBUaGlzIGFkZC1vbiBpcyBpbiBjbG9zZWQgYmV0YSBhbmQgbm90IGdlbmVyYWxseSBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFJlcG9ydEFkZE9ucyB7XG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEZhc3RBc3NldHMgPSAnZmFzdF9hc3NldHMnXG59XG5cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRvcl9pZGAgb2YgdGhlIHRoaXJkIHBhcnR5IHdpdGggd2hvbSB5b3Ugd291bGQgbGlrZSB0byBzaGFyZSB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGF1ZGl0b3JfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSBhdWRpdG9yIHRvIGFsbG93IHRoZW0gdG8gb2J0YWluIGFjY2VzcyB0byB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgQXVkaXQgQ29weSB5b3Ugd291bGQgbGlrZSB0byByZXZva2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEF1ZGl0IENvcHkgd2FzIHN1Y2Nlc3NmdWxseSByZW1vdmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEl0ZW1zIHRoYXQgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgcmVwb3J0LiBUaGUgYGFzc2V0c2AgcHJvZHVjdCBtdXN0IGhhdmUgYmVlbiBpbml0aWFsaXplZCBmb3IgdGhlIEl0ZW1zIGR1cmluZyBsaW5rOyB0aGUgQXNzZXRzIHByb2R1Y3QgY2Fubm90IGJlIGFkZGVkIGFmdGVyIGluaXRpYWxpemF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LiBJZiB1c2luZyBGYW5uaWUgTWFlIERheSAxIENlcnRhaW50eSwgYGRheXNfcmVxdWVzdGVkYCBtdXN0IGJlIGF0IGxlYXN0IDYxIGZvciBuZXcgb3JpZ2luYXRpb25zIG9yIGF0IGxlYXN0IDMxIGZvciByZWZpbmFuY2luZ3MuICBBbiBBc3NldCBSZXBvcnQgcmVxdWVzdGVkIHdpdGggXFxcIkFkZGl0aW9uYWwgSGlzdG9yeVxcXCIgKHRoYXQgaXMsIHdpdGggbW9yZSB0aGFuIDYxIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSkgd2lsbCBpbmN1ciBhbiBBZGRpdGlvbmFsIEhpc3RvcnkgZmVlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC4gVGhlIG9wdGlvbmFsIGB1c2VyYCBvYmplY3QgaXMgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnQgdG8gYmUgZWxpZ2libGUgZm9yIEZhbm5pZSBNYWVcXCdzIERheSAxIENlcnRhaW50eSBwcm9ncmFtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gd2hpY2ggUGxhaWQgd2lsbCBzZW5kIEFzc2V0cyB3ZWJob29rcywgZm9yIGV4YW1wbGUgd2hlbiB0aGUgcmVxdWVzdGVkIEFzc2V0IFJlcG9ydCBpcyByZWFkeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogdHJ1ZSB0byByZXR1cm4gYmFsYW5jZSBhbmQgaWRlbnRpdHkgZWFybGllciBhcyBhIGZhc3QgcmVwb3J0LiBEZWZhdWx0cyB0byBmYWxzZSBpZiBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2Zhc3RfcmVwb3J0PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgYXNzZXQgcmVwb3J0LiBQb3NzaWJsZSB2YWx1ZXM6IGBcXFwiaW52ZXN0bWVudHNcXFwiYFxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgQXNzZXQgUmVwb3J0LiBUbyBmZXRjaCBgaW52ZXN0bWVudHNgIGRhdGEgKHRyYW5zYWN0aW9ucywgaG9sZGluZ3MsIGV0Yy4pIGluIHRoZSBBc3NldCBSZXBvcnQsIGBpbnZlc3RtZW50c2AgbXVzdCBiZSBzcGVjaWZpZWQgaW4gYGFkZF9vbnNgLiBGb3IgRmFzdCBBc3NldHMsIGBmYXN0X2Fzc2V0c2AgbXVzdCBiZSBzcGVjaWZpZWQgaW4gYGFkZF9vbnNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFJlcG9ydEFkZE9ucz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhZGRfb25zPzogQXJyYXk8QXNzZXRSZXBvcnRBZGRPbnM+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xuICAgIC8qKlxuICAgICAqIElmIHNldCB0byBmYWxzZSwgb25seSAxIGl0ZW0gbXVzdCBiZSBoZWFsdGh5IGF0IHRoZSB0aW1lIG9mIHJlcG9ydCBjcmVhdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZSwgd2hpY2ggd291bGQgcmVxdWlyZSBhbGwgaXRlbXMgdG8gYmUgaGVhbHRoeSBhdCB0aGUgdGltZSBvZiByZXBvcnQgY3JlYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1aXJlX2FsbF9pdGVtcz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyB0byBleGNsdWRlIGZyb20gdGhlIEFzc2V0IFJlcG9ydCwgaWRlbnRpZmllZCBieSBgYWNjb3VudF9pZGAuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3RvX2V4Y2x1ZGU6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgc2NoZW1hLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2Fuc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgTE9BTlM6IExvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0aWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVcbiAgICAgKi9cbiAgICBQQVJUSUVTOiBQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlc31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllXG4gICAgICovXG4gICAgU0VSVklDRVM6IFNlcnZpY2VzO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciB0byBhbGxvdyB0aGVtIHRvIG9idGFpbiBhY2Nlc3MgdG8gdGhlIEFzc2V0IFJlcG9ydC4gVGhpcyB0b2tlbiBzaG91bGQgYmUgc3RvcmVkIHNlY3VyZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0RnJlZGRpZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBBc3NldFJlcG9ydEZyZWRkaWU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0RnJlZGRpZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChha2EgVk9BIG9yIEZyZWRkaWUgTWFjIFNjaGVtYSkgc2NoZW1hIHZlcnNpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBlbmRwb2ludHMgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIHRvIGZldGNoIG9yIHVwZGF0ZSBhbiBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBmb3Igd2hpY2ggdG8gY3JlYXRlIGFuIGFzc2V0IHJlcG9ydCBmb3IuIFRoZSBsYXRlc3QgYXNzZXQgcmVwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB3aWxsIGJlIHJldHVybmVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgeW91IHdvdWxkIGxpa2UgdG8gcmV0cmlldmUgdGhlIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBgZmFsc2VgIG90aGVyd2lzZS4gVGhpcyBmaWVsZCBkZWZhdWx0cyB0byBgZmFsc2VgIGlmIG9taXR0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGluY2x1ZGVfaW5zaWdodHM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCB0byBmZXRjaCBcXFwiZmFzdFxcXCIgdmVyc2lvbiBvZiBhc3NldCByZXBvcnQuIERlZmF1bHRzIHRvIGZhbHNlIGlmIG9taXR0ZWQuIENhbiBvbmx5IGJlIHVzZWQgaWYgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3YXMgY2FsbGVkIHdpdGggYG9wdGlvbnMuYWRkX29uc2Agc2V0IHRvIGBbXFxcImZhc3RfYXNzZXRzXFxcIl1gLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBmYXN0X3JlcG9ydD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBc3NldFJlcG9ydEdldFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIG9yIGFkZCBkYXRhIHRvIGAvYXNzZXRfcmVwb3J0L2dldGAgcmVzdWx0cy4gSWYgcHJvdmlkZWQsIG11c3QgYmUgbm9uLWBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3RvX2luY2x1ZGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBBc3NldFJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGlkZW50aXR5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSByZXR1cm5lZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8V2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc2VjdXJpdGllcyBob2xkaW5nIGF0IGFuIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYHNlY3VyaXR5X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIFNlY3VyaXR5IGRhdGEgaXMgbm90IHNwZWNpZmljIHRvIGEgdXNlclxcJ3MgYWNjb3VudDsgYW55IHVzZXIgd2hvIGhlbGQgdGhlIHNhbWUgc2VjdXJpdHkgYXQgdGhlIHNhbWUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGF0IHRoZSBzYW1lIHRpbWUgd291bGQgaGF2ZSBpZGVudGljYWwgc2VjdXJpdHkgZGF0YS4gVGhlIGBzZWN1cml0eV9pZGAgZm9yIHRoZSBzYW1lIHNlY3VyaXR5IHdpbGwgdHlwaWNhbGx5IGJlIHRoZSBzYW1lIGFjcm9zcyBkaWZmZXJlbnQgaW5zdGl0dXRpb25zLCBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4gVGhlIGBzZWN1cml0eV9pZGAgZG9lcyBub3QgdHlwaWNhbGx5IGNoYW5nZSwgYnV0IG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHNlY3VyaXR5X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdcXCdzIHRyYWRpbmcgc3ltYm9sIGZvciBwdWJsaWNseSB0cmFkZWQgaG9sZGluZ3MsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3ByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggYGluc3RpdHV0aW9uX3ByaWNlYCB3YXMgY3VycmVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfYXNfb2Y/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hbCB0b3RhbCB2YWx1ZSBvZiB0aGUgaG9sZGluZy4gVGhpcyBmaWVsZCBpcyBjYWxjdWxhdGVkIGJ5IFBsYWlkIGFzIHRoZSBzdW0gb2YgdGhlIHB1cmNoYXNlIHByaWNlIG9mIGFsbCBvZiB0aGUgc2hhcmVzIGluIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50SG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50IHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuIFRoZSBgc2VjdXJpdHlfaWRgIG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50U2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR5IHR5cGUgb2YgdGhlIGhvbGRpbmcuIFZhbGlkIHNlY3VyaXR5IHR5cGVzIGFyZTogIGBjYXNoYDogQ2FzaCwgY3VycmVuY3ksIGFuZCBtb25leSBtYXJrZXQgZnVuZHMgIGBjcnlwdG9jdXJyZW5jeWA6IERpZ2l0YWwgb3IgdmlydHVhbCBjdXJyZW5jaWVzICBgZGVyaXZhdGl2ZWA6IE9wdGlvbnMsIHdhcnJhbnRzLCBhbmQgb3RoZXIgZGVyaXZhdGl2ZSBpbnN0cnVtZW50cyAgYGVxdWl0eWA6IERvbWVzdGljIGFuZCBmb3JlaWduIGVxdWl0aWVzICBgZXRmYDogTXVsdGktYXNzZXQgZXhjaGFuZ2UtdHJhZGVkIGludmVzdG1lbnQgZnVuZHMgIGBmaXhlZCBpbmNvbWVgOiBCb25kcyBhbmQgY2VydGlmaWNhdGVzIG9mIGRlcG9zaXQgKENEcykgIGBsb2FuYDogTG9hbnMgYW5kIGxvYW4gcmVjZWl2YWJsZXMgIGBtdXR1YWwgZnVuZGA6IE9wZW4tIGFuZCBjbG9zZWQtZW5kIHZlaGljbGVzIHBvb2xpbmcgZnVuZHMgb2YgbXVsdGlwbGUgaW52ZXN0b3JzICBgb3RoZXJgOiBVbmtub3duIG9yIG90aGVyIGludmVzdG1lbnQgdHlwZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRTZWN1cml0eVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gd2l0aGluIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0SW52ZXN0bWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSW52ZXN0bWVudCB0cmFuc2FjdGlvbiwgdW5pcXVlIGFjcm9zcyBhbGwgUGxhaWQgdHJhbnNhY3Rpb25zLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYWdhaW5zdCB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIHBvc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2VjdXJpdHlfaWRgIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gaXMgcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgc2VjdXJpdHlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHBvc3RpbmcgZGF0ZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGluc3RpdHV0aW9u4oCZcyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZSBzZWN1cml0eSBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSBmb3IgYnV5IHRyYW5zYWN0aW9uczsgbmVnYXRpdmUgZm9yIHNlbGwgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBxdWFudGl0eTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB2ZXN0ZWQgYXNzZXRzIGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFZlc3RlZCBhc3NldHMgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIFtlcXVpdGllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzLWhvbGRpbmdzLWdldC1yZXNwb25zZS1zZWN1cml0aWVzLXR5cGUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB2ZXN0ZWRfcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHZlc3RlZCBob2xkaW5ncyBhcyByZXBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIHZlc3RlZF92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wbGV0ZSB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24uIFBvc2l0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgZGViaXRlZCwgZS5nLiBwdXJjaGFzZXMgb2Ygc3RvY2s7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIGNhc2ggaXMgY3JlZGl0ZWQsIGUuZy4gc2FsZXMgb2Ygc3RvY2suIFRyZWF0bWVudCByZW1haW5zIHRoZSBzYW1lIGZvciBjYXNoLW9ubHkgbW92ZW1lbnRzIHVuYXNzb2NpYXRlZCB3aXRoIHNlY3VyaXRpZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGZlZXM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRUcmFuc2FjdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB0eXBlOiBJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgc3VidHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEludmVzdG1lbnRzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYW4gQXNzZXQgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoaXMgSXRlbeKAmXMgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRJdGVtXG4gICAgICovXG4gICAgZGF0ZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRhIGFib3V0IGVhY2ggb2YgdGhlIGFjY291bnRzIG9wZW4gb24gdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBc3NldHM+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEFzc2V0cz47XG59XG4vKipcbiAqIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gZW5kcG9pbnRzIHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCB0byBmZXRjaCBvciB1cGRhdGUgYW4gQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBvciBhZGQgZGF0YSB0byBgL2Fzc2V0X3JlcG9ydC9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3NldFJlcG9ydFBERkdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3RvX2luY2x1ZGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCByZXR1cm5lZCBieSB0aGUgb3JpZ2luYWwgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQXNzZXQgUmVwb3J0LiBNdXN0IGJlIGFuIGludGVnZXIuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSB2YWx1ZSBmcm9tIHRoZSBvcmlnaW5hbCBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLiBJZiBub3Qgc3BlY2lmaWVkLCB0aGUgYG9wdGlvbnNgIGZyb20gdGhlIG9yaWdpbmFsIGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aWxsIGJlIHVzZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVSTCB0byB3aGljaCBQbGFpZCB3aWxsIHNlbmQgQXNzZXRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgQXNzZXQgUmVwb3J0IGlzIHJlYWR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0UmVwb3J0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB1c2VyPzogQXNzZXRSZXBvcnRVc2VyO1xufVxuLyoqXG4gKiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEFzc2V0IFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHByb3ZpZGVkIHRvIGVuZHBvaW50cyBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgdG8gZmV0Y2ggb3IgdXBkYXRlIGFuIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldF9yZXBvcnRfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXNzZXQgUmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIGFzc2V0IHJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0dGxlZCB2YWx1ZSBvZiB0aGUgdHJhbnNhY3Rpb24sIGRlbm9taW5hdGVkIGluIHRoZSB0cmFuc2FjdGlvblxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgVGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBUaGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVkaXRfY2F0ZWdvcnk/OiBDcmVkaXRDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgcGVuZGluZyB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkOyBmb3IgcG9zdGVkIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gcG9zdGVkLiBCb3RoIGRhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSB0cmFuc2FjdGlvbiB0b29rIHBsYWNlLCBpbiBJUzAgODYwMSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb24/OiBMb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSBvciB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbi4gIFRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgbmFtZSwgYXMgZW5yaWNoZWQgYnkgUGxhaWQgZnJvbSB0aGUgYG5hbWVgIGZpZWxkLiBUaGlzIGlzIHR5cGljYWxseSBhIG1vcmUgaHVtYW4tcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgbWVyY2hhbnQgY291bnRlcnBhcnR5IGluIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHNvbWUgYmFuayB0cmFuc2FjdGlvbnMgKHN1Y2ggYXMgY2hlY2tzIG9yIGFjY291bnQgdHJhbnNmZXJzKSB3aGVyZSB0aGVyZSBpcyBubyBtZWFuaW5nZnVsIG1lcmNoYW50IG5hbWUsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfbWV0YT86IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgYSBwb3N0ZWQgdHJhbnNhY3Rpb25cXCdzIGFzc29jaWF0ZWQgcGVuZGluZyB0cmFuc2FjdGlvbiwgd2hlcmUgYXBwbGljYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXIuIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X293bmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3R5cGU/OiBBc3NldFJlcG9ydFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHRocmVlIHR5cGVzLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0UmVwb3J0VHJhbnNhY3Rpb25UeXBlIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgZWl0aGVyIGEgRmFzdCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgY29udGFpbiBvbmx5IGN1cnJlbnQgaWRlbnRpdHkgYW5kIGJhbGFuY2UgaW5mb3JtYXRpb24sIG9yIGEgRnVsbCBBc3NldCBSZXBvcnQsIHdoaWNoIHdpbGwgYWxzbyBjb250YWluIGhpc3RvcmljYWwgYmFsYW5jZSBpbmZvcm1hdGlvbiBhbmQgdHJhbnNhY3Rpb24gZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEFzc2V0UmVwb3J0VHlwZSB7XG4gICAgRnVsbCA9ICdGVUxMJyxcbiAgICBGYXN0ID0gJ0ZBU1QnXG59XG5cbi8qKlxuICogVGhlIHVzZXIgb2JqZWN0IGFsbG93cyB5b3UgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBBc3NldCBSZXBvcnQuIEFsbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBUaGUgYGZpcnN0X25hbWVgLCBgbGFzdF9uYW1lYCwgYW5kIGBzc25gIGZpZWxkcyBhcmUgcmVxdWlyZWQgaWYgeW91IHdvdWxkIGxpa2UgdGhlIFJlcG9ydCB0byBiZSBlbGlnaWJsZSBmb3IgRmFubmllIE1hZeKAmXMgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0UmVwb3J0VXNlciB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB5b3UgZGV0ZXJtaW5lIGFuZCBzdWJtaXQgZm9yIHRoZSB1c2VyLiBJZiB1c2luZyB0aGUgQ3JlZGl0IERhc2hib2FyZCwgQ3VzdG9tZXJzIHNob3VsZCBwYXNzIGluIHRoZSBgdXNlcl90b2tlbmAgY3JlYXRlZCBpbiBgL3VzZXIvY3JlYXRlYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWUuIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgbWlkZGxlIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxhc3QgbmFtZS4gIFJlcXVpcmVkIGZvciB0aGUgRmFubmllIE1hZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBTb2NpYWwgU2VjdXJpdHkgTnVtYmVyLiBSZXF1aXJlZCBmb3IgdGhlIEZhbm5pZSBNYWUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0uICBGb3JtYXQ6IFxcXCJkZGQtZGQtZGRkZFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFJlcG9ydFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0UmVwb3J0VXNlclxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZy4uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0VHJhbnNhY3Rpb25EZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTl9ERVRBSUw6IEFzc2V0VHJhbnNhY3Rpb25EZXRhaWw7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldFRyYW5zYWN0aW9uRGVzY3JpcHRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRPTjogQXJyYXk8QXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uPjtcbn1cbi8qKlxuICogQXNzZXQgVHJhbnNhY3Rpb24gQ2F0ZWdvcnkgVHlwZSBFbnVtZXJhdGVkIGRlcml2ZWQgYnkgVmVuZG9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB7XG4gICAgQXRtRmVlID0gJ0FUTUZlZScsXG4gICAgQWR2ZXJ0aXNpbmcgPSAnQWR2ZXJ0aXNpbmcnLFxuICAgIEFpclRyYXZlbCA9ICdBaXJUcmF2ZWwnLFxuICAgIEFsY29ob2xCYXJzID0gJ0FsY29ob2xCYXJzJyxcbiAgICBBbGxvd2FuY2UgPSAnQWxsb3dhbmNlJyxcbiAgICBBbXVzZW1lbnQgPSAnQW11c2VtZW50JyxcbiAgICBBcnRzID0gJ0FydHMnLFxuICAgIEF1dG9UcmFuc3BvcnQgPSAnQXV0b1RyYW5zcG9ydCcsXG4gICAgQXV0b0luc3VyYW5jZSA9ICdBdXRvSW5zdXJhbmNlJyxcbiAgICBBdXRvUGF5bWVudCA9ICdBdXRvUGF5bWVudCcsXG4gICAgQmFieVN1cHBsaWVzID0gJ0JhYnlTdXBwbGllcycsXG4gICAgQmFieXNpdHRlckRheWNhcmUgPSAnQmFieXNpdHRlckRheWNhcmUnLFxuICAgIEJhbmtGZWUgPSAnQmFua0ZlZScsXG4gICAgQmlsbHNVdGlsaXRpZXMgPSAnQmlsbHNVdGlsaXRpZXMnLFxuICAgIEJvbnVzID0gJ0JvbnVzJyxcbiAgICBCb29rc1N1cHBsaWVzID0gJ0Jvb2tzU3VwcGxpZXMnLFxuICAgIEJ1c2luZXNzU2VydmljZXMgPSAnQnVzaW5lc3MgU2VydmljZXMnLFxuICAgIEJ1eSA9ICdCdXknLFxuICAgIENhc2hBdG0gPSAnQ2FzaEFUTScsXG4gICAgQ2hhcml0eSA9ICdDaGFyaXR5JyxcbiAgICBDaGVjayA9ICdDaGVjaycsXG4gICAgQ2hpbGRTdXBwb3J0ID0gJ0NoaWxkU3VwcG9ydCcsXG4gICAgQ2xvdGhpbmcgPSAnQ2xvdGhpbmcnLFxuICAgIENvZmZlZVNob3BzID0gJ0NvZmZlZVNob3BzJyxcbiAgICBDcmVkaXRDYXJkUGF5bWVudCA9ICdDcmVkaXRDYXJkUGF5bWVudCcsXG4gICAgRGVudGlzdCA9ICdEZW50aXN0JyxcbiAgICBEb2N0b3IgPSAnRG9jdG9yJyxcbiAgICBFZHVjYXRpb24gPSAnRWR1Y2F0aW9uJyxcbiAgICBFbGVjdHJvbmljc1NvZnR3YXJlID0gJ0VsZWN0cm9uaWNzU29mdHdhcmUnLFxuICAgIEVudGVydGFpbm1lbnQgPSAnRW50ZXJ0YWlubWVudCcsXG4gICAgRXllY2FyZSA9ICdFeWVjYXJlJyxcbiAgICBGYXN0Rm9vZCA9ICdGYXN0Rm9vZCcsXG4gICAgRmVkZXJhbFRheCA9ICdGZWRlcmFsVGF4JyxcbiAgICBGZWVzQ2hhcmdlcyA9ICdGZWVzQ2hhcmdlcycsXG4gICAgRmluYW5jZUNoYXJnZSA9ICdGaW5hbmNlQ2hhcmdlJyxcbiAgICBGaW5hbmNpYWwgPSAnRmluYW5jaWFsJyxcbiAgICBGaW5hbmNpYWxBZHZpc29yID0gJ0ZpbmFuY2lhbEFkdmlzb3InLFxuICAgIEZvb2REaW5pbmcgPSAnRm9vZERpbmluZycsXG4gICAgRnVybmlzaGluZ3MgPSAnRnVybmlzaGluZ3MnLFxuICAgIEdhc0Z1ZWwgPSAnR2FzRnVlbCcsXG4gICAgR2lmdHNEb25hdGlvbnMgPSAnR2lmdHNEb25hdGlvbnMnLFxuICAgIEdyb2NlcmllcyA9ICdHcm9jZXJpZXMnLFxuICAgIEd5bSA9ICdHeW0nLFxuICAgIEhhaXIgPSAnSGFpcicsXG4gICAgSGVhbHRoRml0bmVzcyA9ICdIZWFsdGhGaXRuZXNzJyxcbiAgICBIZWFsdGhJbnN1cmFuY2UgPSAnSGVhbHRoSW5zdXJhbmNlJyxcbiAgICBIb2JiaWVzID0gJ0hvYmJpZXMnLFxuICAgIEhvbWUgPSAnSG9tZScsXG4gICAgSG9tZUltcHJvdmVtZW50ID0gJ0hvbWVJbXByb3ZlbWVudCcsXG4gICAgSG9tZUluc3VyYW5jZSA9ICdIb21lSW5zdXJhbmNlJyxcbiAgICBIb21lUGhvbmUgPSAnSG9tZVBob25lJyxcbiAgICBIb21lU2VydmljZXMgPSAnSG9tZVNlcnZpY2VzJyxcbiAgICBIb21lU3VwcGxpZXMgPSAnSG9tZVN1cHBsaWVzJyxcbiAgICBIb3RlbCA9ICdIb3RlbCcsXG4gICAgSW5jb21lID0gJ0luY29tZScsXG4gICAgSW50ZXJlc3RJbmNvbWUgPSAnSW50ZXJlc3RJbmNvbWUnLFxuICAgIEludGVybmV0ID0gJ0ludGVybmV0JyxcbiAgICBJbnZlc3RtZW50cyA9ICdJbnZlc3RtZW50cycsXG4gICAgS2lkcyA9ICdLaWRzJyxcbiAgICBLaWRzQWN0aXZpdGllcyA9ICdLaWRzQWN0aXZpdGllcycsXG4gICAgTGF0ZUZlZSA9ICdMYXRlRmVlJyxcbiAgICBMYXVuZHJ5ID0gJ0xhdW5kcnknLFxuICAgIExhd25HYXJkZW4gPSAnTGF3bkdhcmRlbicsXG4gICAgTGVnYWwgPSAnTGVnYWwnLFxuICAgIExpZmVJbnN1cmFuY2UgPSAnTGlmZUluc3VyYW5jZScsXG4gICAgTG9hbkluc3VyYW5jZSA9ICdMb2FuSW5zdXJhbmNlJyxcbiAgICBMb2FuUGF5bWVudCA9ICdMb2FuUGF5bWVudCcsXG4gICAgTG9hbnMgPSAnTG9hbnMnLFxuICAgIE1vYmlsZVBob25lID0gJ01vYmlsZVBob25lJyxcbiAgICBNb3J0Z2FnZVJlbnQgPSAnTW9ydGdhZ2VSZW50JyxcbiAgICBNb3ZpZXNEdmRzID0gJ01vdmllc0RWRHMnLFxuICAgIE11c2ljID0gJ011c2ljJyxcbiAgICBOZXdzcGFwZXJzTWFnYXppbmVzID0gJ05ld3NwYXBlcnNNYWdhemluZXMnLFxuICAgIE9mZmljZVN1cHBsaWVzID0gJ09mZmljZVN1cHBsaWVzJyxcbiAgICBQYXJraW5nID0gJ1BhcmtpbmcnLFxuICAgIFBheWNoZWNrID0gJ1BheWNoZWNrJyxcbiAgICBQZXJzb25hbENhcmUgPSAnUGVyc29uYWxDYXJlJyxcbiAgICBQZXRGb29kU3VwcGxpZXMgPSAnUGV0Rm9vZFN1cHBsaWVzJyxcbiAgICBQZXRHcm9vbWluZyA9ICdQZXRHcm9vbWluZycsXG4gICAgUGV0cyA9ICdQZXRzJyxcbiAgICBQaGFybWFjeSA9ICdQaGFybWFjeScsXG4gICAgUHJpbnRpbmcgPSAnUHJpbnRpbmcnLFxuICAgIFByb3BlcnR5VGF4ID0gJ1Byb3BlcnR5IFRheCcsXG4gICAgUHVibGljVHJhbnNwb3J0YXRpb24gPSAnUHVibGljIFRyYW5zcG9ydGF0aW9uJyxcbiAgICBSZWltYnVyc2VtZW50ID0gJ1JlaW1idXJzZW1lbnQnLFxuICAgIFJlbnRhbENhclRheGkgPSAnUmVudGFsQ2FyVGF4aScsXG4gICAgUmVzdGF1cmFudHMgPSAnUmVzdGF1cmFudHMnLFxuICAgIFNhbGVzVGF4ID0gJ1NhbGVzVGF4JyxcbiAgICBTZXJ2aWNlUGFydHMgPSAnU2VydmljZVBhcnRzJyxcbiAgICBTZXJ2aWNlRmVlID0gJ1NlcnZpY2VGZWUnLFxuICAgIFNoaXBwaW5nID0gJ1NoaXBwaW5nJyxcbiAgICBTaG9wcGluZyA9ICdTaG9wcGluZycsXG4gICAgU3BhTWFzc2FnZSA9ICdTcGFNYXNzYWdlJyxcbiAgICBTcG9ydGluZ0dvb2RzID0gJ1Nwb3J0aW5nR29vZHMnLFxuICAgIFNwb3J0cyA9ICdTcG9ydHMnLFxuICAgIFN0YXRlVGF4ID0gJ1N0YXRlVGF4JyxcbiAgICBTdHVkZW50TG9hbiA9ICdTdHVkZW50IExvYW4nLFxuICAgIFRheGVzID0gJ1RheGVzJyxcbiAgICBUZWxldmlzaW9uID0gJ1RlbGV2aXNpb24nLFxuICAgIFRveXMgPSAnVG95cycsXG4gICAgVHJhbnNmZXIgPSAnVHJhbnNmZXInLFxuICAgIFRyYXZlbCA9ICdUcmF2ZWwnLFxuICAgIFR1aXRpb24gPSAnVHVpdGlvbicsXG4gICAgVW5jYXRlZ29yaXplZCA9ICdVbmNhdGVnb3JpemVkJyxcbiAgICBVdGlsaXRpZXMgPSAnVXRpbGl0aWVzJyxcbiAgICBWYWNhdGlvbiA9ICdWYWNhdGlvbicsXG4gICAgVmV0ZXJpbmFyeSA9ICdWZXRlcmluYXJ5J1xufVxuXG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uIHtcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBEZXNjcmlwdGlvbiBTdHJpbmcgdXAgdG8gMyBvY2N1cmFuY2VzIDEgcmVxdWlyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWwge1xuICAgIC8qKlxuICAgICAqIEEgdmVuZG9yIGNyZWF0ZWQgdW5pcXVlIElkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25VbmlxdWVJZGVudGlmaWVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gQW1vdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uQW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQXNzZXQgVHJhbnNhY3Rpb24gRGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBc3NldCBUcmFuc2FjdGlvbiBQb3N0IERhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25Qb3N0RGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25UeXBlOiBBc3NldFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBQb3B1bGF0ZSB3aXRoIHdobyBkaWQgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25EZXRhaWxcbiAgICAgKi9cbiAgICBBc3NldFRyYW5zYWN0aW9uUGFpZEJ5TmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGSSBQcm92aWRlZCAtIGV4YW1wbGVzIGFyZSBhdG0sIGNhc2gsIGNoZWNrLCBjcmVkaXQsIGRlYml0LCBkZXBvc2l0LCBkaXJlY3REZWJpdCwgZGlyZWN0RGVwb3NpdCwgZGl2aWRlbmQsIGZlZSwgaW50ZXJlc3QsIG90aGVyLCBwYXltZW50LCBwb2ludE9mU2FsZSwgcmVwZWF0UGF5bWVudCwgc2VydmljZUNoYXJnZSwgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRUcmFuc2FjdGlvbkRldGFpbFxuICAgICAqL1xuICAgIEFzc2V0VHJhbnNhY3Rpb25UeXBlQWRkaXRpb25hbERlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uQ2F0ZWdvcnlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZTogQXNzZXRUcmFuc2FjdGlvbkNhdGVnb3J5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRkkgcHJvdmlkZWQgVHJhbnNhY3Rpb24gSWRlbnRpZmllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldFRyYW5zYWN0aW9uRGV0YWlsXG4gICAgICovXG4gICAgRmluYW5jaWFsSW5zdGl0dXRpb25UcmFuc2FjdGlvbklkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFzc2V0IFRyYW5zYWN0aW9uIFR5cGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBBc3NldFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgQ3JlZGl0ID0gJ0NyZWRpdCcsXG4gICAgRGViaXQgPSAnRGViaXQnXG59XG5cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBc3NldFRyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0VHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QXNzZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0VHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBBIHZhbHVlIGZyb20gYSBNSVNNTyBwcmVzY3JpYmVkIGxpc3QgdGhhdCBzcGVjaWZpZXMgZmluYW5jaWFsIGFzc2V0cyBpbiBhIG1vcnRnYWdlIGxvYW4gdHJhbnNhY3Rpb24uIEFzc2V0cyBtYXkgYmUgZWl0aGVyIGxpcXVpZCBvciBmaXhlZCBhbmQgYXJlIGFzc29jaWF0ZWQgd2l0aCBhIGNvcnJlc3BvbmRpbmcgYXNzZXQgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXNzZXRUeXBlIHtcbiAgICBDaGVja2luZ0FjY291bnQgPSAnQ2hlY2tpbmdBY2NvdW50JyxcbiAgICBTYXZpbmdzQWNjb3VudCA9ICdTYXZpbmdzQWNjb3VudCcsXG4gICAgSW52ZXN0bWVudCA9ICdJbnZlc3RtZW50JyxcbiAgICBNb25leU1hcmtldEZ1bmQgPSAnTW9uZXlNYXJrZXRGdW5kJyxcbiAgICBPdGhlciA9ICdPdGhlcidcbn1cblxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0cyB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtBcnJheTxBc3NldD59XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1xuICAgICAqL1xuICAgIEFTU0VUOiBBcnJheTxBc3NldD47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gQXNzZXQgUmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gVGhlIHJlc3VsdGluZyBgZXJyb3JgIHdpbGwgaGF2ZSBhbiBgZXJyb3JfdHlwZWAgb2YgYEFTU0VUX1JFUE9SVF9FUlJPUmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0c0Vycm9yV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFTU0VUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBBc3NldCBSZXBvcnQgaGFzIGJlZW4gZ2VuZXJhdGVkIGFuZCBgL2Fzc2V0X3JlcG9ydC9nZXRgIGlzIHJlYWR5IHRvIGJlIGNhbGxlZC4gIElmIHlvdSBhdHRlbXB0IHRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCBiZWZvcmUgdGhpcyB3ZWJob29rIGhhcyBmaXJlZCwgeW914oCZbGwgcmVjZWl2ZSBhIHJlc3BvbnNlIHdpdGggdGhlIEhUVFAgc3RhdHVzIGNvZGUgNDAwIGFuZCBhIFBsYWlkIGVycm9yIGNvZGUgb2YgYFBST0RVQ1RfTk9UX1JFQURZYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBU1NFVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQUk9EVUNUX1JFQURZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFzc2V0X3JlcG9ydF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgQXNzZXQgUmVwb3J0IHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXNzZXRzUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgVXNlciBJRCB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEFzc2V0c1Byb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZT86IEFzc2V0UmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBc3NldHNQcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUGxhaWQgd2lsbCB0cmlnZ2VyIGEgYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIGZvciBJdGVtcyB0aGF0IHVuZGVyZ28gYSBjaGFuZ2UgaW4gQXV0aCBkYXRhLiBUaGlzIGlzIGdlbmVyYWxseSBjYXVzZWQgYnkgZGF0YSBwYXJ0bmVycyBub3RpZnlpbmcgUGxhaWQgb2YgYSBjaGFuZ2UgaW4gdGhlaXIgYWNjb3VudCBudW1iZXJpbmcgc3lzdGVtIG9yIHRvIHRoZWlyIHJvdXRpbmcgbnVtYmVycy4gVG8gYXZvaWQgcmV0dXJuZWQgdHJhbnNhY3Rpb25zLCBjdXN0b21lcnMgdGhhdCByZWNlaXZlIGEgYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHdpdGggdGhlIGBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfYXV0aGAgb2JqZWN0IHBvcHVsYXRlZCBzaG91bGQgaW1tZWRpYXRlbHkgZGlzY29udGludWUgYWxsIHVzYWdlcyBvZiBleGlzdGluZyBBdXRoIGRhdGEgZm9yIHRob3NlIGFjY291bnRzIGFuZCBjYWxsIGAvYXV0aC9nZXRgIG9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCB0byBvYnRhaW4gdXBkYXRlZCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEFVVEhgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgXFwncyBmb3IgYWNjb3VudHMgdGhhdCBjb250YWluIG5ldyBhdXRoLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX25ld19hdXRoOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBhdXRoIGF0dHJpYnV0ZXMgdGhhdCBjaGFuZ2VkLiBgQUNDT1VOVF9OVU1CRVJgIGFuZCBgUk9VVElOR19OVU1CRVJgIGFyZSB0aGUgdHdvIHBvdGVudGlhbCB2YWx1ZXMgdGhhdCBjYW4gYmUgZmxhZ2dlZCBhcyB1cGRhdGVkLiAgRXhhbXBsZTogYHsgXFxcIlhNQnZ2eU1HUTFVb0xiS0J5b01xSDNuWE1qODRBTFNkRTVCNThcXFwiOiBbXFxcIkFDQ09VTlRfTlVNQkVSXFxcIl0gfWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogQXJyYXk8QXV0aFVwZGF0ZVR5cGVzPjsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHNfd2l0aF91cGRhdGVkX2F1dGg6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8QXV0aFVwZGF0ZVR5cGVzPjsgfTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGlkZW50aWZ5aW5nIG51bWJlcnMgdXNlZCBmb3IgbWFraW5nIGVsZWN0cm9uaWMgdHJhbnNmZXJzIHRvIGFuZCBmcm9tIHRoZSBgYWNjb3VudHNgLiBUaGUgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgKEFDSCwgRUZULCBJQkFOLCBvciBCQUNTKSB1c2VkIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3VudHJ5IG9mIHRoZSBhY2NvdW50LiBBbiBhY2NvdW50IG1heSBoYXZlIG1vcmUgdGhhbiBvbmUgbnVtYmVyIHR5cGUuIElmIGEgcGFydGljdWxhciBpZGVudGlmeWluZyBudW1iZXIgdHlwZSBpcyBub3QgdXNlZCBieSBhbnkgYGFjY291bnRzYCBmb3Igd2hpY2ggZGF0YSBoYXMgYmVlbiByZXF1ZXN0ZWQsIHRoZSBhcnJheSBmb3IgdGhhdCB0eXBlIHdpbGwgYmUgZW1wdHkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhHZXROdW1iZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldE51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEFDSCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzQUNIPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2g6IEFycmF5PE51bWJlcnNBQ0g+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIEVGVCBudW1iZXJzIGlkZW50aWZ5aW5nIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxOdW1iZXJzRUZUPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnQ6IEFycmF5PE51bWJlcnNFRlQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIElCQU4gbnVtYmVycyBpZGVudGlmeWluZyBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0ludGVybmF0aW9uYWw+fVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGludGVybmF0aW9uYWw6IEFycmF5PE51bWJlcnNJbnRlcm5hdGlvbmFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBCQUNTIG51bWJlcnMgaWRlbnRpZnlpbmcgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PE51bWJlcnNCQUNTPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldE51bWJlcnNcbiAgICAgKi9cbiAgICBiYWNzOiBBcnJheTxOdW1iZXJzQkFDUz47XG59XG4vKipcbiAqIEF1dGhHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aEdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBBdXRoR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9hdXRoL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aEdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBBdXRoR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudHNgIGZvciB3aGljaCBudW1iZXJzIGFyZSBiZWluZyByZXRyaWV2ZWQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXV0aEdldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIEF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IEF1dGhHZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIHRoYXQgY2FwdHVyZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEF1dGggZmVhdHVyZXMgb2YgYW4gaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhTdXBwb3J0ZWRNZXRob2RzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRoTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdXBwb3J0ZWRfbWV0aG9kczogQXV0aFN1cHBvcnRlZE1ldGhvZHMgfCBudWxsO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB3aGljaCBhdXRoIG1ldGhvZHMgYW4gaW5zdGl0dXRpb24gc3VwcG9ydHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXV0aFN1cHBvcnRlZE1ldGhvZHMge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBpbnN0YW50IGF1dGggaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfYXV0aDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgaW5zdGFudCBtYXRjaCBpcyBzdXBwb3J0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEF1dGhTdXBwb3J0ZWRNZXRob2RzXG4gICAgICovXG4gICAgaW5zdGFudF9tYXRjaDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgYXV0b21hdGVkIG1pY3JvZGVwb3NpdHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0aFN1cHBvcnRlZE1ldGhvZHNcbiAgICAgKi9cbiAgICBhdXRvbWF0ZWRfbWljcm9fZGVwb3NpdHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluc3RhbnQgbWljcm9kZXBvc2l0cyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBBdXRoU3VwcG9ydGVkTWV0aG9kc1xuICAgICAqL1xuICAgIGluc3RhbnRfbWljcm9fZGVwb3NpdHM6IGJvb2xlYW47XG59XG4vKipcbiAqIFRoZSBwb3NzaWJsZSB0eXBlcyBvZiBhdXRoIGRhdGEgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQXV0aFVwZGF0ZVR5cGVzIHtcbiAgICBBY2NvdW50TnVtYmVyID0gJ0FDQ09VTlRfTlVNQkVSJyxcbiAgICBSb3V0aW5nTnVtYmVyID0gJ1JPVVRJTkdfTlVNQkVSJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbSBpcyB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzLiBXZSByZWNvbW1lbmQgY29tbXVuaWNhdGluZyB0byB5b3VyIHVzZXJzIHdoZW4gdGhpcyBldmVudCBpcyByZWNlaXZlZCB0byBub3RpZnkgdGhlbSB0aGF0IHRoZWlyIGFjY291bnQgaXMgdmVyaWZpZWQgYW5kIHJlYWR5IGZvciB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEF1dG9tYXRpY2FsbHlWZXJpZmllZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEFVVE9NQVRJQ0FMTFlfVkVSSUZJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjb3VudF9pZGAgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBBdXRvbWF0aWNhbGx5VmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQXV0b21hdGljYWxseVZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG59XG4vKipcbiAqIENvbnRhaW5zIGFkZGl0aW9uYWwgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyB0aGUgQUNIIHJldHVybiByaXNrXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbGFuY2VQbHVzQXR0cmlidXRlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfN2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfNjBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbjogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIGZ1bmRpbmcgYWNjb3VudCBpcyBhIHNhdmluZ3MvbW9uZXkgbWFya2V0IGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfc2F2aW5nc19vcl9tb25leV9tYXJrZXRfYWNjb3VudDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIHBob25lIG51bWJlcnMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGhvbmVfY2hhbmdlX2NvdW50XzkwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzI4ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzkwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFsYW5jZVBsdXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgcmVjZWl2ZXIgYmFuayBhY2NvdW50IGlzIGNsb3NlZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYWxhbmNlUGx1c0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Nsb3NlZDogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgaXMgZWl0aGVyIGZyb3plbiBvciByZXN0cmljdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJhbGFuY2VQbHVzQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfZnJvemVuX29yX3Jlc3RyaWN0ZWQ6IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBIGZpdmUtdGllciByaXNrIGFzc2Vzc21lbnQgZm9yIHRoZSB0cmFuc2FjdGlvbiwgYmFzZWQgb24gdGhlIHByb2JhYmlsaXR5IGRpc3RyaWJ1dGlvbiBvZiBBQ0ggcmV0dXJucywgbWVhc3VyZWQgYnkgdGhlIGluY2lkZW50IHJhdGUuICAgRWFjaCB0aWVyIGNvcnJlc3BvbmRzIHRvIGEgZGlzdHJpYnV0aW9uIHdpdGggYSBkaWZmZXJlbnQgbWVhbiAoYXZlcmFnZSkgcHJvYmFiaWxpdHkuICAgYEhJR0hgOiBUaGUgbWVhbiBwcm9iYWJpbGl0eSBvZiBBQ0ggcmV0dXJuIHJpc2sgaXMgYWJvdmUgNDAlLiBgTUVESVVNX0hJR0hgOiBUaGUgbWVhbiBwcm9iYWJpbGl0eSBvZiBBQ0ggcmV0dXJuIHJpc2sgaXMgMTUlLTQwJS4gIGBNRURJVU1gOiBUaGUgbWVhbiBwcm9iYWJpbGl0eSBvZiBBQ0ggcmV0dXJuIHJpc2sgaXMgNS0xMCUuIGBNRURJVU1fTE9XYDogVGhlIG1lYW4gcHJvYmFiaWxpdHkgb2YgQUNIIHJldHVybiByaXNrIGlzIDElLTIlLiBgTE9XYDogVGhlIG1lYW4gcHJvYmFiaWxpdHkgb2YgQUNIIHJldHVybiByaXNrIGlzIGJlbG93IDElLiAgIE5vdGUgdGhhdCB0aGVzZSB0aWVycyBjb3JyZXNwb25kIHRvIHByb2JhYmlsaXR5ICpkaXN0cmlidXRpb25zKiBhbmQgbm90IHRvIGRpc2NyZXRlIHByb2JhYmlsaXRpZXMuICAgVGhlc2UgdGllciBkZWZpbml0aW9ucyBhcmUgc3BlY2lmaWMgdG8gQmFsYW5jZSBQbHVzIGFuZCBkbyBub3QgYXBwbHkgdG8gcmlzayB0aWVycyBnZW5lcmF0ZWQgYnkgb3RoZXIgUGxhaWQgZW5kcG9pbnRzLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbGFuY2VQbHVzUmlza0xldmVsIHtcbiAgICBIaWdoID0gJ0hJR0gnLFxuICAgIE1lZGl1bUhpZ2ggPSAnTUVESVVNX0hJR0gnLFxuICAgIE1lZGl1bSA9ICdNRURJVU0nLFxuICAgIE1lZGl1bUxvdyA9ICdNRURJVU1fTE9XJyxcbiAgICBMb3cgPSAnTE9XJ1xufVxuXG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBnZW5lcmF0aW9uICBgU1VDQ0VTU2A6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdmlhIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuICBgRkFJTFVSRWA6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua0luY29tZUNvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgYmFuayBpbmNvbWUgcmVwb3J0IGhhcyBmaW5pc2hlZCBnZW5lcmF0aW5nIG9yIGZhaWxlZCB0byBnZW5lcmF0ZSwgdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCBpbiBDUkEgZW5hYmxlZCBjbGllbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lQ29tcGxldGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19JTkNPTUVfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHJlc3VsdDogQmFua0luY29tZUNvbXBsZXRlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIHRoZSBiYW5rIGluY29tZSByZWZyZXNoIHJlcG9ydCBnZW5lcmF0aW9uICBgU1VDQ0VTU2A6IFRoZSByZWZyZXNoZWQgcmVwb3J0IHdhcyBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkIGFuZCBjYW4gYmUgcmV0cmlldmVkIHZpYSBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgLiAgYEZBSUxVUkVgOiBUaGUgcmVmcmVzaGVkIHJlcG9ydCBmYWlsZWQgdG8gYmUgZ2VuZXJhdGVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgcmVmcmVzaGVkIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBvciBmYWlsZWQgdG8gZ2VuZXJhdGUsIHRyaWdnZXJlZCBieSBjYWxsaW5nIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgLiBUbyBnZXQgdGhpcyB3ZWJob29rLCBzdWJzY3JpYmUgdmlhIHRoZSBbRGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vZGV2ZWxvcGVycy93ZWJob29rcykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19JTkNPTUVfUkVGUkVTSF9DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHJlc3VsdDogQmFua0luY29tZVJlZnJlc2hDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBjaGFuZ2UgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBpcyBkZXRlY3RlZC4gWW91IHNob3VsZCBjYWxsIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHRvIGdldCB1cGRhdGVkIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci4gVG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2ssIHN1YnNjcmliZSBpbiB0aGUgW0Rhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL2RldmVsb3BlcnMvd2ViaG9va3MpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua0luY29tZVJlZnJlc2hVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbmNvbWVSZWZyZXNoVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rSW5jb21lUmVmcmVzaFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5zIGEgcmlzayBzY29yZSBhbmQgYSByaXNrIHRpZXIgdGhhdCBldmFsdWF0ZSB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgYmVjYXVzZSBhbiBhY2NvdW50IGlzIG92ZXJkcmF3biBvciBiZWNhdXNlIGFuIGluZWxpZ2libGUgYWNjb3VudCBpcyB1c2VkLiBDb21tb24gcmV0dXJuIGNvZGVzIGluIHRoaXMgY2F0ZWdvcnkgaW5jbHVkZTogXFxcIlIwMVxcXCIsIFxcXCJSMDJcXFwiLCBcXFwiUjAzXFxcIiwgXFxcIlIwNFxcXCIsIFxcXCJSMDZcXFwiLCBcXFwiUjA4XFxcIiwgIFxcXCJSMDlcXFwiLCBcXFwiUjEzXFxcIiwgXFxcIlIxNlxcXCIsIFxcXCJSMTdcXFwiLCBcXFwiUjIwXFxcIiwgXFxcIlIyM1xcXCIuIFRoZXNlIHJldHVybnMgaGF2ZSBhIHR1cm5hcm91bmQgdGltZSBvZiAyIGJhbmtpbmcgZGF5cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua0luaXRpYXRlZFJldHVyblJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJbiB0aGUgYGJhbmtfaW5pdGlhdGVkX3JldHVybl9yaXNrYCBvYmplY3QsIHRoZXJlIGFyZSBlaWdodCByaXNrIHRpZXJzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNjb3JlczogICAxOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC4wJSAtIDAuNSUgICAyOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMC41JSAtIDEuNSUgICAzOiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMS41JSAtIDMlICAgNDogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDMlIC0gNSUgICA1OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gNSUgLSAxMCUgICA2OiBQcmVkaWN0ZWQgYmFuay1pbml0aWF0ZWQgcmV0dXJuIGluY2lkZW5jZSByYXRlIGJldHdlZW4gMTAlIC0gMTUlICAgNzogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDE1JSBhbmQgNTAlICAgODogUHJlZGljdGVkIGJhbmstaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBncmVhdGVyIHRoYW4gNTAlIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSBiYW5rIHRyYW5zZmVyIHdpdGhpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M6IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRoYXQgc2hvdWxkIGJlIGNyZWRpdGVkL2RlYml0ZWQgZm9yIHRoaXMgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IEJhbmtUcmFuc2ZlclVzZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgYmFuayB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyBiYW5rIHRyYW5zZmVyIHdhcyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJhbmtUcmFuc2ZlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogQmFua1RyYW5zZmVyTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgeW91IGNhbiBzdGlsbCBjYW5jZWwgdGhpcyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjYW5jZWxsYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb246IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1c3RvbSB0YWcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBpbiB0aGUgY3JlYXRlIHJlcXVlc3QuIFdpbGwgYmUgbnVsbCBpZiBub3QgcHJvdmlkZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyXG4gICAgICovXG4gICAgY3VzdG9tX3RhZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG1ldGFkYXRhOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHdhcyB1c2VkIGZvciB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkaXJlY3Rpb246IEJhbmtUcmFuc2ZlckRpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWxhbmNlIG9mIGEgYmFuayB0cmFuc2ZlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGF2YWlsYWJsZSBiYWxhbmNlIC0gdGhlIHN1bSBvZiBhbGwgc3VjY2Vzc2Z1bCBkZWJpdCB0cmFuc2ZlciBhbW91bnRzIG1pbnVzIGFsbCBjcmVkaXQgdHJhbnNmZXIgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgdHJhbnNhY3RhYmxlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIG11bHRpcGxlIG9yaWdpbmF0aW9uIGFjY291bnRzIGFyZSBhdmFpbGFibGUsIGBvcmlnaW5hdGlvbl9hY2NvdW50X2lkYCBtdXN0IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCBmb3Igd2hpY2ggYmFsYW5jZSB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBCYW5rVHJhbnNmZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2Nlc3NfdG9rZW5gIGZvciB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQg4oCTIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC4gT3RoZXJ3aXNlLCB0aGlzIGZpZWxkIHNob3VsZCBiZSBsZWZ0IGJsYW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXI6IEJhbmtUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYCBmb3IgQVBJLWluaXRpYXRlZCB0cmFuc2ZlcnMsIG9yIGBpbmJvdW5kYCBmb3IgcGF5bWVudHMgcmVjZWl2ZWQgYnkgdGhlIEZCTyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyRGlyZWN0aW9uIHtcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgQmFuayBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXZlbnQuIElEcyBhcmUgc2VxdWVudGlhbCB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlcnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9pZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgZXZlbnQgb2NjdXJyZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBCYW5rVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX3R5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGJhbmsgdHJhbnNmZXIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBCYW5rVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyRGlyZWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFuayB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlIHtcbiAgICBEZWJpdCA9ICdkZWJpdCcsXG4gICAgQ3JlZGl0ID0gJ2NyZWRpdCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2ZlcjogYG91dGJvdW5kYDogZm9yIEFQSS1pbml0aWF0ZWQgdHJhbnNmZXJzIGBpbmJvdW5kYDogZm9yIHBheW1lbnRzIHJlY2VpdmVkIGJ5IHRoZSBGQk8gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbiB7XG4gICAgSW5ib3VuZCA9ICdpbmJvdW5kJyxcbiAgICBPdXRib3VuZCA9ICdvdXRib3VuZCcsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgYmFuayB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgdG8gZ2V0IGV2ZW50cyBmb3IgYWxsIHRyYW5zYWN0aW9ucyB0by9mcm9tIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJFdmVudExpc3RCYW5rVHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl90eXBlPzogQmFua1RyYW5zZmVyRXZlbnRMaXN0QmFua1RyYW5zZmVyVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGV2ZW50cyBieSBldmVudCB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudFR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZXM/OiBBcnJheTxCYW5rVHJhbnNmZXJFdmVudFR5cGU+O1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0byByZXR1cm4uIElmIHRoZSBudW1iZXIgb2YgZXZlbnRzIG1hdGNoaW5nIHRoZSBhYm92ZSBwYXJhbWV0ZXJzIGlzIGdyZWF0ZXIgdGhhbiBgY291bnRgLCB0aGUgbW9zdCByZWNlbnQgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGxpc3Qgb2YgYmFuayB0cmFuc2ZlciBldmVudHMuIFdoZW4gYGNvdW50YD0yNSBhbmQgYG9mZnNldGA9MCwgdGhlIGZpcnN0IDI1IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTI1LCB0aGUgbmV4dCAyNSBiYW5rIHRyYW5zZmVyIGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIHRyYW5zZmVycyBmcm9tIGEgc3BlY2lmaWMgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEJhbmtUcmFuc2ZlckV2ZW50TGlzdERpcmVjdGlvbiB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9ldmVudHM6IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IChsYXJnZXN0KSBgZXZlbnRfaWRgIGZldGNoZWQgdmlhIHRoZSBzeW5jIGVuZHBvaW50LCBvciAwIGluaXRpYWxseS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWZ0ZXJfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCYW5rVHJhbnNmZXJFdmVudD59XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2Zlcl9ldmVudHM6IEFycmF5PEJhbmtUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgdGhpcyBiYW5rIHRyYW5zZmVyIHJlcHJlc2VudHMuICBgcGVuZGluZ2A6IEEgbmV3IHRyYW5zZmVyIHdhcyBjcmVhdGVkOyBpdCBpcyBpbiB0aGUgcGVuZGluZyBzdGF0ZS4gIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiAgYGZhaWxlZGA6IFRoZSB0cmFuc2ZlciBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gIGByZXZlcnNlZGA6IEEgcG9zdGVkIHRyYW5zZmVyIHdhcyByZXZlcnNlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlckV2ZW50VHlwZSB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBSZXZlcnNlZCA9ICdyZXZlcnNlZCdcbn1cblxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIHR5cGUgb2YgdGhpcyB0cmFuc2ZlciBpcyBgXFxcImZhaWxlZFxcXCJgIG9yIGBcXFwicmV2ZXJzZWRcXFwiYC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlckZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJGYWlsdXJlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJldHVybiBjb2RlLCBlLmcuIGBSMDFgLiAgQSByZXR1cm4gY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgYHJldmVyc2VkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbQmFuayBUcmFuc2ZlcnMgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy9iYW5rLXRyYW5zZmVycy8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyRmFpbHVyZVxuICAgICAqL1xuICAgIGFjaF9yZXR1cm5fY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcmVhc29uIGZvciB0aGUgZmFpbHVyZSBvciByZXZlcnNhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX3RyYW5zZmVyOiBCYW5rVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRldGltZSBvZiBiYW5rIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgYmFuayB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJhbmsgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIGJhbmsgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJEaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZGlyZWN0aW9uPzogQmFua1RyYW5zZmVyRGlyZWN0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFua1RyYW5zZmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcnM6IEFycmF5PEJhbmtUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlci4gVGhpcyBpcyB0aGUgQUJBIG51bWJlcjsgZm9yIHNvbWUgaW5zdGl0dXRpb25zLCB0aGlzIG1heSBkaWZmZXIgZnJvbSB0aGUgQUNIIG51bWJlciB1c2VkIGluIGByb3V0aW5nX251bWJlcmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgYmFuayBhY2NvdW50IChgY2hlY2tpbmdgIG9yIGBzYXZpbmdzYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuIFZhbGlkIG9wdGlvbnMgYXJlIGBhY2hgLCBgc2FtZS1kYXktYWNoYCwgb3IgYHdpcmVgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmFua1RyYW5zZmVyTmV0d29yayB7XG4gICAgQWNoID0gJ2FjaCcsXG4gICAgU2FtZURheUFjaCA9ICdzYW1lLWRheS1hY2gnLFxuICAgIFdpcmUgPSAnd2lyZSdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlclN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBSZXZlcnNlZCA9ICdyZXZlcnNlZCdcbn1cblxuLyoqXG4gKiBCYW5rVHJhbnNmZXJTd2VlcCBkZXNjcmliZXMgYSBzd2VlcCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoZSBzd2VlcCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSBzd2VlcCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogQmFua1RyYW5zZmVyU3dlZXA7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElmIG11bHRpcGxlIG9yaWdpbmF0aW9uIGFjY291bnRzIGFyZSBhdmFpbGFibGUsIGBvcmlnaW5hdGlvbl9hY2NvdW50X2lkYCBtdXN0IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWNjb3VudCB0aGF0IHRoZSBzd2VlcHMgYmVsb25nIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2Ygc3dlZXBzIHRvIHJldHVybiAoUkZDIDMzMzkgZm9ybWF0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHN3ZWVwcyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJhbmtUcmFuc2ZlclN3ZWVwPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcHM6IEFycmF5PEJhbmtUcmFuc2ZlclN3ZWVwPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGJhbmsgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhbmtUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0J1xufVxuXG4vKipcbiAqIFRoZSBsZWdhbCBuYW1lIGFuZCBvdGhlciBpbmZvcm1hdGlvbiBmb3IgdGhlIGFjY291bnQgaG9sZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyVXNlciB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVy4oCZcyBmdWxsIGxlZ2FsIG5hbWUuIElmIHRoZSB0cmFuc2ZlciBgYWNoX2NsYXNzYCBpcyBgY2NkYCwgdGhpcyBzaG91bGQgYmUgdGhlIGJ1c2luZXNzIG5hbWUgb2YgdGhlIGFjY291bnQgaG9sZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlclVzZXJcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVy4oCZcyBlbWFpbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgaG9sZGVyXFwncyByb3V0aW5nIG51bWJlci4gVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgaW4gcmVzcG9uc2UgZGF0YS4gRG8gbm90IHByb3ZpZGUgdGhpcyBmaWVsZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJVc2VyXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IGJhbmsgdHJhbnNmZXIgZXZlbnRzIGFyZSBhdmFpbGFibGUuIFJlY2VpdmluZyB0aGlzIHdlYmhvb2sgaW5kaWNhdGVzIHlvdSBzaG91bGQgZmV0Y2ggdGhlIG5ldyBldmVudHMgZnJvbSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhbmtUcmFuc2ZlcnNFdmVudHNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFua1RyYW5zZmVyc0V2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyBBQ0ggZXZlbnRzIGFyZSBhdmFpbGFibGUuIFRvIGJlZ2luIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIHlvdSBtdXN0IGZpcnN0IHJlZ2lzdGVyIHlvdXIgd2ViaG9vayBsaXN0ZW5lciBlbmRwb2ludCB2aWEgdGhlIFt3ZWJob29rcyBwYWdlIGluIHRoZSBEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3dlYmhvb2tzKS4gVGhlIGBCQU5LX1RSQU5TRkVSU19FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGNhbiBiZSB1c2VkIHRvIHRyYWNrIHRoZSBwcm9ncmVzcyBvZiBBQ0ggdHJhbnNmZXJzIHVzZWQgaW4gW21pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uXSgvZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYC4gTm90ZSB0aGF0IFtUcmFuc2Zlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgY3VzdG9tZXJzIHNob3VsZCB1c2UgVHJhbnNmZXIgd2ViaG9va3MgaW5zdGVhZCBvZiB1c2luZyBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWA7IHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHMgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKSBmb3IgbW9yZSBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGgge1xuICAgIC8qKlxuICAgICAqIGBCQU5LX1RSQU5TRkVSU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19UUkFOU0ZFUlNfRVZFTlRTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCYW5rVHJhbnNmZXJzRXZlbnRzVXBkYXRlV2ViaG9va0ZvckF1dGhcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgQmFzZSBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGFuIEJhc2UgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgQmFzZSBSZXBvcnQgd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgZGF0ZV9nZW5lcmF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSByZXF1ZXN0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IFBsYWlkIGFib3V0IGVhY2ggb2YgdGhlIEl0ZW1zIGluY2x1ZGVkIGluIHRoZSBCYXNlIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PEJhc2VSZXBvcnRJdGVtPjtcbn1cbi8qKlxuICogQmFzZSBSZXBvcnQgaW5mb3JtYXRpb24gYWJvdXQgYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGJhbGFuY2VzOiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmZvcm1hdGlvbiBhYm91dCBwcmV2aW91c2x5IHN1Ym1pdHRlZCB2YWxpZCBkaXNwdXRlIHN0YXRlbWVudHMgYnkgdGhlIGNvbnN1bWVyXG4gICAgICogQHR5cGUge0FycmF5PENvbnN1bWVyRGlzcHV0ZT59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgY29uc3VtZXJfZGlzcHV0ZXM6IEFycmF5PENvbnN1bWVyRGlzcHV0ZT47XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogQmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGFzc2lnbmVkIGJ5IHRoZSB1c2VyIG9yIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gaXRzZWxmXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGFjY291bnQgYXMgZ2l2ZW4gYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgdHlwZTogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVyYXRpb24gb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSBhdmFpbGFibGUgd2l0aGluIHRoaXMgcmVwb3J0IGZvciB0aGlzIEl0ZW0sIHR5cGljYWxseSBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGF0IGFjY291bnQuIE9ubHkgcmV0dXJuZWQgYnkgQmFzZSBSZXBvcnQgZW5kcG9pbnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50XG4gICAgICovXG4gICAgZGF5c19hdmFpbGFibGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbiBoaXN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC4gT25seSByZXR1cm5lZCBieSBCYXNlIFJlcG9ydCBlbmRwb2ludHMuIFRyYW5zYWN0aW9uIGhpc3RvcnkgcmV0dXJuZWQgYnkgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgcmV0dXJuZWQgaW4gdGhlIHRvcC1sZXZlbCBgdHJhbnNhY3Rpb25zYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8QmFzZVJlcG9ydFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBGb3IgYnVzaW5lc3MgYWNjb3VudHMsIHRoZSBuYW1lIHJlcG9ydGVkIG1heSBiZSBlaXRoZXIgdGhlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgb3IgdGhlIG5hbWUgb2YgdGhlIGJ1c2luZXNzLCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBNdWx0aXBsZSBvd25lcnMgb24gYSBzaW5nbGUgYWNjb3VudCB3aWxsIGJlIHJlcHJlc2VudGVkIGluIHRoZSBzYW1lIGBvd25lcmAgb2JqZWN0LCBub3QgaW4gbXVsdGlwbGUgb3duZXIgb2JqZWN0cyB3aXRoaW4gdGhlIGFycmF5LiBUaGlzIGFycmF5IGNhbiBhbHNvIGJlIGVtcHR5IGlmIG5vIG93bmVycyBhcmUgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJzaGlwVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnNoaXBfdHlwZTogT3duZXJzaGlwVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2FsY3VsYXRlZCBkYXRhIGFib3V0IHRoZSBoaXN0b3JpY2FsIGJhbGFuY2VzIG9uIHRoZSBhY2NvdW50LiBPbmx5IHJldHVybmVkIGJ5IEJhc2UgUmVwb3J0IGVuZHBvaW50cyBhbmQgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgYnkgYGJyb2tlcmFnZWAgb3IgYGludmVzdG1lbnRgIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYmFsYW5jZXM/OiBBcnJheTxCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaW5zaWdodHM/OiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0QXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzPzogQmFzZVJlcG9ydEF0dHJpYnV0ZXM7XG59XG4vKipcbiAqIEJhc2UgUmVwb3J0IGluZm9ybWF0aW9uIGFib3V0IGFuIGFjY291bnRcXCdzIGJhbGFuY2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIGZ1bmRzIGF2YWlsYWJsZSB0byBiZSB3aXRoZHJhd24gZnJvbSB0aGUgYWNjb3VudCwgYXMgZGV0ZXJtaW5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMsIHRoZSBgYXZhaWxhYmxlYCBiYWxhbmNlIHR5cGljYWxseSBlcXVhbHMgdGhlIGBsaW1pdGAgbGVzcyB0aGUgYGN1cnJlbnRgIGJhbGFuY2UsIGxlc3MgYW55IHBlbmRpbmcgb3V0Zmxvd3MgcGx1cyBhbnkgcGVuZGluZyBpbmZsb3dzLiAgRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSB0eXBpY2FsbHkgZXF1YWxzIHRoZSBgY3VycmVudGAgYmFsYW5jZSBsZXNzIGFueSBwZW5kaW5nIG91dGZsb3dzIHBsdXMgYW55IHBlbmRpbmcgaW5mbG93cy4gRm9yIGBkZXBvc2l0b3J5YC10eXBlIGFjY291bnRzLCB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBkb2VzIG5vdCBpbmNsdWRlIHRoZSBvdmVyZHJhZnQgbGltaXQuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGBhdmFpbGFibGVgIGJhbGFuY2UgaXMgdGhlIHRvdGFsIGNhc2ggYXZhaWxhYmxlIHRvIHdpdGhkcmF3IGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBgYXZhaWxhYmxlYCAgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYGF2YWlsYWJsZWAgYmFsYW5jZSBpcyB1bmF2YWlsYWJsZSwgUGxhaWQgd2lsbCByZXR1cm4gYW4gYGF2YWlsYWJsZWAgYmFsYW5jZSB2YWx1ZSBvZiBgbnVsbGAuICBBdmFpbGFibGUgYmFsYW5jZSBtYXkgYmUgY2FjaGVkIGFuZCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSB1cC10by1kYXRlIGluIHJlYWx0aW1lIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgSWYgYGN1cnJlbnRgIGlzIGBudWxsYCB0aGlzIGZpZWxkIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gb3Igb3dlZCBieSB0aGUgYWNjb3VudC4gIEZvciBgY3JlZGl0YC10eXBlIGFjY291bnRzLCBhIHBvc2l0aXZlIGJhbGFuY2UgaW5kaWNhdGVzIHRoZSBhbW91bnQgb3dlZDsgYSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoZSBsZW5kZXIgb3dpbmcgdGhlIGFjY291bnQgaG9sZGVyLiAgRm9yIGBsb2FuYC10eXBlIGFjY291bnRzLCB0aGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSBwcmluY2lwYWwgcmVtYWluaW5nIG9uIHRoZSBsb2FuLCBleGNlcHQgaW4gdGhlIGNhc2Ugb2Ygc3R1ZGVudCBsb2FuIGFjY291bnRzIGF0IFNhbGxpZSBNYWUgKGBpbnNfMTE2OTQ0YCkuIEZvciBTYWxsaWUgTWFlIHN0dWRlbnQgbG9hbnMsIHRoZSBhY2NvdW50XFwncyBiYWxhbmNlIGluY2x1ZGVzIGJvdGggcHJpbmNpcGFsIGFuZCBhbnkgb3V0c3RhbmRpbmcgaW50ZXJlc3QuICBGb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgKG9yIGBicm9rZXJhZ2VgLXR5cGUgYWNjb3VudHMgZm9yIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyKSwgdGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgdmFsdWUgb2YgYXNzZXRzIGFzIHByZXNlbnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlIHRoYXQgYmFsYW5jZSBpbmZvcm1hdGlvbiBtYXkgYmUgY2FjaGVkIHVubGVzcyB0aGUgdmFsdWUgd2FzIHJldHVybmVkIGJ5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgOyBpZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBUcmFuc2FjdGlvbnMsIHRoZSBiYWxhbmNlIHdpbGwgYmUgYXQgbGVhc3QgYXMgcmVjZW50IGFzIHRoZSBtb3N0IHJlY2VudCBUcmFuc2FjdGlvbiB1cGRhdGUuIElmIHlvdSByZXF1aXJlIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgYGF2YWlsYWJsZWAgYmFsYW5jZSBhcyBwcm92aWRlZCBieSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YC4gIFdoZW4gcmV0dXJuZWQgYnkgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIHRoaXMgZmllbGQgbWF5IGJlIGBudWxsYC4gV2hlbiB0aGlzIGhhcHBlbnMsIGBhdmFpbGFibGVgIGlzIGd1YXJhbnRlZWQgbm90IHRvIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGb3IgYGNyZWRpdGAtdHlwZSBhY2NvdW50cywgdGhpcyByZXByZXNlbnRzIHRoZSBjcmVkaXQgbGltaXQuICBGb3IgYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHMsIHRoaXMgcmVwcmVzZW50cyB0aGUgcHJlLWFycmFuZ2VkIG92ZXJkcmFmdCBsaW1pdCwgd2hpY2ggaXMgY29tbW9uIGZvciBjdXJyZW50IChjaGVja2luZykgYWNjb3VudHMgaW4gRXVyb3BlLiAgSW4gTm9ydGggQW1lcmljYSwgdGhpcyBmaWVsZCBpcyB0eXBpY2FsbHkgb25seSBhdmFpbGFibGUgZm9yIGBjcmVkaXRgLXR5cGUgYWNjb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgbnVsbCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEJhbGFuY2VzXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBudWxsIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkgaW5kaWNhdGluZyB0aGUgb2xkZXN0IGFjY2VwdGFibGUgYmFsYW5jZSB3aGVuIG1ha2luZyBhIHJlcXVlc3QgdG8gYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuICBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBhbmQgZXhwZWN0ZWQgd2hlbiB0aGUgaW5zdGl0dXRpb24gaXMgYGluc18xMjgwMjZgIChDYXBpdGFsIE9uZSkgYW5kIHRoZSBJdGVtIGNvbnRhaW5zIG9uZSBvciBtb3JlIGFjY291bnRzIHdpdGggYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IHR5cGUsIGluIHdoaWNoIGNhc2UgYSB2YWx1ZSBtdXN0IGJlIHByb3ZpZGVkIG9yIGFuIGBJTlZBTElEX1JFUVVFU1RgIGVycm9yIHdpdGggdGhlIGNvZGUgb2YgYElOVkFMSURfRklFTERgIHdpbGwgYmUgcmV0dXJuZWQuIEZvciBDYXBpdGFsIE9uZSBkZXBvc2l0b3J5IGFjY291bnRzIGFzIHdlbGwgYXMgYWxsIG90aGVyIGFjY291bnQgdHlwZXMgb24gYWxsIG90aGVyIGluc3RpdHV0aW9ucywgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBTZWUgW2FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgYWNjb3VudCB0eXBlcy4gIElmIHRoZSBiYWxhbmNlIHRoYXQgaXMgcHVsbGVkIGlzIG9sZGVyIHRoYW4gdGhlIGdpdmVuIHRpbWVzdGFtcCBmb3IgSXRlbXMgd2l0aCB0aGlzIGZpZWxkIHJlcXVpcmVkLCBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIG1vc3QgcmVjZW50IHRpbWVzdGFtcCBmb3IgdGhlIHJlcXVlc3RlZCBhY2NvdW50IGNvbnRhaW5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZF9kYXRldGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgaGlzdG9yaWNhbCBiYWxhbmNlIGZvciB0aGUgZW50aXJlIHJlcG9ydFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIGhpc3RvcmljYWwgYmFsYW5jZSBvZiBlYWNoIGNhbGVuZGFyIG1vbnRoXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRCYWxhbmNlc1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfbW9udGhseV9iYWxhbmNlcz86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBoaXN0b3JpY2FsIGJhbGFuY2UgZnJvbSB0aGUgbW9zdCByZWNlbnQgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50QmFsYW5jZXNcbiAgICAgKi9cbiAgICBtb3N0X3JlY2VudF90aGlydHlfZGF5X2F2ZXJhZ2VfYmFsYW5jZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIENhbGN1bGF0ZWQgaW5zaWdodHMgZGVyaXZlZCBmcm9tIHRyYW5zYWN0aW9uLWxldmVsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgYmFzZSByZXBvcnQgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBvbGRlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gaW4gdGhlIGJhc2UgcmVwb3J0IGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbW9zdF9yZWNlbnRfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgZGF5cyBhdmFpbGFibGUgaW4gdGhlIGJhc2UgcmVwb3J0IGZvciB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c19hdmFpbGFibGU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19iZXR3ZWVuX3RyYW5zYWN0aW9ucz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBMb25nZXN0IGdhcCBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zIGluIGEgdGltZSBwZXJpb2QuIFRoaXMgYXJyYXkgY2FuIGluY2x1ZGUgbXVsdGlwbGUgdGltZSBwZXJpb2RzLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIGxvbmdlc3RfZ2Fwc19iZXR3ZWVuX3RyYW5zYWN0aW9ucz86IEFycmF5PEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGViaXRzIGludG8gdGhlIGFjY291bnQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX2luZmxvd3M/OiBBcnJheTxCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBBdmVyYWdlIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiBhIHRpbWUgcGVyaW9kLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXZlcmFnZV9pbmZsb3dfYW1vdW50cz86IEFycmF5PEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG91dGZsb3dzIGZyb20gdGhlIGFjY291bnQuIFRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX291dGZsb3dzPzogQXJyYXk8QmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogQXZlcmFnZSBhbW91bnQgb2YgdHJhbnNhY3Rpb25zIG91dCBvZiB0aGUgYWNjb3VudCBpbiBhIHRpbWUgcGVyaW9kLiBUaGlzIGFycmF5IHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXZlcmFnZV9vdXRmbG93X2Ftb3VudHM/OiBBcnJheTxCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgd2l0aCBubyB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgbnVtYmVyX29mX2RheXNfbm9fdHJhbnNhY3Rpb25zPzogbnVtYmVyO1xufVxuLyoqXG4gKiBCYXNlIFJlcG9ydCBtZXRhZGF0YSBhYm91dCB0aGUgZXh0cmFjdGVkIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRBY2NvdW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QWNjb3VudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgZXh0cmFjdGVkIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEFjY291bnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG1vc3QgcmVjZW50IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ2FsY3VsYXRlZCBhdHRyaWJ1dGVzIGRlcml2ZWQgZnJvbSB0cmFuc2FjdGlvbi1sZXZlbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIE5TRiBhbmQgb3ZlcmRyYWZ0IGZlZSB0cmFuc2FjdGlvbnMgaW4gdGhlIHRpbWUgcmFuZ2UgZm9yIHRoZSByZXBvcnQgaW4gdGhlIGdpdmVuIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIE5TRiBhbmQgb3ZlcmRyYWZ0IGZlZSB0cmFuc2FjdGlvbnMgaW4gdGhlIGxhc3QgMzAgZGF5cyBmb3IgYSBnaXZlbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgTlNGIGFuZCBvdmVyZHJhZnQgZmVlIHRyYW5zYWN0aW9ucyBpbiB0aGUgbGFzdCA2MCBkYXlzIGZvciBhIGdpdmVuIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBOU0YgYW5kIG92ZXJkcmFmdCBmZWUgdHJhbnNhY3Rpb25zIGluIHRoZSBsYXN0IDkwIGRheXMgZm9yIGEgZ2l2ZW4gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBQcmVkaWN0aW9uIGluZGljYXRvciBvZiB3aGV0aGVyIHRoZSBhY2NvdW50IGlzIGEgcHJpbWFyeSBhY2NvdW50LiBPbmx5IG9uZSBhY2NvdW50IHBlciBhY2NvdW50IHR5cGUgYWNyb3NzIHRoZSBpdGVtcyBjb25uZWN0ZWQgd2lsbCBoYXZlIGEgdmFsdWUgb2YgdHJ1ZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19wcmltYXJ5X2FjY291bnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSByYW5naW5nIGZyb20gMC0xLiBUaGUgaGlnaGVyIHRoZSBzY29yZSwgdGhlIG1vcmUgY29uZmlkZW50IHdlIGFyZSBvZiB0aGUgYWNjb3VudCBiZWluZyB0aGUgcHJpbWFyeSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHJpbWFyeV9hY2NvdW50X3Njb3JlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxJbmZsb3dBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudD86IFRvdGFsSW5mbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxJbmZsb3dBbW91bnQzMGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfaW5mbG93X2Ftb3VudF8zMGQ/OiBUb3RhbEluZmxvd0Ftb3VudDMwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsSW5mbG93QW1vdW50NjBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd19hbW91bnRfNjBkPzogVG90YWxJbmZsb3dBbW91bnQ2MGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbEluZmxvd0Ftb3VudDkwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dfYW1vdW50XzkwZD86IFRvdGFsSW5mbG93QW1vdW50OTBkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxPdXRmbG93QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50PzogVG90YWxPdXRmbG93QW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxPdXRmbG93QW1vdW50MzBkfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dfYW1vdW50XzMwZD86IFRvdGFsT3V0Zmxvd0Ftb3VudDMwZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RvdGFsT3V0Zmxvd0Ftb3VudDYwZH1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9vdXRmbG93X2Ftb3VudF82MGQ/OiBUb3RhbE91dGZsb3dBbW91bnQ2MGQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbE91dGZsb3dBbW91bnQ5MGR9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd19hbW91bnRfOTBkPzogVG90YWxPdXRmbG93QW1vdW50OTBkIHwgbnVsbDtcbn1cbi8qKlxuICogQXZlcmFnZSBkb2xsYXIgYW1vdW50IG9mIGNyZWRpdCBvciBkZWJpdCB0cmFuc2FjdGlvbnMgb3V0IG9mIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZUZsb3dJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VGbG93SW5zaWdodHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRBdmVyYWdlRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50OiBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k7XG59XG4vKipcbiAqIEF2ZXJhZ2UgYmFsYW5jZSBpbiBkb2xsYXIgYW1vdW50IHBlciBtb250aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRBdmVyYWdlTW9udGhseUJhbGFuY2VzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0QXZlcmFnZU1vbnRobHlCYWxhbmNlc1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEFtb3VudFdpdGhDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEF2ZXJhZ2VNb250aGx5QmFsYW5jZXNcbiAgICAgKi9cbiAgICBhdmVyYWdlX2JhbGFuY2U6IENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeTtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIGJhbGFuY2UgaGVsZCBieSBhbiBhY2NvdW50IGluIHRoZSBwYXN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRIaXN0b3JpY2FsQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGNhbGN1bGF0ZWQgaGlzdG9yaWNhbCBiYWxhbmNlLCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQsIGNhbGN1bGF0ZWQgZnJvbSB0aGUgYGN1cnJlbnRgIGJhbGFuY2UgaW4gdGhlIGBiYWxhbmNlYCBvYmplY3QgYnkgc3VidHJhY3RpbmcgaW5mbG93cyBhbmQgYWRkaW5nIGJhY2sgb3V0Zmxvd3MgYWNjb3JkaW5nIHRvIHRoZSBwb3N0ZWQgZGF0ZSBvZiBlYWNoIHRyYW5zYWN0aW9uLiAgSWYgdGhlIGFjY291bnQgaGFzIGFueSBwZW5kaW5nIHRyYW5zYWN0aW9ucywgaGlzdG9yaWNhbCBiYWxhbmNlIGFtb3VudHMgb24gb3IgYWZ0ZXIgdGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IHBlbmRpbmcgdHJhbnNhY3Rpb24gbWF5IGRpZmZlciBpZiByZXRyaWV2ZWQgaW4gc3Vic2VxdWVudCBBc3NldCBSZXBvcnRzIGFzIGEgcmVzdWx0IG9mIHRob3NlIHBlbmRpbmcgdHJhbnNhY3Rpb25zIHBvc3RpbmcuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYW4gSXRlbSB3aXRoaW4gYSBCYXNlIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCYXNlUmVwb3J0SXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgZmluYW5jaWFsIGluc3RpdHV0aW9uIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0SXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGlzIEl0ZW3igJlzIGRhdGEgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgZGF0ZV9sYXN0X3VwZGF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCBlYWNoIG9mIHRoZSBhY2NvdW50cyBvcGVuIG9uIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxCYXNlUmVwb3J0QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRJdGVtXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEJhc2VSZXBvcnRBY2NvdW50Pjtcbn1cbi8qKlxuICogTGFyZ2VzdCBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIHNlcXVlbnRpYWwgdHJhbnNhY3Rpb25zIHBlciBjYWxlbmRhciBtb250aFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgb2YgdGhpcyB0aW1lIHBlcmlvZC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRMb25nZXN0R2FwSW5zaWdodHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydExvbmdlc3RHYXBJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExhcmdlc3QgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBzZXF1ZW50aWFsIHRyYW5zYWN0aW9ucyBmb3IgdGhpcyB0aW1lIHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TG9uZ2VzdEdhcEluc2lnaHRzXG4gICAgICovXG4gICAgZGF5cz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBudW1iZXIgb2YgY3JlZGl0cyBvciBkZWJpdHMgb3V0IG9mIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnROdW1iZXJGbG93SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoaXMgdGltZSBwZXJpb2QuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0TnVtYmVyRmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZSBvZiB0aGlzIHRpbWUgcGVyaW9kLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBjcmVkaXRzIG9yIGRlYml0cyBvdXQgb2YgdGhlIGFjY291bnQgZm9yIHRoaXMgdGltZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydE51bWJlckZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGNvdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEEgdHJhbnNhY3Rpb24gb24gdGhlIEJhc2UgUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSwgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiB0byBkZXNjcmliZSB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdENhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjcmVkaXRfY2F0ZWdvcnk/OiBDcmVkaXRDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgdHJhbnNhY3Rpb24gdG9vayBwbGFjZSwgaW4gSVMwIDg2MDEgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgdHJhbnNhY3Rpb24gYXMgcGVuZGluZyBvciB1bnNldHRsZWQuIFBlbmRpbmcgdHJhbnNhY3Rpb24gZGV0YWlscyAobmFtZSwgdHlwZSwgYW1vdW50LCBjYXRlZ29yeSBJRCkgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBhcmUgc2V0dGxlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGVuZGluZzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBvd25lci4gVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9vd25lcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0VHJhbnNhY3Rpb25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogQmFzZVJlcG9ydFRyYW5zYWN0aW9uVHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBgZGlnaXRhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYHBsYWNlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgc3BlY2lhbDpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgYHVucmVzb2x2ZWQ6YCB0cmFuc2FjdGlvbnMgdGhhdCBkbyBub3QgZml0IGludG8gdGhlIG90aGVyIHR5cGVzLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJhc2VSZXBvcnRUcmFuc2FjdGlvblR5cGUge1xuICAgIERpZ2l0YWwgPSAnZGlnaXRhbCcsXG4gICAgUGxhY2UgPSAncGxhY2UnLFxuICAgIFNwZWNpYWwgPSAnc3BlY2lhbCcsXG4gICAgVW5yZXNvbHZlZCA9ICd1bnJlc29sdmVkJ1xufVxuXG4vKipcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciBhIEJhc2UgUmVwb3J0IHRvIGJlIHJldHVybmVkIHdpdGggbWlzc2luZyBhY2NvdW50IG93bmVyIGluZm9ybWF0aW9uLiBJbiBzdWNoIGNhc2VzLCB0aGUgQmFzZSBSZXBvcnQgd2lsbCBjb250YWluIHdhcm5pbmcgZGF0YSBpbiB0aGUgcmVzcG9uc2UsIGluZGljYXRpbmcgd2h5IG9idGFpbmluZyB0aGUgb3duZXIgaW5mb3JtYXRpb24gZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0V2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyB0eXBlLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFTRV9SRVBPUlRfV0FSTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYXNlUmVwb3J0V2FybmluZ0NvZGV9XG4gICAgICogQG1lbWJlcm9mIEJhc2VSZXBvcnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBCYXNlUmVwb3J0V2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBCYXNlUmVwb3J0V2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlOiBDYXVzZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYE9XTkVSU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgYWNjb3VudC1vd25lciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYCBpbmRpY2F0ZXMgdGhhdCB0cmFuc2FjdGlvbnMgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIENyZWRpdCBhbmQgRGVwb3NpdG9yeSBhY2NvdW50cyBhcmUgdW5hdmFpbGFibGUuIGBVU0VSX0ZSQVVEX0FMRVJUYCBpbmRpY2F0ZXMgdGhhdCB0aGUgVXNlciBoYXMgcGxhY2VkIGEgZnJhdWQgYWxlcnQgb24gdGhlaXIgUGxhaWQgQ2hlY2sgY29uc3VtZXIgcmVwb3J0IGR1ZSB0byBzdXNwZWN0ZWQgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCYXNlUmVwb3J0V2FybmluZ0NvZGUge1xuICAgIE93bmVyc1VuYXZhaWxhYmxlID0gJ09XTkVSU19VTkFWQUlMQUJMRScsXG4gICAgVHJhbnNhY3Rpb25zVW5hdmFpbGFibGUgPSAnVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFJyxcbiAgICBVc2VyRnJhdWRBbGVydCA9ICdVU0VSX0ZSQVVEX0FMRVJUJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gQmFzZSBSZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBUaGUgcmVzdWx0aW5nIGBlcnJvcmAgd2lsbCBoYXZlIGFuIGBlcnJvcl90eXBlYCBvZiBgQkFTRV9SRVBPUlRfRVJST1JgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCYXNlUmVwb3J0c0Vycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJhc2VSZXBvcnRzRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkFTRV9SRVBPUlRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBVc2VyIElEIHRoZSB3ZWJob29rIGhhcyBmaXJlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmFzZVJlcG9ydHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgYXR0cmlidXRlcyBvYmplY3QgY29udGFpbnMgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyBhY2NvdW50IHJpc2suIEV4YW1wbGVzIG9mIGRhdGEgaW5jbHVkZTogYGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbmA6IFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZCBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2RgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF8zMGRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnRgOiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIEZvciB0aGUgZnVsbCBsaXN0IGFuZCBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIGNvcmUgYXR0cmlidXRlcyBhdmFpbGFibGUsIG9yIHRvIHJlcXVlc3QgdGhhdCBjb3JlIGF0dHJpYnV0ZXMgbm90IGJlIHJldHVybmVkLCBjb250YWN0IFNhbGVzIG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlcyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiBjbG9zZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBvciB0aGUgY29uc3VtZXIsIG9yIGlzIGF0IHJpc2sgb2YgYmVpbmcgY2xvc2VkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBoYXMgd2l0aGRyYXdhbHMgYW5kIHRyYW5zZmVycyBkaXNhYmxlZCBvciBpZiBhY2Nlc3MgdG8gdGhlIGFjY291bnQgaXMgcmVzdHJpY3RlZC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSBmcmVlemUgYnkgdGhlIGNyZWRpdCBpc3N1ZXIsIGxlZ2FsIHJlc3RyaWN0aW9ucyAoZS5nLiwgc2FuY3Rpb25zKSwgb3IgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgbGltaXRpbmcgbW9udGhseSB3aXRoZHJhd2FscywgYW1vbmcgb3RoZXIgcmVhc29uc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRpbWVzIHRoZSBpdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfcGxhaWRfY29ubmVjdGlvbnNfY291bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzNkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzdkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfMzBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfM2Q6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF83ZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF8zMGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF8yOGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgZW1haWwgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF85MGQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgcGhvbmUgbnVtYmVycyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgYmFuayBhY2NvdW50IHdhcyBvcGVuZWQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0F0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBhdmFpbGFibGUgdG8gUGxhaWQgZm9yIHRoaXMgYWNjb3VudC4gVGhpcyBtZWFzdXJlLCBjb21iaW5lZCB3aXRoIFBsYWlkIGNvbm5lY3Rpb24gaGlzdG9yeSwgY2FuIGJlIHVzZWQgdG8gaW5mZXIgdGhlIGFnZSBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3Rfb2JzZXJ2ZWRfdHJhbnNhY3Rpb246IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIGFjY291bnQgaW4gdGhlIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgcmVzcG9uc2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgdHlwZT86IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlPzogQWNjb3VudFN1YnR5cGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50XG4gICAgICovXG4gICAgYXR0cmlidXRlcz86IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlcztcbn1cbi8qKlxuICogVGhlIGF0dHJpYnV0ZXMgb2JqZWN0IGNvbnRhaW5zIGRhdGEgdGhhdCBjYW4gYmUgdXNlZCB0byBhc3Nlc3MgYWNjb3VudCByaXNrLiBFeGFtcGxlcyBvZiBkYXRhIGluY2x1ZGU6IGBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb25gOiBUaGUgbnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIGZpcnN0IHRpbWUgdGhlIEl0ZW0gd2FzIGNvbm5lY3RlZCB0byBhbiBhcHBsaWNhdGlvbiB2aWEgUGxhaWQgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzdkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDcgZGF5cyBgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkYDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBvdmVyIHRoZSBwYXN0IDMwIGRheXMgYHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50YDogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZCBGb3IgdGhlIGZ1bGwgbGlzdCBhbmQgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBvZiBjb3JlIGF0dHJpYnV0ZXMgYXZhaWxhYmxlLCBvciB0byByZXF1ZXN0IHRoYXQgY29yZSBhdHRyaWJ1dGVzIG5vdCBiZSByZXR1cm5lZCwgY29udGFjdCBTYWxlcyBvciB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfc2luY2VfZmlyc3RfcGxhaWRfY29ubmVjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBhY2NvdW50IGhhcyBiZWVuIGNsb3NlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIG9yIHRoZSBjb25zdW1lciwgb3IgaXMgYXQgcmlzayBvZiBiZWluZyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfYWNjb3VudF9jbG9zZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBoYXMgd2l0aGRyYXdhbHMgYW5kIHRyYW5zZmVycyBkaXNhYmxlZCBvciBpZiBhY2Nlc3MgdG8gdGhlIGFjY291bnQgaXMgcmVzdHJpY3RlZC4gVGhpcyBjb3VsZCBiZSBkdWUgdG8gYSBmcmVlemUgYnkgdGhlIGNyZWRpdCBpc3N1ZXIsIGxlZ2FsIHJlc3RyaWN0aW9ucyAoZS5nLiwgc2FuY3Rpb25zKSwgb3IgcmVndWxhdG9yeSByZXF1aXJlbWVudHMgbGltaXRpbmcgbW9udGhseSB3aXRoZHJhd2FscywgYW1vbmcgb3RoZXIgcmVhc29uc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgaXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX3BsYWlkX2Nvbm5lY3Rpb25zX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBJdGVtIGhhcyBiZWVuIGNvbm5lY3RlZCB0byBhcHBsaWNhdGlvbnMgdmlhIFBsYWlkIG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGZhaWxlZCBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDMgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBmYWlsZWQgbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZmFpbGVkX3BsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgSVAgYWRkcmVzc2VzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF9pcF9hZGRyZXNzZXNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IElQIGFkZHJlc3NlcyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA5MCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnRBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkaXN0aW5jdF91c2VyX2FnZW50c19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDI4IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBlbWFpbF9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVBY2NvdW50QXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBob25lX2NoYW5nZV9jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgYmFuayBhY2NvdW50IHdhcyBvcGVuZWQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXZhaWxhYmxlIHRvIFBsYWlkIGZvciB0aGlzIGFjY291bnQuIFRoaXMgbWVhc3VyZSwgY29tYmluZWQgd2l0aCBQbGFpZCBjb25uZWN0aW9uIGhpc3RvcnksIGNhbiBiZSB1c2VkIHRvIGluZmVyIHRoZSBhZ2Ugb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlQWNjb3VudEF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X29ic2VydmVkX3RyYW5zYWN0aW9uPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiB5b3Ugd2FudCB0byBldmFsdWF0ZSByaXNrLiBgT05CT0FSRElOR2A6IHVzZXIgbGlua3MgYSBmaXJzdCBiYW5rIGFjY291bnQgYXMgcGFydCBvZiB0aGUgb25ib2FyZGluZyBmbG93IG9mIHlvdXIgcGxhdGZvcm0uIGBORVdfQUNDT1VOVGA6IHVzZXIgbGlua3MgYW5vdGhlciBiYW5rIGFjY291bnQgb3IgcmVwbGFjZXMgdGhlIGN1cnJlbnRseSBsaW5rZWQgYmFuayBhY2NvdW50IG9uIHlvdXIgcGxhdGZvcm0uIGBJTkZPUk1BVElPTl9DSEFOR0VgOiB1c2VyIGNoYW5nZXMgdGhlaXIgaW5mb3JtYXRpb24gb24geW91ciBwbGF0Zm9ybSwgZS5nLiwgdXBkYXRpbmcgdGhlaXIgcGhvbmUgbnVtYmVyLiBgRE9STUFOVF9VU0VSYDogIHlvdSBkZWNpZGUgdG8gcmUtZXZhbHVhdGUgYSB1c2VyIHRoYXQgYmVjb21lcyBhY3RpdmUgYWZ0ZXIgYSBwZXJpb2Qgb2YgaW5hY3Rpdml0eS4gICBgT1RIRVJgOiBhbnkgb3RoZXIgcmVhc29ucyBub3QgbGlzdGVkIGhlcmUgUG9zc2libGUgdmFsdWVzOiAgYE9OQk9BUkRJTkdgLCBgTkVXX0FDQ09VTlRgLCBgSU5GT1JNQVRJT05fQ0hBTkdFYCwgYERPUk1BTlRfVVNFUmAsIGBPVEhFUmAgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlRXZhbHVhdGlvblJlYXNvbiB7XG4gICAgT25ib2FyZGluZyA9ICdPTkJPQVJESU5HJyxcbiAgICBOZXdBY2NvdW50ID0gJ05FV19BQ0NPVU5UJyxcbiAgICBJbmZvcm1hdGlvbkNoYW5nZSA9ICdJTkZPUk1BVElPTl9DSEFOR0UnLFxuICAgIERvcm1hbnRVc2VyID0gJ0RPUk1BTlRfVVNFUicsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdjEvYmVhY29uL2FjY291bnRfcmlzay9yaXNrL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgaXMgdXNlZCB0byBjb3JyZWxhdGUgcmVxdWVzdHMgYnkgYSB1c2VyIHdpdGggbXVsdGlwbGUgZXZhbHVhdGlvbnMgYW5kL29yIG11bHRpcGxlIGxpbmtlZCBhY2NvdW50cy4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgY2xpZW50X3VzZXJfaWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgaWRlbnRpZmllciBvZiB3aGF0IHlvdSBhcmUgbG9va2luZyB0byBldmFsdWF0ZSAoYWNjb3VudCBhZGQsIGluZm9ybWF0aW9uIGNoYW5nZSwgZXRjLikgdG8gYWxsb3cgdXMgdG8gdGllIHRoZSBhY3Rpdml0eSB0byB0aGUgZGVjaXNpb25zIGFuZCBwb3NzaWJsZSBmcmF1ZCBvdXRjb21lIHNlbnQgdmlhIG91ciBmZWVkYmFjayBlbmRwb2ludHMuIFlvdSBjYW4gdXNlIHlvdXIgaW50ZXJuYWwgcmVxdWVzdCBJRCBvciBzaW1pbGFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2V2YWx1YXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVFdmFsdWF0aW9uUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV2YWx1YXRpb25fcmVhc29uPzogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUV2YWx1YXRpb25SZWFzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXZpY2U/OiBTaWduYWxEZXZpY2U7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgdGhlIGV2ZW50IGZvciBldmFsdWF0aW9uIGhhcyBvY2N1cnJlZC4gUG9wdWxhdGUgdGhpcyBmaWVsZCBmb3IgYmFja2ZpbGxpbmcgZGF0YS4gSWYgeW91IGRvbuKAmXQgcG9wdWxhdGUgdGhpcyBmaWVsZCwgd2XigJlsbCB1c2UgdGhlIHRpbWVzdGFtcCBhdCB0aGUgdGltZSBvZiByZWNlaXB0LiBVc2UgSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmFsdWF0ZV90aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWAgcmVzdWx0cyB0byBhIHN1YnNldCBvZiB0aGUgYWNjb3VudHMgb24gdGhlIGxpbmtlZCBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBhY2NvdW50X2lkc2AgZm9yIHRoZSBzcGVjaWZpYyBhY2NvdW50cyB0byBldmFsdWF0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi9hY2NvdW50X3Jpc2svdjEvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudHMgZm9yIHdoaWNoIGEgcmlzayBldmFsdWF0aW9uIGhhcyBiZWVuIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZUFjY291bnQ+O1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBjaGFuZ2UgbWFkZSB0byB0aGUgcGFyZW50IG9iamVjdCBzcGVjaWZ5aW5nIHdoYXQgY2F1c2VkIHRoZSBjaGFuZ2UgYXMgd2VsbCBhcyB3aGVuIGl0IG9jY3VycmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25BdWRpdFRyYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uQXVkaXRUcmFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWxTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkF1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICBzb3VyY2U6IEJlYWNvbkF1ZGl0VHJhaWxTb3VyY2U7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25BdWRpdFRyYWlsXG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkF1ZGl0VHJhaWxcbiAgICAgKi9cbiAgICB0aW1lc3RhbXA6IHN0cmluZztcbn1cbi8qKlxuICogQSB0eXBlIGluZGljYXRpbmcgd2hhdCBjYXVzZWQgYSByZXNvdXJjZSB0byBiZSBjaGFuZ2VkIG9yIHVwZGF0ZWQuICAgYGRhc2hib2FyZGAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBieSBhIG1lbWJlciBvZiB5b3VyIHRlYW0gdmlhIHRoZSBQbGFpZCBkYXNoYm9hcmQuICBgYXBpYCAtIFRoZSByZXNvdXJjZSB3YXMgY3JlYXRlZCBvciB1cGRhdGVkIHZpYSB0aGUgUGxhaWQgQVBJLiAgYHN5c3RlbWAgLSBUaGUgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgb3IgdXBkYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgcGFydCBvZiB0aGUgUGxhaWQgQmVhY29uIHN5c3RlbS4gRm9yIGV4YW1wbGUsIGlmIGFub3RoZXIgYnVzaW5lc3MgdXNpbmcgUGxhaWQgQmVhY29uIGNyZWF0ZWQgYSBmcmF1ZCByZXBvcnQgdGhhdCBtYXRjaGVkIG9uZSBvZiB5b3VyIHVzZXJzLCB5b3VyIG1hdGNoaW5nIHVzZXJcXCdzIHN0YXR1cyB3b3VsZCBhdXRvbWF0aWNhbGx5IGJlIHVwZGF0ZWQgYW5kIHRoZSBhdWRpdCB0cmFpbCBzb3VyY2Ugd291bGQgYmUgYHN5c3RlbWAuICBgYnVsa19pbXBvcnRgIC0gVGhlIHJlc291cmNlIHdhcyBjcmVhdGVkIG9yIHVwZGF0ZWQgYXMgcGFydCBvZiBhIGJ1bGsgaW1wb3J0IHByb2Nlc3MuIEZvciBleGFtcGxlLCBpZiB5b3VyIGNvbXBhbnkgcHJvdmlkZWQgYSBDU1Ygb2YgdXNlciBkYXRhIGFzIHBhcnQgb2YgeW91ciBpbml0aWFsIG9uYm9hcmRpbmcsIHRoZSBhdWRpdCB0cmFpbCBzb3VyY2Ugd291bGQgYmUgYGJ1bGtfaW1wb3J0YC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbkF1ZGl0VHJhaWxTb3VyY2Uge1xuICAgIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICAgIEFwaSA9ICdhcGknLFxuICAgIFN5c3RlbSA9ICdzeXN0ZW0nLFxuICAgIEJ1bGtJbXBvcnQgPSAnYnVsa19pbXBvcnQnXG59XG5cbi8qKlxuICogQmFuayBBY2NvdW50IEluc2lnaHRzIGVuY2Fwc3VsYXRlIHRoZSByaXNrIGluc2lnaHRzIGZvciBhIHNpbmdsZSBCYW5rIEFjY291bnQgbGlua2VkIHRvIGFuIEl0ZW0gdGhhdCBpcyBhc3NvY2FpdGVkIHdpdGggYSBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHR5cGU6IEFjY291bnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uQmFua0FjY291bnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHN1YnR5cGU6IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudEluc2lnaHRzXG4gICAgICovXG4gICAgYXR0cmlidXRlczogQmVhY29uQWNjb3VudFJpc2tBdHRyaWJ1dGVzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgQmFuayBBY2NvdW50cyBsaW5rZWQgdG8gYW4gSXRlbSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25CYW5rQWNjb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25CYW5rQWNjb3VudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElEIHRoZSBCYW5rIEFjY291bnRzIGJlbG9uZyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudHNcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvbkJhbmtBY2NvdW50SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25CYW5rQWNjb3VudHNcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QmVhY29uQmFua0FjY291bnRJbnNpZ2h0cz47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBCZWFjb24gVXNlciBjcmVhdGVkIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbiBtYXRjaGVzIG9uZSBvZiB5b3VyIGV4aXN0aW5nIHVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERVUExJQ0FURV9ERVRFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIER1cGxpY2F0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVEZXRlY3RlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fZHVwbGljYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlRGV0ZWN0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZ2V0dGluZyBhIEJlYWNvbiBEdXBsaWNhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBEdXBsaWNhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGJlYWNvbl9kdXBsaWNhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBtYXRjaGluZyBCZWFjb24gVXNlcnMgYW5kIGFuIGFuYWx5c2lzIG9mIHRoZSBmaWVsZHMgdGhleSBtYXRjaGVkIG9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gRHVwbGljYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclJldmlzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyMTogQmVhY29uVXNlclJldmlzaW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmV2aXNpb259XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmVhY29uX3VzZXIyOiBCZWFjb25Vc2VyUmV2aXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25EdXBsaWNhdGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gb25lIEJlYWNvbiBVc2VyIGFuZCBhbm90aGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvbk1hdGNoU3VtbWFyeUFuYWx5c2lzXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIGlkX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uTWF0Y2hTdW1tYXJ5QW5hbHlzaXNcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25NYXRjaFN1bW1hcnlBbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gdHdvIEJlYWNvbiBVc2Vycy4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IHRoZSBvdGhlciBCZWFjb24gVXNlci4gIGBwYXJ0aWFsX21hdGNoYCBpbmRpY2F0ZXMgdGhlIGRhdGEgYXBwcm94aW1hdGVseSBtYXRjaGVkIHRoZSBvdGhlciBCZWFjb24gVXNlci4gRm9yIGV4YW1wbGUsIFxcXCJLbm9wZVxcXCIgdnMuIFxcXCJLbm9wZS1XeWF0dFxcXCIgZm9yIGxhc3QgbmFtZS4gIGBub19tYXRjaGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIGFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG90aGVyIEJlYWNvbiBVc2VyIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gY29tcGFyZSB0aGlzIGZpZWxkIGFnYWluc3QgdGhlIG9yaWdpbmFsIEJlYWNvbiBVc2VyIGJlY2F1c2UgdGhlIGZpZWxkIHdhcyBub3QgcHJlc2VudCBpbiBvbmUgb2YgdGhlIEJlYWNvbiBVc2Vycy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEJlYWNvbk1hdGNoU3VtbWFyeUNvZGUge1xuICAgIE1hdGNoID0gJ21hdGNoJyxcbiAgICBQYXJ0aWFsTWF0Y2ggPSAncGFydGlhbF9tYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBmcmF1ZCBjb21taXR0ZWQgYnkgYSB1c2VyIGFzIHdlbGwgYXMgdGhlIGRhdGUgdGhlIGZyYXVkIHdhcyBjb21taXR0ZWQgYW5kIHRoZSB0b3RhbCBhbW91bnQgb2YgbW9uZXkgbG9zdCBkdWUgdG8gdGhlIGZyYXVkIGluY2lkZW50LiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIGJsb2NrIHNpbWlsYXIgZnJhdWQgYXR0ZW1wdHMgb24geW91ciBwbGF0Zm9ybSBhcyB3ZWxsIGFzIGFsZXJ0IG90aGVyIGNvbXBhbmllcyB3aG8gc2NyZWVuIGEgdXNlciB3aXRoIG1hdGNoaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uLiBPdGhlciBjb21wYW5pZXMgd2lsbCBub3QgcmVjZWl2ZSBhbnkgbmV3IGlkZW50aXR5IGluZm9ybWF0aW9uLCBqdXN0IHdoYXQgbWF0Y2hlZCwgcGx1cyBpbmZvcm1hdGlvbiBzdWNoIGFzIGluZHVzdHJ5LCB0eXBlIG9mIGZyYXVkLCBhbmQgZGF0ZSBvZiBmcmF1ZC4gIFlvdSBjYW4gbWFuYWdlIHlvdXIgZnJhdWQgcmVwb3J0cyBieSBhZGRpbmcsIGRlbGV0aW5nLCBvciBlZGl0aW5nIHJlcG9ydHMgYXMgeW91IGdldCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIGZyYXVkdWxlbnQgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0VHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZXZlbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfYW1vdW50OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBCZWFjb25BdWRpdFRyYWlsO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIEJlYWNvbiBSZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRDcmVhdGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogQmVhY29uUmVwb3J0Q3JlYXRlVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbW91bnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ/OiBGcmF1ZEFtb3VudCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ6IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIEJlYWNvbiBSZXBvcnQuICBgZmlyc3RfcGFydHlgOiBJZiB0aGlzIGlzIHRoZSBzYW1lIGluZGl2aWR1YWwgYXMgdGhlIG9uZSB3aG8gc3VibWl0dGVkIHRoZSBLWUMuICBgc3RvbGVuYDogSWYgdGhpcyBpcyBhIGRpZmZlcmVudCBpbmRpdmlkdWFsIGZyb20gdGhlIG9uZSB3aG8gc3VibWl0dGVkIHRoZSBLWUMuICBgc3ludGhldGljYDogSWYgdGhpcyBpcyBhbiBpbmRpdmlkdWFsIHVzaW5nIGZhYnJpY2F0ZWQgaW5mb3JtYXRpb24uICBgYWNjb3VudF90YWtlb3ZlcmA6IElmIHRoaXMgaW5kaXZpZHVhbFxcJ3MgYWNjb3VudCB3YXMgY29tcHJvbWlzZWQuICBgdW5rbm93bmA6IElmIHlvdSBhcmVuXFwndCBzdXJlIHdobyBjb21taXR0ZWQgdGhlIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uUmVwb3J0Q3JlYXRlVHlwZSB7XG4gICAgRmlyc3RQYXJ0eSA9ICdmaXJzdF9wYXJ0eScsXG4gICAgU3RvbGVuID0gJ3N0b2xlbicsXG4gICAgU3ludGhldGljID0gJ3N5bnRoZXRpYycsXG4gICAgQWNjb3VudFRha2VvdmVyID0gJ2FjY291bnRfdGFrZW92ZXInLFxuICAgIERhdGFCcmVhY2ggPSAnZGF0YV9icmVhY2gnLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB5b3VyIEJlYWNvbiBVc2VycyBpcyBmaXJzdCByZXBvcnRlZCB0byB0aGUgQmVhY29uIG5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydENyZWF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX0NSRUFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0Q3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRDcmVhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGdldHRpbmcgYSBCZWFjb24gUmVwb3J0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBSZXBvcnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIGZyYXVkIGNvbW1pdHRlZCBieSBhIHVzZXIgYXMgd2VsbCBhcyB0aGUgZGF0ZSB0aGUgZnJhdWQgd2FzIGNvbW1pdHRlZCBhbmQgdGhlIHRvdGFsIGFtb3VudCBvZiBtb25leSBsb3N0IGR1ZSB0byB0aGUgZnJhdWQgaW5jaWRlbnQuICBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYmxvY2sgc2ltaWxhciBmcmF1ZCBhdHRlbXB0cyBvbiB5b3VyIHBsYXRmb3JtIGFzIHdlbGwgYXMgYWxlcnQgb3RoZXIgY29tcGFuaWVzIHdobyBzY3JlZW4gYSB1c2VyIHdpdGggbWF0Y2hpbmcgaWRlbnRpdHkgaW5mb3JtYXRpb24uIE90aGVyIGNvbXBhbmllcyB3aWxsIG5vdCByZWNlaXZlIGFueSBuZXcgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGp1c3Qgd2hhdCBtYXRjaGVkLCBwbHVzIGluZm9ybWF0aW9uIHN1Y2ggYXMgaW5kdXN0cnksIHR5cGUgb2YgZnJhdWQsIGFuZCBkYXRlIG9mIGZyYXVkLiAgWW91IGNhbiBtYW5hZ2UgeW91ciBmcmF1ZCByZXBvcnRzIGJ5IGFkZGluZywgZGVsZXRpbmcsIG9yIGVkaXRpbmcgcmVwb3J0cyBhcyB5b3UgZ2V0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gZnJhdWR1bGVudCB1c2Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uUmVwb3J0VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZyYXVkX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXZlbnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBmcmF1ZF9hbW91bnQ6IEZyYXVkQW1vdW50IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgQmVhY29uIFJlcG9ydHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmVhY29uL3JlcG9ydC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25SZXBvcnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fcmVwb3J0czogQXJyYXk8QmVhY29uUmVwb3J0PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIHJlcHJlc2VudHMgYSBCZWFjb24gUmVwb3J0IGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdXIgb3JnYW5pemF0aW9uIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyIHRoYXQgbWF0Y2hlcyBhIHNwZWNpZmljIEJlYWNvbiBVc2VyIHlvdVxcJ3ZlIGNyZWF0ZWQuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gdGhlIG9yaWdpbmFsbHkgcmVwb3J0ZWQgQmVhY29uIFVzZXIgYW5kIHRoZSBCZWFjb24gVXNlciB0aGF0IHRoZSByZXBvcnQgd2FzIHN5bmRpY2F0ZWQgdG8uICBUaGUgYHJlcG9ydGAgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGEgc3Vic2V0IG9mIGluZm9ybWF0aW9uIGZyb20gdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvblxuICAgICAqL1xuICAgIGFuYWx5c2lzOiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvZiB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBCZWFjb25NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzXG4gICAgICovXG4gICAgaXBfYWRkcmVzczogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25BbmFseXNpc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcjogQmVhY29uTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpcz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXNcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzOiBBcnJheTxCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzPjtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHJlcG9ydCBjcmVhdGVkIG9uIHRoZSBCZWFjb24gTmV0d29yayBtYXRjaGVzIHdpdGggb25lIG9mIHlvdXIgQmVhY29uIFVzZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25DcmVhdGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEJFQUNPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFUE9SVF9TWU5ESUNBVElPTl9DUkVBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkNyZWF0ZWRXZWJob29rXG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQ3JlYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBnZXR0aW5nIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3JlcG9ydF9zeW5kaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiByZXByZXNlbnRzIGEgQmVhY29uIFJlcG9ydCBjcmVhdGVkIGVpdGhlciBieSB5b3VyIG9yZ2FuaXphdGlvbiBvciBhbm90aGVyIEJlYWNvbiBjdXN0b21lciB0aGF0IG1hdGNoZXMgYSBzcGVjaWZpYyBCZWFjb24gVXNlciB5b3VcXCd2ZSBjcmVhdGVkLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIHRoZSBvcmlnaW5hbGx5IHJlcG9ydGVkIEJlYWNvbiBVc2VyIGFuZCB0aGUgQmVhY29uIFVzZXIgdGhhdCB0aGUgcmVwb3J0IHdhcyBzeW5kaWNhdGVkIHRvLiAgVGhlIGByZXBvcnRgIGZpZWxkIGluIHRoZSByZXNwb25zZSBjb250YWlucyBhIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW5hbHlzaXM6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uQW5hbHlzaXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmVhY29uUmVwb3J0U3luZGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfc3luZGljYXRpb25zOiBBcnJheTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN1YnNldCBvZiBpbmZvcm1hdGlvbiBmcm9tIGEgQmVhY29uIFJlcG9ydCB0aGF0IGhhcyBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBtYXRjaGluZyBCZWFjb24gVXNlciBpbiB5b3VyIHByb2dyYW0uICBUaGUgYGlkYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaXMgdGhlIElEIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQgdGhhdCB3YXMgc3luZGljYXRlZC4gSWYgdGhlIG9yaWdpbmFsIHJlcG9ydCB3YXMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiwgdGhlIGZpZWxkIHdpbGwgYmUgZmlsbGVkIHdpdGggdGhlIElEIG9mIHRoZSByZXBvcnQuIE90aGVyd2lzZSwgdGhlIGZpZWxkIHdpbGwgYmUgYG51bGxgIGluZGljYXRpbmcgdGhhdCB0aGUgb3JpZ2luYWwgcmVwb3J0IHdhcyBjcmVhdGVkIGJ5IGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblJlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uT3JpZ2luYWxSZXBvcnRcbiAgICAgKi9cbiAgICB0eXBlOiBCZWFjb25SZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbk9yaWdpbmFsUmVwb3J0XG4gICAgICovXG4gICAgZnJhdWRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0U3luZGljYXRpb25PcmlnaW5hbFJlcG9ydFxuICAgICAqL1xuICAgIGV2ZW50X2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgQmVhY29uIFJlcG9ydC4gIGBmaXJzdF9wYXJ0eWA6IElmIHRoaXMgaXMgdGhlIHNhbWUgaW5kaXZpZHVhbCBhcyB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzdG9sZW5gOiBJZiB0aGlzIGlzIGEgZGlmZmVyZW50IGluZGl2aWR1YWwgZnJvbSB0aGUgb25lIHdobyBzdWJtaXR0ZWQgdGhlIEtZQy4gIGBzeW50aGV0aWNgOiBJZiB0aGlzIGlzIGFuIGluZGl2aWR1YWwgdXNpbmcgZmFicmljYXRlZCBpbmZvcm1hdGlvbi4gIGBhY2NvdW50X3Rha2VvdmVyYDogSWYgdGhpcyBpbmRpdmlkdWFsXFwncyBhY2NvdW50IHdhcyBjb21wcm9taXNlZC4gIGBkYXRhX2JyZWFjaGA6IElmIHRoaXMgaW5kaXZpZHVhbFxcJ3MgZGF0YSB3YXMgY29tcHJvbWlzZWQgaW4gYSBicmVhY2guICBgdW5rbm93bmA6IElmIHlvdSBhcmVuXFwndCBzdXJlIHdobyBjb21taXR0ZWQgdGhlIGZyYXVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQmVhY29uUmVwb3J0VHlwZSB7XG4gICAgRmlyc3RQYXJ0eSA9ICdmaXJzdF9wYXJ0eScsXG4gICAgU3RvbGVuID0gJ3N0b2xlbicsXG4gICAgU3ludGhldGljID0gJ3N5bnRoZXRpYycsXG4gICAgQWNjb3VudFRha2VvdmVyID0gJ2FjY291bnRfdGFrZW92ZXInLFxuICAgIERhdGFCcmVhY2ggPSAnZGF0YV9icmVhY2gnLFxuICAgIFVua25vd24gPSAndW5rbm93bidcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG9uZSBvZiB5b3VyIGV4aXN0aW5nIEJlYWNvbiBSZXBvcnRzIGhhcyBiZWVuIG1vZGlmaWVkIG9yIHJlbW92ZWQgZnJvbSB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblJlcG9ydFVwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBCRUFDT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVQT1JUX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uUmVwb3J0VXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGJlYWNvbl9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25SZXBvcnRVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuYWx5c2lzIG9mIHdoZXRoZXIgdGhpcyBhY2NvdW50IG1hdGNoZWQgYmV0d2VlbiB0aGUgb3JpZ2luYWxseSByZXBvcnRlZCBCZWFjb24gVXNlciBhbmQgdGhlIEJlYWNvbiBVc2VyIHRoYXQgdGhlIHJlcG9ydCBzeW5kaWNhdGVkIHRvLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25TeW5kaWNhdGVkUmVwb3J0RGVwb3NpdG9yeUFjY291bnRNYXRjaEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IG51bWVyaWMgY2hhcmFjdGVycyBvZiB0aGlzIGFjY291bnTigJlzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblN5bmRpY2F0ZWRSZXBvcnREZXBvc2l0b3J5QWNjb3VudE1hdGNoQW5hbHlzaXNcbiAgICAgKi9cbiAgICBhY2NvdW50X21hc2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcm91dGluZyBudW1iZXIgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uU3luZGljYXRlZFJlcG9ydERlcG9zaXRvcnlBY2NvdW50TWF0Y2hBbmFseXNpc1xuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblN5bmRpY2F0ZWRSZXBvcnREZXBvc2l0b3J5QWNjb3VudE1hdGNoQW5hbHlzaXNcbiAgICAgKi9cbiAgICBtYXRjaF9zdGF0dXM6IEJlYWNvbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBQbGFpZCBJdGVtIElEcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBBY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7U2V0PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBpdGVtX2lkczogU2V0PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gUHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyXG4gICAgICovXG4gICAgdXNlcjogQmVhY29uVXNlckRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkF1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgdGhlIHJpc2sgaW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcXCdzIEJhbmsgQWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi91c2VyL2FjY291bnQvaW5zaWdodHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuIFRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBsYXN0IHRpbWUgdGhlIHJlc291cmNlIHdhcyBtb2RpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvbkJhbmtBY2NvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19hY2NvdW50X2luc2lnaHRzOiBCZWFjb25CYW5rQWNjb3VudHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGNvbGxlY3RlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogICBBZGRyZXNzZXMgZnJvbSB0aGUgVW5pdGVkIEtpbmdkb20gd2lsbCBub3QgaW5jbHVkZSBhIHJlZ2lvbiAgIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIGEgcG9zdGFsIGNvZGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGEgQmVhY29uIFVzZXIuICBUaGUgcHJpbWFyeSB1c2UgZm9yIHRoaXMgZW5kcG9pbnQgaXMgdG8gYWRkIGEgbmV3IGVuZCB1c2VyIHRvIEJlYWNvbiBmb3IgZnJhdWQgYW5kIGR1cGxpY2F0ZSBzY2FubmluZy4gIFNvbWUgZmllbGRzIGFyZSBvcHRpb25hbCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHByb3ZpZGUgYXMgbXVjaCBpbmZvcm1hdGlvbiBhcyBwb3NzaWJsZSB0byBpbXByb3ZlIHRoZSBhY2N1cmFjeSBvZiB0aGUgZnJhdWQgYW5kIGR1cGxpY2F0ZSBzY2FubmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyUmVxdWVzdERhdGE7XG4gICAgLyoqXG4gICAgICogU2VuZCB0aGlzIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgdG8gbGluayBhY2NvdW50cyB0byB0aGUgQmVhY29uIFVzZXIgYW5kIGhhdmUgdGhlbSBldmFsdWF0ZWQgZm9yIEFjY291bnQgSW5zaWdodHMuIEEgbWF4aW11bSBvZiA1MCBhY2NvdW50cyB0b3RhbCBjYW4gYmUgYWRkZWQgdG8gYSBzaW5nbGUgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyIHJlcHJlc2VudHMgYW4gZW5kIHVzZXIgdGhhdCBoYXMgYmVlbiBzY2FubmVkIGFnYWluc3QgdGhlIEJlYWNvbiBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIEl0ZW0gSURzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZHM6IFNldDxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSBhbmQgcmVzdWx0aW5nIGFuYWx5c2lzIHdoZW4gY2hlY2tlZCBhZ2FpbnN0IGR1cGxpY2F0ZSByZWNvcmRzIGFuZCB0aGUgQmVhY29uIEZyYXVkIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckRhdGEge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IEJlYWNvblVzZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxCZWFjb25Vc2VyRGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGRlcG9zaXRvcnlfYWNjb3VudHM6IEFycmF5PEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIERlcG9zaXRvcnkgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIHRoaXMgYWNjb3VudOKAmXMgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckRlcG9zaXRvcnlBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9tYXNrOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJEZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIGFkZGVkX2F0OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGEgQmVhY29uIFVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIEJlYWNvbiBVc2VyIHJlcHJlc2VudHMgYW4gZW5kIHVzZXIgdGhhdCBoYXMgYmVlbiBzY2FubmVkIGFnYWluc3QgdGhlIEJlYWNvbiBOZXR3b3JrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIEl0ZW0gSURzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtTZXQ8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbV9pZHM6IFNldDxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB2ZXJzaW9uYCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIGVhY2ggdGltZSB0aGUgdXNlciBpcyB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC4gVGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIGxhc3QgdGltZSB0aGUgcmVzb3VyY2Ugd2FzIG1vZGlmaWVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBCZWFjb25Vc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBQcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBCZWFjb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IEJlYWNvbkF1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyB0aGUgaGlzdG9yeSBvZiBhIEJlYWNvbiBVc2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JlYWNvbi91c2VyL2hpc3RvcnkvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlckhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXI+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyczogQXJyYXk8QmVhY29uVXNlcj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgSUQgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VySUROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGlkZW50aXR5IGRvY3VtZW50IHZhbHVlIHR5cGVkIGluIGJ5IHVzZXIuIEFscGhhLW51bWVyaWMsIHdpdGggYWxsIGZvcm1hdHRpbmcgY2hhcmFjdGVycyBzdHJpcHBlZC4gRm9yIHNwZWNpZmljIGZvcm1hdCByZXF1aXJlbWVudHMgYnkgSUQgdHlwZSwgc2VlIFtIeWJyaWQgSW5wdXQgVmFsaWRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS12ZXJpZmljYXRpb24vaHlicmlkLWlucHV0LXZhbGlkYXRpb24vKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VySUROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJRE51bWJlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHR5cGU6IElETnVtYmVyVHlwZTtcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGZ1bGwgbmFtZSBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJOYW1lTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlck5hbWVOdWxsYWJsZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJOYW1lTnVsbGFibGVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHN0cmVldCBwb3J0aW9uIG9mIGFuIGFkZHJlc3MuIElmIGFuIGFkZHJlc3MgaXMgcHJvdmlkZWQsIHRoaXMgZmllbGQgd2lsbCBhbHdheXMgYmUgZmlsbGVkLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA4MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENpdHkgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIGFkZHJlc3MuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBIb21lIGFkZHJlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ2l0eSBmcm9tIHRoZSBlbmQgdXNlclxcJ3MgYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3RBZGRyZXNzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIGFnYWluc3QgZHVwbGljYXRlIHJlY29yZHMgYW5kIHRoZSBCZWFjb24gRnJhdWQgTmV0d29yay4gIEluIG9yZGVyIHRvIGNyZWF0ZSBhIEJlYWNvbiBVc2VyLCBpbiBhZGRpdGlvbiB0byB0aGUgYG5hbWVgLCBfZWl0aGVyXyB0aGUgYGRhdGVfb2ZfYmlydGhgIF9vcl8gdGhlIGBkZXBvc2l0b3J5X2FjY291bnRzYCBmaWVsZCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmVxdWVzdERhdGEge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgbmFtZTogQmVhY29uVXNlck5hbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgYWRkcmVzcz86IEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REYXRhXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI/OiBCZWFjb25Vc2VySUROdW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByb3ZpZGUgYSBsaXN0IG9mIGJhbmsgYWNjb3VudHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuIFRoZXNlIGFjY291bnRzIHdpbGwgYmUgc2Nhbm5lZCBhY3Jvc3MgdGhlIEJlYWNvbiBOZXR3b3JrIGFuZCB1c2VkIHRvIGZpbmQgZHVwbGljYXRlIHJlY29yZHMuICBOb3RlOiBUaGVzZSBhY2NvdW50cyB3aWxsIG5vdCBoYXZlIEJhbmsgQWNjb3VudCBJbnNpZ2h0cy4gVG8gcmVjZWl2ZSBCYW5rIEFjY291bnQgSW5zaWdodHMgcGxlYXNlIHN1cHBseSBgYWNjZXNzX3Rva2Vuc2AuXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzPzogQXJyYXk8QmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIERlcG9zaXRvcnkgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBVUyBCYW5rIEFjY291bnQgTnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnRcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciB1cGRhdGluZyB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclJldmlld1JlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1czogQmVhY29uVXNlclN0YXR1cztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBCZWFjb24gVXNlciBSZXZpc2lvbiBpZGVudGlmaWVzIGEgQmVhY29uIFVzZXIgYXQgc29tZSBwb2ludCBpbiBpdHMgcmV2aXNpb24gaGlzdG9yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclJldmlzaW9uIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aXNpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdmVyc2lvbmAgZmllbGQgYmVnaW5zIHdpdGggMSBhbmQgaW5jcmVtZW50cyB3aXRoIGVhY2ggc3Vic2VxdWVudCByZXZpc2lvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyUmV2aXNpb25cbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBgcmVqZWN0ZWRgOiBUaGUgQmVhY29uIFVzZXIgaGFzIGJlZW4gcmVqZWN0ZWQgZm9yIGZyYXVkLiBVc2VycyBjYW4gYmUgYXV0b21hdGljYWxseSBvciBtYW51YWxseSByZWplY3RlZC4gIGBwZW5kaW5nX3Jldmlld2A6IFRoZSBCZWFjb24gVXNlciBoYXMgYmVlbiBtYXJrZWQgZm9yIHJldmlldy4gIGBjbGVhcmVkYDogVGhlIEJlYWNvbiBVc2VyIGhhcyBiZWVuIGNsZWFyZWQgb2YgZnJhdWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBCZWFjb25Vc2VyU3RhdHVzIHtcbiAgICBSZWplY3RlZCA9ICdyZWplY3RlZCcsXG4gICAgUGVuZGluZ1JldmlldyA9ICdwZW5kaW5nX3JldmlldycsXG4gICAgQ2xlYXJlZCA9ICdjbGVhcmVkJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gYSBCZWFjb24gVXNlciBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciB3aGVuIGluZm9ybWF0aW9uIGlzIHJlcG9ydGVkIHRvIHRoZSBCZWFjb24gbmV0d29yay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQkVBQ09OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX1NUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIHVwZGF0aW5nIHRoZSBpZGVudGl0eSBkYXRhIG9mIGEgQmVhY29uIFVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYmVhY29uX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGEgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNlbmQgdGhpcyBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIHRvIGFkZCBhY2NvdW50cyB0byB0aGlzIHVzZXIgZm9yIGV2YWx1YXRpb24uIFRoaXMgd2lsbCBhZGQgYWNjb3VudHMgdG8gdGhpcyBCZWFjb24gVXNlci4gSWYgbGVmdCBudWxsIG9ubHkgZXhpc3RpbmcgYWNjb3VudHMgd2lsbCBiZSByZXR1cm5lZCBpbiByZXNwb25zZS4gQSBtYXhpbXVtIG9mIDUwIGFjY291bnRzIHRvdGFsIGNhbiBiZSBhZGRlZCB0byBhIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQSBzdWJzZXQgb2YgYSBCZWFjb24gVXNlclxcJ3MgZGF0YSB3aGljaCBpcyB1c2VkIHRvIHBhdGNoIHRoZSBleGlzdGluZyBpZGVudGl0eSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIEJlYWNvbiBVc2VyLiBBdCBsZWFzdCBvbmUgZmllbGQgbXVzdCBiZSBwcm92aWRlZC4gSWYgbGVmdCB1bnNldCBvciBudWxsLCB1c2VyIGRhdGEgd2lsbCBub3QgYmUgcGF0Y2hlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhIHtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlck5hbWVOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgbmFtZT86IEJlYWNvblVzZXJOYW1lTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyUmVxdWVzdEFkZHJlc3NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgYWRkcmVzcz86IEJlYWNvblVzZXJSZXF1ZXN0QWRkcmVzc051bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0RGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcj86IEJlYWNvblVzZXJJRE51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVB2NCBvciBJUFY2IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlcXVlc3REYXRhXG4gICAgICovXG4gICAgaXBfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEJlYWNvblVzZXJSZXF1ZXN0RGVwb3NpdG9yeUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVxdWVzdERhdGFcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5X2FjY291bnRzPzogQXJyYXk8QmVhY29uVXNlclJlcXVlc3REZXBvc2l0b3J5QWNjb3VudD47XG59XG4vKipcbiAqIEEgQmVhY29uIFVzZXIgcmVwcmVzZW50cyBhbiBlbmQgdXNlciB0aGF0IGhhcyBiZWVuIHNjYW5uZWQgYWdhaW5zdCB0aGUgQmVhY29uIE5ldHdvcmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgSXRlbSBJRHMgY29ycmVzcG9uZGluZyB0byB0aGUgQWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge1NldDxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkczogU2V0PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHZlcnNpb25gIGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgZWFjaCB0aW1lIHRoZSB1c2VyIGlzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLiBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgbGFzdCB0aW1lIHRoZSByZXNvdXJjZSB3YXMgbW9kaWZpZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXBkYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25Vc2VyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IEJlYWNvblVzZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmVhY29uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHVzZXI6IEJlYWNvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCZWFjb25BdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBCZWFjb25Vc2VyVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogQmVhY29uQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQmVhY29uVXNlclVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvcmVnaXN0ZXJgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBsb2FucyB0byByZWdpc3Rlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblJlZ2lzdGVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2FuczogQXJyYXk8Q3JhTG9hblJlZ2lzdGVyPjtcbn1cbi8qKlxuICogVGhlIHZlcnNpb25zIG9mIGNhc2hmbG93IGF0dHJpYnV0ZXNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24ge1xuICAgIFYxMCA9ICd2MS4wJ1xufVxuXG4vKipcbiAqIENhdGVnb3JpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY2F0ZWdvcmllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWxsIG9mIHRoZSB0cmFuc2FjdGlvbiBjYXRlZ29yaWVzIHVzZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge0FycmF5PENhdGVnb3J5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcmllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgY2F0ZWdvcmllczogQXJyYXk8Q2F0ZWdvcnk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yaWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgYSB0cmFuc2FjdGlvbiBjYXRlZ29yeVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmeWluZyBudW1iZXIgZm9yIHRoZSBjYXRlZ29yeS4gYGNhdGVnb3J5X2lkYCBpcyBhIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgYW5kIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gbWVyY2hhbnQgY2F0ZWdvcnkgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBwbGFjZWAgZm9yIHBoeXNpY2FsIHRyYW5zYWN0aW9ucyBvciBgc3BlY2lhbGAgZm9yIG90aGVyIHRyYW5zYWN0aW9ucyBzdWNoIGFzIGJhbmsgY2hhcmdlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeVxuICAgICAqL1xuICAgIGdyb3VwOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyBgY2F0ZWdvcnlfaWRgIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5XG4gICAgICovXG4gICAgaGllcmFyY2h5OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBvYmplY3QgZm9yIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBDYXRlZ29yeSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDYXRlZ29yeUluc2lnaHREZXRhaWxzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0RGV0YWlsc1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCBjb21tb24gY291bnRlcnBhcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2F0ZWdvcnkgc29ydGVkIGJ5IG91dGZsb3cuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodERldGFpbHNcbiAgICAgKi9cbiAgICB0b3BfY291bnRlcnBhcnRpZXM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBvbiBhIHVzZXJcXCdzIHRvcCBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENhdGVnb3J5SW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYXRlZ29yeUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluc2lnaHRzIG9mIHRvcCBwcmltYXJ5IHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyByYW5rZWQgYnkgb3V0Zmxvdy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz59XG4gICAgICogQG1lbWJlcm9mIENhdGVnb3J5SW5zaWdodHNcbiAgICAgKi9cbiAgICBwcmltYXJ5X2NhdGVnb3J5X2luc2lnaHRzPzogQXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz47XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbnNpZ2h0cyBvZiB0b3AgZGV0YWlsZWQgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIHJhbmtlZCBieSBvdXRmbG93LlxuICAgICAqIEB0eXBlIHtBcnJheTxDYXRlZ29yeUluc2lnaHREZXRhaWxzPn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F0ZWdvcnlJbnNpZ2h0c1xuICAgICAqL1xuICAgIGRldGFpbGVkX2NhdGVnb3J5X2luc2lnaHRzPzogQXJyYXk8Q2F0ZWdvcnlJbnNpZ2h0RGV0YWlscz47XG59XG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXVzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdXNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvclR5cGV9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfdHlwZTogUGxhaWRFcnJvclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIHBhcnRpY3VsYXIgZXJyb3IgY29kZS4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgcmVhc29uIGZvciB0aGUgZXJyb3IgY29kZS4gQ3VycmVudGx5LCByZWFzb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBPQXV0aC1iYXNlZCBpdGVtIGVycm9yczsgYG51bGxgIHdpbGwgYmUgcmV0dXJuZWQgb3RoZXJ3aXNlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLiAgUG9zc2libGUgdmFsdWVzOiBgT0FVVEhfSU5WQUxJRF9UT0tFTmA6IFRoZSB1c2Vy4oCZcyBPQXV0aCBjb25uZWN0aW9uIHRvIHRoaXMgaW5zdGl0dXRpb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuICBgT0FVVEhfQ09OU0VOVF9FWFBJUkVEYDogVGhlIHVzZXJcXCdzIGFjY2VzcyBjb25zZW50IGZvciB0aGlzIE9BdXRoIGNvbm5lY3Rpb24gdG8gdGhpcyBpbnN0aXR1dGlvbiBoYXMgZXhwaXJlZC4gIGBPQVVUSF9VU0VSX1JFVk9LRURgOiBUaGUgdXNlcuKAmXMgT0F1dGggY29ubmVjdGlvbiB0byB0aGlzIGluc3RpdHV0aW9uIGlzIGludmFsaWQgYmVjYXVzZSB0aGUgdXNlciByZXZva2VkIHRoZWlyIGNvbm5lY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9jb2RlX3JlYXNvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXZlbG9wZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gYG51bGxgIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gIFRoaXMgbWF5IGNoYW5nZSBvdmVyIHRpbWUgYW5kIGlzIG5vdCBzYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDYXVzZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW4gdGhpcyBwcm9kdWN0LCBhIHJlcXVlc3QgY2FuIHBlcnRhaW4gdG8gbW9yZSB0aGFuIG9uZSBJdGVtLiBJZiBhbiBlcnJvciBpcyByZXR1cm5lZCBmb3Igc3VjaCBhIHJlcXVlc3QsIGBjYXVzZXNgIHdpbGwgcmV0dXJuIGFuIGFycmF5IG9mIGVycm9ycyBjb250YWluaW5nIGEgYnJlYWtkb3duIG9mIHRoZXNlIGVycm9ycyBvbiB0aGUgaW5kaXZpZHVhbCBJdGVtIGxldmVsLCBpZiBhbnkgY2FuIGJlIGlkZW50aWZpZWQuICBgY2F1c2VzYCB3aWxsIG9ubHkgYmUgcHJvdmlkZWQgZm9yIHRoZSBgZXJyb3JfdHlwZWAgYEFTU0VUX1JFUE9SVF9FUlJPUmAuIGBjYXVzZXNgIHdpbGwgYWxzbyBub3QgYmUgcG9wdWxhdGVkIGluc2lkZSBhbiBlcnJvciBuZXN0ZWQgd2l0aGluIGEgYHdhcm5pbmdgIG9iamVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8YW55Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBjYXVzZXM/OiBBcnJheTxhbnk+O1xuICAgIC8qKlxuICAgICAqIFRoZSBIVFRQIHN0YXR1cyBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXJyb3IuIFRoaXMgd2lsbCBvbmx5IGJlIHJldHVybmVkIGluIHRoZSByZXNwb25zZSBib2R5IHdoZW4gdGhlIGVycm9yIGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkIHZpYSBhIHdlYmhvb2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhdGlvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VnZ2VzdGVkIHN0ZXBzIGZvciByZXNvbHZpbmcgdGhlIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBzdWdnZXN0ZWRfYWN0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2F1c2VcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDYXVzZUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F1c2VBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENhdXNlQWxsT2ZcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiB0aGF0IFBsYWlkIGhhcyBlbmhhbmNlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBVbmlxdWUgdHJhbnNhY3Rpb24gaWRlbnRpZmllciB0byB0aWUgdHJhbnNhY3Rpb25zIGJhY2sgdG8gY2xpZW50c1xcJyBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uLCBkZW5vbWluYXRlZCBpbiB0aGUgYWNjb3VudFxcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgLiBQb3NpdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBvdXQgb2YgdGhlIGFjY291bnQ7IG5lZ2F0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIGluLiBGb3IgZXhhbXBsZSwgZGViaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50cywgZGlyZWN0IGRlcG9zaXRzLCBhbmQgcmVmdW5kcyBhcmUgbmVnYXRpdmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5oYW5jZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VuaGFuY2VtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZW5oYW5jZW1lbnRzOiBFbmhhbmNlbWVudHM7XG59XG4vKipcbiAqIEEgY2xpZW50LXByb3ZpZGVkIHRyYW5zYWN0aW9uIHRoYXQgUGxhaWQgaGFzIGVucmljaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSB0cmFuc2FjdGlvbiBhcyBwcm92aWRlZCBieSB5b3UgaW4gdGhlIHJlcXVlc3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSB1c2VyIGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIHVzZXIsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfdXNlcl9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhY2NvdW50IGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIGFjY291bnQsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfYWNjb3VudF9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbj86IEVucmljaFRyYW5zYWN0aW9uRGlyZWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbiBlLmcuIFVTRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2htZW50c31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRFbnJpY2hlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZW5yaWNobWVudHM6IEVucmljaG1lbnRzO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5oYW5jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRSYXdUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGZvciB0aGUgdHJhbnNhY3Rpb24gdXNlZCB0byBoZWxwIHlvdSB0aWUgZGF0YSBiYWNrIHRvIHlvdXIgc3lzdGVtcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmF3IGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zYWN0aW9uIHdpdGggZGlyZWN0aW9uLiAoTk9URTogdGhpcyB3aWxsIGFmZmVjdCBlbnJpY2htZW50IHJlc3VsdHMsIHNvIGRpcmVjdGlvbnMgYXJlIGltcG9ydGFudCk6LiAgIE5lZ2F0aXZlICgtKSBmb3IgY3JlZGl0cyAoZS5nLiwgaW5jb21pbmcgdHJhbnNmZXJzLCByZWZ1bmRzKSAgIFBvc2l0aXZlICgrKSBmb3IgZGViaXRzIChlLmcuLCBwdXJjaGFzZXMsIGZlZXMsIG91dGdvaW5nIHRyYW5zZmVycylcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNsaWVudC1wcm92aWRlZCB0cmFuc2FjdGlvbiBmb3IgUGxhaWQgdG8gZW5yaWNoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgZm9yIHRoZSB0cmFuc2FjdGlvbiB1c2VkIHRvIGhlbHAgeW91IHRpZSBkYXRhIGJhY2sgdG8geW91ciBzeXN0ZW1zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIHVzZXIgaWQgdXNlZCB0byBncm91cCB0cmFuc2FjdGlvbnMgZm9yIGEgZ2l2ZW4gdXNlciwgYXMgYSB1bmlxdWUgaWRlbnRpZmllciBmcm9tIHlvdXIgYXBwbGljYXRpb24uIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGNsaWVudF91c2VyX2lkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBhY2NvdW50IGlkIHVzZWQgdG8gZ3JvdXAgdHJhbnNhY3Rpb25zIGZvciBhIGdpdmVuIGFjY291bnQsIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBjbGllbnRfYWNjb3VudF9pZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2xpZW50X2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBzdWJ0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByYXcgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLiBJZiB5b3UgaGF2ZSBsb2NhdGlvbiBkYXRhIGluIGF2YWlsYWJsZSBhbiB1bnN0cnVjdHVyZWQgZm9ybWF0LCBpdCBtYXkgYmUgYXBwZW5kZWQgdG8gdGhlIGBkZXNjcmlwdGlvbmAgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiAoPj0gMCkuIFdoZW4gdGVzdGluZyBFbnJpY2gsIG5vdGUgdGhhdCBgYW1vdW50YCBkYXRhIHNob3VsZCBiZSByZWFsaXN0aWMuIFVucmVhbGlzdGljIG9yIGluYWNjdXJhdGUgYGFtb3VudGAgZGF0YSBtYXkgcmVzdWx0IGluIHJlZHVjZWQgcXVhbGl0eSBvdXRwdXQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRpcmVjdGlvbjogRW5yaWNoVHJhbnNhY3Rpb25EaXJlY3Rpb247XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uIGUuZy4gVVNELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsb2NhdGlvbj86IENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvbjtcbiAgICAvKipcbiAgICAgKiBNZXJjaGFudCBjYXRlZ29yeSBjb2RlcyAoTUNDcykgYXJlIGZvdXItZGlnaXQgbnVtYmVycyB0aGF0IGRlc2NyaWJlIGEgbWVyY2hhbnRcXCdzIHByaW1hcnkgYnVzaW5lc3MgYWN0aXZpdGllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWNjPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGVfcG9zdGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHdoZXJlIGEgdHJhbnNhY3Rpb24gdG9vayBwbGFjZS4gIFVzZSB0aGlzIGZpZWxkIHRvIHBhc3MgaW4gc3RydWN0dXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiB5b3UgbWF5IGhhdmUgYWJvdXQgeW91ciB0cmFuc2FjdGlvbnMuIFByb3ZpZGluZyBsb2NhdGlvbiBkYXRhIGlzIG9wdGlvbmFsIGJ1dCBjYW4gaW5jcmVhc2UgcmVzdWx0IHF1YWxpdHkuIElmIHlvdSBoYXZlIHVuc3RydWN0dXJlZCBsb2NhdGlvbiBpbmZvcm1hdGlvbiwgaXQgbWF5IGJlIGFwcGVuZGVkIHRvIHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbkxvY2F0aW9uXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyZWV0IGFkZHJlc3Mgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENsaWVudFByb3ZpZGVkVHJhbnNhY3Rpb25Mb2NhdGlvblxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uTG9jYXRpb25cbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb25uZWN0ZWQgYXBwbGljYXRpb24gZm9yIGEgcGFydGljdWxhciBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25uZWN0ZWRBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25uZWN0ZWRBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiBmb3IgZGlzcGxheSBwdXJwb3Nlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGlzcGxheV9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIFVSTCB0aGF0IGxpbmtzIHRvIHRoZSBhcHBsaWNhdGlvbiBsb2dvIGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBhcHBsaWNhdGlvblxcJ3Mgd2Vic2l0ZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fdXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyBwcm92aWRlZCBieSB0aGUgY29ubmVjdGVkIGFwcCBzdGF0aW5nIHdoeSB0aGV5IHVzZSB0aGVpciByZXNwZWN0aXZlIGVuYWJsZWQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICByZWFzb25fZm9yX2FjY2Vzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhpcyBhcHBsaWNhdGlvbiB3YXMgbGlua2VkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQgaW4gVVRDLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbm5lY3RlZEFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY29wZXNOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29ubmVjdGVkQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICBzY29wZXM/OiBTY29wZXNOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGNvbnNlbnQgZXZlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnNlbnRFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNlbnRFdmVudCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIGNvbnNlbnQgZXZlbnQgb2NjdXJyZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zZW50RXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBldmVudF90eXBlPzogQ29uc2VudEV2ZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc2VudEV2ZW50Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfY29kZT86IENvbnNlbnRFdmVudENvZGU7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lIERheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc2VudEV2ZW50SW5pdGlhdG9yfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBpbml0aWF0b3I/OiBDb25zZW50RXZlbnRJbml0aWF0b3I7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHN0cmluZ3MgY29udGFpbmluZyB0aGUgZnVsbCBsaXN0IG9mIHVzZSBjYXNlcyB0aGUgZW5kIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0uICBTZWUgdGhlIFtmdWxsIGxpc3RdKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jdXBkYXRpbmctbGluay1jdXN0b21pemF0aW9ucykgb2YgdXNlIGNhc2VzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50RXZlbnRcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfdXNlX2Nhc2VzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBmdWxsIGxpc3Qgb2YgZGF0YSBzY29wZXMgdGhlIGVuZCB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtLiBUaGVzZSBjb3JyZXNwb25kIHRvIGNvbnNlbnRlZCBwcm9kdWN0czsgc2VlIHRoZSBbZnVsbCBtYXBwaW5nXSgvZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvI2RhdGEtc2NvcGVzLWJ5LXByb2R1Y3QpIG9mIGRhdGEgc2NvcGVzIGFuZCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgY29uc2VudGVkX2RhdGFfc2NvcGVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZm9yIHdoaWNoIGF1dGhvcml6YXRpb25zIGFyZSBncmFudGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb25zZW50ZWRBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50XG4gICAgICovXG4gICAgY29uc2VudGVkX2FjY291bnRzPzogQXJyYXk8Q29uc2VudGVkQWNjb3VudD47XG59XG4vKipcbiAqIENvZGVzIGRlc2NyaWJpbmcgdGhlIG9iamVjdCBvZiBhIGNvbnNlbnQgZXZlbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zZW50RXZlbnRDb2RlIHtcbiAgICBVc2VyQWdyZWVtZW50ID0gJ1VTRVJfQUdSRUVNRU5UJyxcbiAgICBVc2VDYXNlcyA9ICdVU0VfQ0FTRVMnLFxuICAgIERhdGFTY29wZXMgPSAnREFUQV9TQ09QRVMnLFxuICAgIEFjY291bnRTY29wZXMgPSAnQUNDT1VOVF9TQ09QRVMnXG59XG5cbi8qKlxuICogVGhlIGVudGl0eSB0aGF0IGluaXRpYXRlZCBjb2xsZWN0aW9uIG9mIGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDb25zZW50RXZlbnRJbml0aWF0b3Ige1xuICAgIFBsYWlkID0gJ1BMQUlEJyxcbiAgICBEYXRhUHJvdmlkZXIgPSAnREFUQV9QUk9WSURFUicsXG4gICAgQ3VzdG9tZXIgPSAnQ1VTVE9NRVInLFxuICAgIEVuZFVzZXIgPSAnRU5EX1VTRVInXG59XG5cbi8qKlxuICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgY29uc2VudCBldmVudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnNlbnRFdmVudFR5cGUge1xuICAgIEdyYW50ZWQgPSAnQ09OU0VOVF9HUkFOVEVEJyxcbiAgICBSZXZva2VkID0gJ0NPTlNFTlRfUkVWT0tFRCcsXG4gICAgVXBkYXRlZCA9ICdDT05TRU5UX1VQREFURUQnXG59XG5cbi8qKlxuICogUmVxdWVzdCB0byBsaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgaXRlbSBjb25zZW50IGV2ZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudEV2ZW50c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgY29uc2VudCBldmVudHMuXG4gICAgICogQHR5cGUge0FycmF5PENvbnNlbnRFdmVudD59XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRFdmVudHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbnNlbnRfZXZlbnRzOiBBcnJheTxDb25zZW50RXZlbnQ+O1xufVxuLyoqXG4gKiBBIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zZW50ZWRBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc2VudGVkQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgYWNjb3VudC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudGVkQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc2VudGVkQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRlZEFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50ZWRBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENvbnNlbnRlZEFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb25zZW50ZWRBY2NvdW50XG4gICAgICovXG4gICAgc3VidHlwZT86IEFjY291bnRTdWJ0eXBlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcHJldmlvdXNseSBzdWJtaXR0ZWQgdmFsaWQgZGlzcHV0ZSBzdGF0ZW1lbnQgYnkgdGhlIGNvbnN1bWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvbnN1bWVyRGlzcHV0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bWVyRGlzcHV0ZSB7XG4gICAgLyoqXG4gICAgICogKERlcHJlY2F0ZWQpIEEgdW5pcXVlIGlkZW50aWZpZXIgKFVVSUQpIG9mIHRoZSBjb25zdW1lciBkaXNwdXRlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyRGlzcHV0ZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY29uc3VtZXJfZGlzcHV0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgb2YgdGhlIGRpc3B1dGVkIGZpZWxkIChlLmcuIHRyYW5zYWN0aW9uIGRhdGUpLCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgZGlzcHV0ZV9maWVsZF9jcmVhdGVfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb25zdW1lckRpc3B1dGVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IENvbnN1bWVyRGlzcHV0ZUNhdGVnb3J5O1xuICAgIC8qKlxuICAgICAqIFRleHQgY29udGVudCBvZiBkaXNwdXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJEaXNwdXRlXG4gICAgICovXG4gICAgc3RhdGVtZW50OiBzdHJpbmc7XG59XG4vKipcbiAqIFR5cGUgb2YgZGF0YSBiZWluZyBkaXNwdXRlZCBieSB0aGUgY29uc3VtZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnN1bWVyRGlzcHV0ZUNhdGVnb3J5IHtcbiAgICBUcmFuc2FjdGlvbiA9ICdUUkFOU0FDVElPTicsXG4gICAgQmFsYW5jZSA9ICdCQUxBTkNFJyxcbiAgICBJZGVudGl0eSA9ICdJREVOVElUWScsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NvbnN1bWVyX3JlcG9ydC9wZGYvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgcmVhc29uIHlvdSBhcmUgZ2VuZXJhdGluZyBhIENvbnN1bWVyIFJlcG9ydCBmb3IgdGhpcyB1c2VyLiAgIGBBQ0NPVU5UX1JFVklFV19DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjb25zdW1lciBjcmVkaXQgdHJhbnNhY3Rpb24gZm9yIHRoZSByZXZpZXcgb3IgY29sbGVjdGlvbiBvZiBhbiBhY2NvdW50IHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuICBgQUNDT1VOVF9SRVZJRVdfTk9OX0NSRURJVGA6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBvZiB0aGUgaW5mb3JtYXRpb24gdG8gcmV2aWV3IGEgbm9uLWNyZWRpdCBhY2NvdW50IHByb3ZpZGVkIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIHB1cnBvc2VzIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb25zdW1lciBjb250aW51ZXMgdG8gbWVldCB0aGUgdGVybXMgb2YgdGhlIGFjY291bnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKSgyKS4gIGBFTVBMT1lNRU5UYDogRm9yIGVtcGxveW1lbnQgcHVycG9zZXMgcHVyc3VhbnQgdG8gRkNSQSA2MDQoYSkoMykoQiksIGluY2x1ZGluZyBoaXJpbmcsIHJldGVudGlvbiBhbmQgcHJvbW90aW9uIHB1cnBvc2VzLiAgYEVYVEVOU0lPTl9PRl9DUkVESVRgOiBJbiBjb25uZWN0aW9uIHdpdGggYSBjcmVkaXQgdHJhbnNhY3Rpb24gaW5pdGlhdGVkIGJ5IGFuZCBpbnZvbHZpbmcgdGhlIGNvbnN1bWVyIHB1cnN1YW50IHRvIEZDUkEgU2VjdGlvbiA2MDQoYSkoMykoQSkuICBgTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX1RFTkFOVF9TQ1JFRU5JTkdgOiBGb3IgYSBsZWdpdGltYXRlIGJ1c2luZXNzIG5lZWQgaW4gY29ubmVjdGlvbiB3aXRoIGEgYnVzaW5lc3MgdHJhbnNhY3Rpb24gaW5pdGlhdGVkIGJ5IHRoZSBjb25zdW1lciBwcmltYXJpbHkgZm9yIHBlcnNvbmFsLCBmYW1pbHksIG9yIGhvdXNlaG9sZCBwdXJwb3NlcyBpbiBjb25uZWN0aW9uIHdpdGggYSBwcm9wZXJ0eSByZW50YWwgYXNzZXNzbWVudCBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDMpKEYpKGkpLiAgYExFR0lUSU1BVEVfQlVTSU5FU1NfTkVFRF9PVEhFUmA6IEZvciBhIGxlZ2l0aW1hdGUgYnVzaW5lc3MgbmVlZCBpbiBjb25uZWN0aW9uIHdpdGggYSBidXNpbmVzcyB0cmFuc2FjdGlvbiBtYWRlIHByaW1hcmlseSBmb3IgcGVyc29uYWwsIGZhbWlseSwgb3IgaG91c2Vob2xkIGluaXRpYXRlZCBieSB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShGKShpKS4gIGBXUklUVEVOX0lOU1RSVUNUSU9OX1BSRVFVQUxJRklDQVRJT05gOiBJbiBhY2NvcmRhbmNlIHdpdGggdGhlIHdyaXR0ZW4gaW5zdHJ1Y3Rpb25zIG9mIHRoZSBjb25zdW1lciBwdXJzdWFudCB0byBGQ1JBIFNlY3Rpb24gNjA0KGEpKDIpLCB0byBldmFsdWF0ZSBhbiBhcHBsaWNhdGlvbuKAmXMgcHJvZmlsZSB0byBtYWtlIGFuIG9mZmVyIHRvIHRoZSBjb25zdW1lci4gIGBXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSYDogSW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB3cml0dGVuIGluc3RydWN0aW9ucyBvZiB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgyKSwgc3VjaCBhcyB3aGVuIGFuIGluZGl2aWR1YWwgYWdyZWVzIHRvIGFjdCBhcyBhIGd1YXJhbnRvciBvciBhc3N1bWVzIHBlcnNvbmFsIGxpYWJpbGl0eSBmb3IgYSBjb25zdW1lciwgYnVzaW5lc3MsIG9yIGNvbW1lcmNpYWwgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlIHtcbiAgICBBY2NvdW50UmV2aWV3Q3JlZGl0ID0gJ0FDQ09VTlRfUkVWSUVXX0NSRURJVCcsXG4gICAgQWNjb3VudFJldmlld05vbkNyZWRpdCA9ICdBQ0NPVU5UX1JFVklFV19OT05fQ1JFRElUJyxcbiAgICBFbXBsb3ltZW50ID0gJ0VNUExPWU1FTlQnLFxuICAgIEV4dGVuc2lvbk9mQ3JlZGl0ID0gJ0VYVEVOU0lPTl9PRl9DUkVESVQnLFxuICAgIExlZ2l0aW1hdGVCdXNpbmVzc05lZWRUZW5hbnRTY3JlZW5pbmcgPSAnTEVHSVRJTUFURV9CVVNJTkVTU19ORUVEX1RFTkFOVF9TQ1JFRU5JTkcnLFxuICAgIExlZ2l0aW1hdGVCdXNpbmVzc05lZWRPdGhlciA9ICdMRUdJVElNQVRFX0JVU0lORVNTX05FRURfT1RIRVInLFxuICAgIFdyaXR0ZW5JbnN0cnVjdGlvblByZXF1YWxpZmljYXRpb24gPSAnV1JJVFRFTl9JTlNUUlVDVElPTl9QUkVRVUFMSUZJQ0FUSU9OJyxcbiAgICBXcml0dGVuSW5zdHJ1Y3Rpb25PdGhlciA9ICdXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSJ1xufVxuXG4vKipcbiAqIFRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLCB0aGlzIGZpZWxkIG11c3QgYmUgcHJlc2VudCBvbiB0aGUgdXNlciB0b2tlbi4gSWYgdGhpcyBmaWVsZCBpcyBub3QgcHJvdmlkZWQgZHVyaW5nIHVzZXIgdG9rZW4gY3JlYXRpb24sIHlvdSBjYW4gYWRkIGl0IHRvIHRoZSB1c2VyIGxhdGVyIGJ5IGNhbGxpbmcgYC91c2VyL3VwZGF0ZWAuIE9uY2UgdGhlIGZpZWxkIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSB1c2VyLCB5b3Ugd2lsbCBiZSBhYmxlIHRvIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhIG5vbi1lbXB0eSBgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2VgICh3aGljaCB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0KSwgb3IgY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBmb3IgdGhhdCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgZmlyc3RfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eVxuICAgICAqL1xuICAgIGxhc3RfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTc0NTIxMzBcXFwiLiBQaG9uZSBudW1iZXJzIHByb3ZpZGVkIGluIG90aGVyIGZvcm1hdHMgd2lsbCBiZSBwYXJzZWQgb24gYSBiZXN0LWVmZm9ydCBiYXNpcy4gUGhvbmUgbnVtYmVyIGlucHV0IGlzIHZhbGlkYXRlZCBhZ2FpbnN0IHZhbGlkIG51bWJlciByYW5nZXM7IG51bWJlciBzdHJpbmdzIHRoYXQgZG8gbm90IG1hdGNoIGEgcmVhbC13b3JsZCBwaG9uZSBudW1iZXJpbmcgc2NoZW1lIG1heSBjYXVzZSB0aGUgcmVxdWVzdCB0byBmYWlsLCBldmVuIGluIHRoZSBTYW5kYm94IHRlc3QgZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWxzXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgZW1haWxzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDQgZGlnaXRzIG9mIHRoZSB1c2VyXFwncyBzb2NpYWwgc2VjdXJpdHkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgc3NuX2xhc3RfND86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG8gYmUgcHJvdmlkZWQgaW4gdGhlIGZvcm1hdCBcXFwieXl5eS1tbS1kZFxcXCIuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgZm9yIGFsbCBQbGFpZCBDaGVjayBjdXN0b21lcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHlcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIENvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5XG4gICAgICovXG4gICAgcHJpbWFyeV9hZGRyZXNzOiBBZGRyZXNzRGF0YTtcbn1cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDb3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb3VudGVycGFydHkge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICB0eXBlOiBDb3VudGVycGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjb3VudGVycGFydHkgaXMgaW52b2x2ZWQgaW4gdGhlIHRyYW5zYWN0aW9uLiAgYFZFUllfSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5OCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYEhJR0hgOiBXZSByZWNvZ25pemUgdGhpcyBjb3VudGVycGFydHkgYW5kIHdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IGl0IGlzIGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNvdW50ZXJwYXJ0eSB3YXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbiwgYnV0IHNvbWUgZGV0YWlscyBtYXkgZGlmZmVyIGZyb20gb3VyIHJlY29yZHMuIGBMT1dgOiBXZSBkaWRu4oCZdCBmaW5kIGEgbWF0Y2hpbmcgY291bnRlcnBhcnR5IGluIG91ciByZWNvcmRzLCBzbyB3ZSBhcmUgcmV0dXJuaW5nIGEgY2xlYW5zZWQgbmFtZSBwYXJzZWQgb3V0IG9mIHRoZSByZXF1ZXN0IGRlc2NyaXB0aW9uLiBgVU5LTk9XTmA6IFdlIGRvbuKAmXQga25vdyB0aGUgY29uZmlkZW5jZSBsZXZlbCBmb3IgdGhpcyBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgY29uZmlkZW5jZV9sZXZlbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eSBpbiBFLiAxNjQgZm9ybWF0LiBJZiB0aGVyZSBpcyBhIGxvY2F0aW9uIG1hdGNoIChpLmUuIGEgc3RyZWV0IGFkZHJlc3MgaXMgcmV0dXJuZWQgaW4gdGhlIGxvY2F0aW9uIG9iamVjdCksIHRoZSBwaG9uZSBudW1iZXIgd2lsbCBiZSBsb2NhdGlvbiBzcGVjaWZpYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluc2lnaHRzIGFyb3VuZCBhIHVzZXJcXCdzIGNvdW50ZXJwYXJ0aWVzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ291bnRlcnBhcnR5SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIEluc2lnaHRzIHJlbGF0ZWQgdG8gYSB1c2Vy4oCZcyB0cmFuc2FjdGlvbnMgd2l0aCBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENvdW50ZXJwYXJ0eUluc2lnaHRzXG4gICAgICovXG4gICAgZmluYW5jaWFsX2luc3RpdHV0aW9uX2luc2lnaHRzPzogQXJyYXk8RmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0cz47XG4gICAgLyoqXG4gICAgICogSW5zaWdodHMgYWJvdXQgYSB1c2Vy4oCZcyB0b3AgbWVyY2hhbnRzLCByYW5rZWQgYnkgc3BlbmQuXG4gICAgICogQHR5cGUge0FycmF5PE1lcmNoYW50SW5zaWdodHM+fVxuICAgICAqIEBtZW1iZXJvZiBDb3VudGVycGFydHlJbnNpZ2h0c1xuICAgICAqL1xuICAgIG1lcmNoYW50X2luc2lnaHRzPzogQXJyYXk8TWVyY2hhbnRJbnNpZ2h0cz47XG59XG4vKipcbiAqIFRoZSBjb3VudGVycGFydHkgdHlwZS4gIGBtZXJjaGFudGA6IGEgcHJvdmlkZXIgb2YgZ29vZHMgb3Igc2VydmljZXMgZm9yIHB1cmNoYXNlIGBmaW5hbmNpYWxfaW5zdGl0dXRpb25gOiBhIGZpbmFuY2lhbCBlbnRpdHkgKGJhbmssIGNyZWRpdCB1bmlvbiwgQk5QTCwgZmludGVjaCkgYHBheW1lbnRfYXBwYDogYSB0cmFuc2ZlciBvciBQMlAgYXBwIChlLmcuIFplbGxlKSBgbWFya2V0cGxhY2VgOiBhIG1hcmtldHBsYWNlIChlLmcgRG9vckRhc2gsIEdvb2dsZSBQbGF5IFN0b3JlKSBgcGF5bWVudF90ZXJtaW5hbGA6IGEgcG9pbnQtb2Ytc2FsZSBwYXltZW50IHRlcm1pbmFsIChlLmcgU3F1YXJlLCBUb2FzdCkgYGluY29tZV9zb3VyY2VgOiB0aGUgcGF5ZXIgaW4gYW4gaW5jb21lIHRyYW5zYWN0aW9uIChlLmcuLCBhbiBlbXBsb3llciwgY2xpZW50LCBvciBnb3Zlcm5tZW50IGFnZW5jeSlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvdW50ZXJwYXJ0eVR5cGUge1xuICAgIE1lcmNoYW50ID0gJ21lcmNoYW50JyxcbiAgICBGaW5hbmNpYWxJbnN0aXR1dGlvbiA9ICdmaW5hbmNpYWxfaW5zdGl0dXRpb24nLFxuICAgIFBheW1lbnRBcHAgPSAncGF5bWVudF9hcHAnLFxuICAgIE1hcmtldHBsYWNlID0gJ21hcmtldHBsYWNlJyxcbiAgICBQYXltZW50VGVybWluYWwgPSAncGF5bWVudF90ZXJtaW5hbCcsXG4gICAgSW5jb21lU291cmNlID0gJ2luY29tZV9zb3VyY2UnXG59XG5cbi8qKlxuICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENvdW50cnlDb2RlIHtcbiAgICBVcyA9ICdVUycsXG4gICAgR2IgPSAnR0InLFxuICAgIEVzID0gJ0VTJyxcbiAgICBObCA9ICdOTCcsXG4gICAgRnIgPSAnRlInLFxuICAgIEllID0gJ0lFJyxcbiAgICBDYSA9ICdDQScsXG4gICAgRGUgPSAnREUnLFxuICAgIEl0ID0gJ0lUJyxcbiAgICBQbCA9ICdQTCcsXG4gICAgRGsgPSAnREsnLFxuICAgIE5vID0gJ05PJyxcbiAgICBTZSA9ICdTRScsXG4gICAgRWUgPSAnRUUnLFxuICAgIEx0ID0gJ0xUJyxcbiAgICBMdiA9ICdMVicsXG4gICAgUHQgPSAnUFQnLFxuICAgIEJlID0gJ0JFJ1xufVxuXG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIFBsYWlkIENoZWNrIEluY29tZSBJbnNpZ2h0cyBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgcmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGN1c3RvbWVyIGZvciB0aGUgcmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhQmFua0luY29tZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFCYW5rSW5jb21lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3N1bW1hcnk/OiBDcmFCYW5rSW5jb21lU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBJZiBkYXRhIGZyb20gdGhlIHJlcG9ydCB3YXMgdW5hYmxlIHRvIGJlIHJldHJpZXZlZCwgdGhlIHdhcm5pbmdzIG9iamVjdCB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9yIHRoYXQgY2F1c2VkIHRoZSBkYXRhIHRvIGJlIGluY29tcGxldGUuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVxuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgSXRlbVxcJ3MgYmFuayBhY2NvdW50cyB0aGF0IGhhdmUgdGhlIHNlbGVjdGVkIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuIFRoaXMgdmFsdWUgd2lsbCBub3QgY2hhbmdlIHVubGVzcyBQbGFpZCBjYW5cXCd0IHJlY29uY2lsZSB0aGUgYWNjb3VudCB3aXRoIHRoZSBkYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFRoaXMgbWF5IG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgbmFtZSBvZiB0aGUgYWNjb3VudCBjaGFuZ2VzLiBJZiB0aGlzIGhhcHBlbnMgYSBuZXcgYGFjY291bnRfaWRgIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjY291bnQuICBJZiBhbiBhY2NvdW50IHdpdGggYSBzcGVjaWZpYyBgYWNjb3VudF9pZGAgZGlzYXBwZWFycyBpbnN0ZWFkIG9mIGNoYW5naW5nLCB0aGUgYWNjb3VudCBpcyBsaWtlbHkgY2xvc2VkLiBDbG9zZWQgYWNjb3VudHMgYXJlIG5vdCByZXR1cm5lZCBieSB0aGUgUGxhaWQgQVBJLiAgTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgYWNjb3VudF9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgbWV0YWRhdGE6IENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IERlcG9zaXRvcnlBY2NvdW50U3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBJZGVudGl0eSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbCwgc28gZmllbGQgbWF5IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgZXh0cmFjdGVkIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQWNjb3VudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgZWFybGllc3QgZXh0cmFjdGVkIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUFjY291bnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG1vc3QgcmVjZW50IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVBY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYm9udXMgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIHJlcHJlc2VudHMsIGlmIGl0IGlzIGEgYm9udXMuIGBCT05VU19JTkNMVURFRGA6IEJvbnVzIGlzIGluY2x1ZGVkIGluIHRoaXMgdHJhbnNhY3Rpb24gYWxvbmcgd2l0aCB0aGUgbm9ybWFsIHBheSBgQk9OVVNfT05MWWA6IFRoaXMgdHJhbnNhY3Rpb24gaXMgYSBzdGFuZGFsb25lIGJvbnVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFCYW5rSW5jb21lQm9udXNUeXBlIHtcbiAgICBCb251c0luY2x1ZGVkID0gJ0JPTlVTX0lOQ0xVREVEJyxcbiAgICBCb251c09ubHkgPSAnQk9OVVNfT05MWScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ2F1c2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFdlIHVzZSBzdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGNvZGVzIGZvciBzdWNjZXNzIGFuZCBmYWlsdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCBvdXIgZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgYnkgYGVycm9yX3R5cGVgLiBJbiBnZW5lcmFsLCAyMDAgSFRUUCBjb2RlcyBjb3JyZXNwb25kIHRvIHN1Y2Nlc3MsIDQwWCBjb2RlcyBhcmUgZm9yIGRldmVsb3Blci0gb3IgdXNlci1yZWxhdGVkIGZhaWx1cmVzLCBhbmQgNTBYIGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBpc3N1ZXMuIEVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBudWxsIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSByZXN1bHQgb2YgdGhlIGJhbmsgaW5jb21lIHJlcG9ydCBnZW5lcmF0aW9uICBgU1VDQ0VTU2A6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgd2FzIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQgYW5kIGNhbiBiZSByZXRyaWV2ZWQgdmlhIGAvY3JhL2JhbmtfaW5jb21lL2dldGAuICBgRkFJTFVSRWA6IFRoZSBiYW5rIGluY29tZSByZXBvcnQgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQmFua0luY29tZUNvbXBsZXRlUmVzdWx0IHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgYmFuayBpbmNvbWUgcmVwb3J0IGhhcyBmaW5pc2hlZCBnZW5lcmF0aW5nIG9yIGZhaWxlZCB0byBnZW5lcmF0ZSwgdHJpZ2dlcmVkIGJ5IGNhbGxpbmcgYC9jcmEvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBDUkFfSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQkFOS19JTkNPTUVfQ09NUExFVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHJlc3VsdD86IENyYUJhbmtJbmNvbWVDb21wbGV0ZVJlc3VsdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2JhbmtfaW5jb21lL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBVUkwgdG8gd2hpY2ggd2ViaG9va3Mgd2lsbCBiZSBzZW50IFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2V9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2U/OiBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZTtcbn1cbi8qKlxuICogQ3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9iYW5rX2luY29tZS9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUVtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUVtcGxveWVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIGJhbmsgaW5jb21lIHJlcG9ydCBoYXMgZmFpbGVkIHRvIGdlbmVyYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOQ09NRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEVSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvYmFua19pbmNvbWUvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IEFycmF5PENyYUJhbmtJbmNvbWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgY2FuIGNvbnRhaW4gbXVsdGlwbGUgYW1vdW50cywgd2l0aCBlYWNoIGFtb3VudCBkZW5vbWluYXRlZCBpbiBvbmUgdW5pcXVlIGN1cnJlbmN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgcGVyaW9kIGNvdmVyZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLCB1bmxlc3MgdGhlIG1vbnRoIGJlaW5nIGNvdmVyZWQgaXMgYSBwYXJ0aWFsIG1vbnRoIGJlY2F1c2UgaXQgaXMgdGhlIGZpcnN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgYmVnaW4gd2l0aCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBwZXJpb2QgaW5jbHVkZWQgaW4gdGhpcyBtb250aGx5IHN1bW1hcnkuIFRoaXMgZGF0ZSB3aWxsIGJlIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgbGFzdCBtb250aCBpbmNsdWRlZCBpbiB0aGUgc3VtbWFyeSBhbmQgdGhlIGRhdGUgcmFuZ2UgYmVpbmcgcmVxdWVzdGVkIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogQXJyYXk8Q3JhQmFua0luY29tZVRyYW5zYWN0aW9uPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgYW5kIG1ldGFkYXRhIGZvciBhbiBlbmQgdXNlclxcJ3MgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQmFua0luY29tZUl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYW5rSW5jb21lSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIGJhbmsgaW5jb21lIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9hY2NvdW50czogQXJyYXk8Q3JhQmFua0luY29tZUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmNvbWUgc291cmNlcyBmb3IgdGhpcyBJdGVtLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSBpcyBhIHNpbmdsZSBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9zb3VyY2VzOiBBcnJheTxDcmFCYW5rSW5jb21lU291cmNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBpbmNvbWUgc291cmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgd2l0aCB3aGljaCB0aGlzIGluY29tZSBzb3VyY2UgaXMgYXNzb2NpYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeT86IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBNaW5pbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNYXhpbXVtIG9mIGFsbCBkYXRlcyB3aXRoaW4gdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2VzIGluIHRoZSB1c2Vy4oCZcyBiYW5rIGFjY291bnQgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVQYXlGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgdGhlIHNwZWNpZmljIGluY29tZSBzb3VyY2UgZm9yIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjbGllbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgdHJhbnNhY3Rpb25zIGZvciB0aGUgaW5jb21lIHNvdXJjZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIGRhdGUgb2YgdGhlIGVuZCB1c2Vy4oCZcyBuZXh0IHBheWNoZWNrIGZvciB0aGUgaW5jb21lIHNvdXJjZS4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBuZXh0X3BheW1lbnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGF2ZXJhZ2UgZ3Jvc3MgbW9udGhseSBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfZ3Jvc3NfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hdmVyYWdlX21vbnRobHlfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgbW9udGhseSBuZXQgaW5jb21lIGFtb3VudCBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByZWRpY3Rpb24gaW50ZXJ2YWwocykgZm9yIHRoZSBmb3JlY2FzdGVkIGF2ZXJhZ2UgbW9udGhseSBpbmNvbWUuXG4gICAgICogQHR5cGUge0FycmF5PENyYVByZWRpY3Rpb25JbnRlcnZhbD59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBmb3JlY2FzdGVkX2F2ZXJhZ2VfbW9udGhseV9pbmNvbWVfcHJlZGljdGlvbl9pbnRlcnZhbHM6IEFycmF5PENyYVByZWRpY3Rpb25JbnRlcnZhbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogQ3JhQmFua0luY29tZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogU3VtbWFyeSBmb3IgaW5jb21lIGFjcm9zcyBhbGwgaW5jb21lIHNvdXJjZXMgYW5kIGl0ZW1zIChtYXggaGlzdG9yeSBvZiA3MzAgZGF5cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQmFua0luY29tZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgdG90YWxfYW1vdW50cz86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgd2l0aGluIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gYSB1c2VyXFwncyBhY2NvdW50LiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBpbiB3aGljaCBhbGwgaW5jb21lIHNvdXJjZXMgaWRlbnRpZmllZCBieSBQbGFpZCBhcHBlYXIgaW4gdGhlIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgc291cmNlcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIGNhdGVnb3JpZXMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX2NhdGVnb3JpZXNfY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSB0cmFuc2FjdGlvbnMgcGVyIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaW5jb21lX3RyYW5zYWN0aW9uc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBbiBlc3RpbWF0ZSBvZiB0aGUgYXZlcmFnZSBncm9zcyBtb250aGx5IGluY29tZSBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBuZXQgYW1vdW50IGFuZCBpbmNvbWUgY2F0ZWdvcnkgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYXZlcmFnZV9tb250aGx5X2dyb3NzX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogVGhlIGF2ZXJhZ2UgbW9udGhseSBpbmNvbWUgYW1vdW50IGVzdGltYXRlZCBiYXNlZCBvbiB0aGUgaGlzdG9yaWNhbCBkYXRhIGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2F2ZXJhZ2VfbW9udGhseV9pbmNvbWU/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmVkaWN0ZWQgYXZlcmFnZSBtb250aGx5IGluY29tZSBhbW91bnQgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYXZlcmFnZV9tb250aGx5X2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogQW4gZXN0aW1hdGUgb2YgdGhlIGFubnVhbCBncm9zcyBpbmNvbWUgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgbmV0IGFtb3VudCBhbmQgaW5jb21lIGNhdGVnb3J5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX2FubnVhbF9ncm9zc19pbmNvbWU/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbm51YWwgaW5jb21lIGFtb3VudCBlc3RpbWF0ZWQgYmFzZWQgb24gdGhlIGhpc3RvcmljYWwgZGF0YSBmb3IgdGhlIGluY29tZSBzb3VyY2UocykuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9hbm51YWxfaW5jb21lPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGF2ZXJhZ2UgYW5udWFsIGluY29tZSBhbW91bnQgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGZvcmVjYXN0ZWRfYW5udWFsX2luY29tZT86IEFycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zdW1tYXJ5PzogQXJyYXk8Q3JhQmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pjtcbn1cbi8qKlxuICogVGhlIHRyYW5zYWN0aW9ucyBkYXRhIGZvciB0aGUgZW5kIHVzZXJcXCdzIGluY29tZSBzb3VyY2UocykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uXFwncyBjdXJyZW5jeSBhcyBzdGF0ZWQgaW4gYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYC4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgb3V0IG9mIHRoZSBhY2NvdW50OyBuZWdhdGl2ZSB2YWx1ZXMgd2hlbiBtb25leSBtb3ZlcyBpbi4gRm9yIGV4YW1wbGUsIGNyZWRpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnQsIGRpcmVjdCBkZXBvc2l0cywgYW5kIHJlZnVuZHMgYXJlIG5lZ2F0aXZlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUJhbmtJbmNvbWVCb251c1R5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGJvbnVzX3R5cGU/OiBDcmFCYW5rSW5jb21lQm9udXNUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBkYXRhIHRoYXQgd2FzIHVuYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYW5rSW5jb21lV2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUJhbmtJbmNvbWVXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVdhcm5pbmdUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVdhcm5pbmdDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZT86IENyYUJhbmtJbmNvbWVXYXJuaW5nQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZUNhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYW5rSW5jb21lV2FybmluZ1xuICAgICAqL1xuICAgIGNhdXNlPzogQ3JhQmFua0luY29tZUNhdXNlO1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcuIGBJREVOVElUWV9VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IGlkZW50aXR5IGZvciB0aGUgSXRlbSBgVFJBTlNBQ1RJT05TX1VOQVZBSUxBQkxFYDogVW5hYmxlIHRvIGV4dHJhY3QgdHJhbnNhY3Rpb25zIGZvciB0aGUgSXRlbSBgUkVQT1JUX0RFTEVURURgOiBSZXBvcnQgZGVsZXRlZCBkdWUgdG8gY3VzdG9tZXIgb3IgY29uc3VtZXIgcmVxdWVzdCBgREFUQV9VTkFWQUlMQUJMRWA6IE5vIHJlbGV2YW50IGRhdGEgd2FzIGZvdW5kIGZvciB0aGUgSXRlbVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhQmFua0luY29tZVdhcm5pbmdDb2RlIHtcbiAgICBJZGVudGl0eVVuYXZhaWxhYmxlID0gJ0lERU5USVRZX1VOQVZBSUxBQkxFJyxcbiAgICBUcmFuc2FjdGlvbnNVbmF2YWlsYWJsZSA9ICdUUkFOU0FDVElPTlNfVU5BVkFJTEFCTEUnLFxuICAgIFJlcG9ydERlbGV0ZWQgPSAnUkVQT1JUX0RFTEVURUQnLFxuICAgIERhdGFVbmF2YWlsYWJsZSA9ICdEQVRBX1VOQVZBSUxBQkxFJ1xufVxuXG4vKipcbiAqIENyYUJhc2VSZXBvcnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBjcmEvYmFzZV9yZXBvcnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFCYXNlUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFCYXNlUmVwb3J0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFCYXNlUmVwb3J0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIGRhdGEgZm9yIHRoZSBDUkEgQ2FzaGZsb3cgSW5zaWdodHMgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTmV0d29yayBBdHRyaWJ1dGVzIHJlcG9ydCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2FzaGZsb3dJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIE5ldHdvcmsgQXR0cmlidXRlcyBSZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRDaGVja1Njb3JlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgcGxhaWRfY2hlY2tfc2NvcmU/OiBQbGFpZENoZWNrU2NvcmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbWFwIG9mIGNhc2hmbG93IGF0dHJpYnV0ZXMsIHdoZXJlIHRoZSBrZXkgaXMgYSBzdHJpbmcsIGFuZCB0aGUgdmFsdWUgaXMgYSBmbG9hdCwgaW50LCBvciBib29sZWFuLlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG1lbWJlcm9mIENyYUNhc2hmbG93SW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBhdHRyaWJ1dGVzPzogb2JqZWN0O1xufVxuLyoqXG4gKiBCYXNlUmVwb3J0R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2Jhc2VfcmVwb3J0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaXRlbSBJRHMgdG8gaW5jbHVkZSBpbiB0aGUgQmFzZSBSZXBvcnQuIElmIG5vdCBwcm92aWRlZCwgYWxsIGl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB3aWxsIGJlIGluY2x1ZGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvYmFzZV9yZXBvcnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFzZVJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBvcnQ6IEJhc2VSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIEJhc2UgUmVwb3J0IGdlbmVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgYnV0IGlkZW50aXR5IGluZm9ybWF0aW9uIGNhbm5vdCBiZSByZXR1cm5lZCwgdGhpcyBhcnJheSB3aWxsIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIGlkZW50aXR5IGluZm9ybWF0aW9uIHRvIGJlIG1pc3NpbmdcbiAgICAgKiBAdHlwZSB7QXJyYXk8QmFzZVJlcG9ydFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxCYXNlUmVwb3J0V2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0byBnZW5lcmF0ZSBDYXNoZmxvdyBJbnNpZ2h0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIFBsYWlkIENoZWNrIHNjb3JlIHRvIHJldHVyblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldE9wdGlvbnNcbiAgICAgKi9cbiAgICBwbGFpZF9jaGVja19zY29yZV92ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2FzaGZsb3dBdHRyaWJ1dGVzVmVyc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZXNfdmVyc2lvbj86IENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY2FzaGZsb3dfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY2FzaGZsb3dfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNhc2hmbG93SW5zaWdodHNSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBDcmFDYXNoZmxvd0luc2lnaHRzUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gZ2VuZXJhdGUgYSBCYXNlIFJlcG9ydFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydENyZWF0ZUJhc2VSZXBvcnRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVCYXNlUmVwb3J0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xpZW50LWdlbmVyYXRlZCBpZGVudGlmaWVyLCB3aGljaCBjYW4gYmUgdXNlZCBieSBsZW5kZXJzIHRvIHRyYWNrIGxvYW4gYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnNcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBVUkwgdG8gd2hpY2ggd2ViaG9va3Mgd2lsbCBiZSBzZW50IFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0IGZvciB0aGUgcmVwb3J0LiBEZWZhdWx0IHZhbHVlIGlzIDM2NTsgbWF4aW11bSBpcyA3MzE7IG1pbmltdW0gaXMgMTgwLiBJZiBhIHZhbHVlIGxvd2VyIHRoYW4gMTgwIGlzIHByb3ZpZGVkLCBhIG1pbmltdW0gb2YgMTgwIGRheXMgb2YgaGlzdG9yeSB3aWxsIGJlIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIG51bWJlciBvZiBkYXlzIG9mIGRhdGEgcmVxdWlyZWQgZm9yIHRoZSByZXBvcnQgdG8gYmUgc3VjY2Vzc2Z1bGx5IGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVpcmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCB3aWxsIGJlIGVhZ2VybHkgZ2VuZXJhdGVkIHdoZW4gY3JlYXRpbmcgdGhlIHJlcG9ydC4gVGhlc2UgcHJvZHVjdHMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZSBiZWZvcmUgYSBzdWNjZXNzIHdlYmhvb2sgaXMgc2VudC4gVXNlIHRoaXMgb3B0aW9uIHRvIG1pbmltaXplIHJlc3BvbnNlIGxhdGVuY3kgZm9yIHByb2R1Y3QgYC9nZXRgIGVuZHBvaW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0Q3JlYXRlQmFzZVJlcG9ydE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhc2VfcmVwb3J0PzogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVCYXNlUmVwb3J0T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNhc2hmbG93X2luc2lnaHRzPzogQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGFydG5lcl9pbnNpZ2h0cz86IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZTogQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIENoZWNrIFJlcG9ydCBoYXMgZmFpbGVkIHRvIGdlbmVyYXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0RmFpbGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQ0hFQ0tfUkVQT1JUX0ZBSUxFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL2NoZWNrX3JlcG9ydC9pbmNvbWVfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L2luY29tZV9pbnNpZ2h0cy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFJbmNvbWVJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQ3JhSW5jb21lSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvbmV0d29ya19hdHRyaWJ1dGVzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3VzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9jaGVja19yZXBvcnQvbmV0d29ya19hdHRyaWJ1dGVzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTmV0d29ya0luc2lnaHRzUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0OiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvY2hlY2tfcmVwb3J0L3BkZi9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdGVkIFVzZXIgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVzZSB0aGlzIGZpZWxkIHRvIGluY2x1ZGUgb3RoZXIgcmVwb3J0cyBpbiB0aGUgUERGLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFQREZBZGRPbnM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRfb25zPzogQXJyYXk8Q3JhUERGQWRkT25zPjtcbn1cbi8qKlxuICogRGVmaW5lcyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gZ2VuZXJhdGUgUGFydG5lciBJbnNpZ2h0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzcGVjaWZpYyBQcmlzbSBEYXRhIHByb2R1Y3RzIHRvIHJldHVybi4gSWYgbm9uZSBhcmUgcGFzc2VkIGluLCB0aGVuIGFsbCBwcm9kdWN0cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcmlzbVByb2R1Y3Q+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldE9wdGlvbnNcbiAgICAgKi9cbiAgICBwcmlzbV9wcm9kdWN0cz86IEFycmF5PFByaXNtUHJvZHVjdD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtVmVyc2lvbnN9XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0T3B0aW9uc1xuICAgICAqL1xuICAgIHByaXNtX3ZlcnNpb25zPzogUHJpc21WZXJzaW9ucyB8IG51bGw7XG59XG4vKipcbiAqIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhUGFydG5lckluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQ3JhUGFydG5lckluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBDaGVjayBSZXBvcnQgYXJlIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGZpcmVkLCB0aGUgcmVwb3J0IHdpbGwgYmUgYXZhaWxhYmxlIHRvIHJldHJpZXZlIGZvciAyNCBob3Vycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBDSEVDS19SRVBPUlRfUkVBRFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhQ2hlY2tSZXBvcnRSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGl0ZW1faWRzYCB0aGF0IGlzIGluY2x1ZGVkIGluIHRoZSBDaGVjayBSZXBvcnQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyYUNoZWNrUmVwb3J0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFDaGVja1JlcG9ydFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBDaGVjayBJbmNvbWUgSW5zaWdodHMgUmVwb3J0IGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhSW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFJbmNvbWVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ2hlY2sgSW5jb21lIEluc2lnaHRzIFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBDaGVjayBJbmNvbWUgSW5zaWdodHMgUmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBnZW5lcmF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgcmVxdWVzdGVkIGJ5IHRoZSBjdXN0b21lciBmb3IgdGhlIENoZWNrIEluY29tZSBJbnNpZ2h0cyBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyYUJhbmtJbmNvbWVJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhSW5jb21lSW5zaWdodHNcbiAgICAgKi9cbiAgICBpdGVtcz86IEFycmF5PENyYUJhbmtJbmNvbWVJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhQmFua0luY29tZVN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIENyYUluY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc3VtbWFyeT86IENyYUJhbmtJbmNvbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIElmIGRhdGEgZnJvbSB0aGUgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgb2JqZWN0IHdpbGwgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgdGhlIGRhdGEgdG8gYmUgaW5jb21wbGV0ZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHdhcm5pbmdzPzogQXJyYXk8Q3JhQmFua0luY29tZVdhcm5pbmc+O1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGFwcGxpY2F0aW9uIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5BcHBsaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5BcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gZm9yIHRoZSB1c2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvYW4gYXBwbGljYXRpb24uICBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgYXBwbGljYXRpb25faWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5BcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuQXBwbGljYXRpb25cbiAgICAgKi9cbiAgICB0eXBlOiBDcmFMb2FuVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbkFwcGxpY2F0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5BcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBDcmFMb2FuQXBwbGljYXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGUgdXNlciBhcHBsaWVkIGZvciB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgYXBwbGljYXRpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBsb2FuIGFwcGxpY2F0aW9uXFwncyBkZWNpc2lvbiB3YXMgbWFkZS4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkFwcGxpY2F0aW9uXG4gICAgICovXG4gICAgZGVjaXNpb25fZGF0ZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRlY2lzaW9uIG9mIHRoZSBsb2FuIGFwcGxpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JhTG9hbkFwcGxpY2F0aW9uRGVjaXNpb24ge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBEZWNsaW5lZCA9ICdERUNMSU5FRCcsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXR1cyBhbmQgZGF0ZSBpbmZvcm1hdGlvbiBvZiB0aGUgbG9hbiB3aGVuIHVucmVnaXN0ZXJpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5DbG9zZWRTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuQ2xvc2VkU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbkNsb3NlZFN0YXR1c1xuICAgICAqL1xuICAgIHN0YXR1czogQ3JhTG9hblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgZWZmZWN0aXZlIGRhdGUgZm9yIHRoZSBzdGF0dXMgb2YgdGhlIGxvYW4uIFRoZSBkYXRlIHNob3VsZCBiZSBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5DbG9zZWRTdGF0dXNcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0dXMgYW5kIGRhdGUgaW5mb3JtYXRpb24gb2YgdGhlIGxvYW4gd2hlbiByZWdpc3RlcmluZy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbk9wZW5lZFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5PcGVuZWRTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuT3BlbmVkU3RhdHVzXG4gICAgICovXG4gICAgc3RhdHVzOiBDcmFMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZmZlY3RpdmUgZGF0ZSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbk9wZW5lZFN0YXR1c1xuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHBheW1lbnQgaW5mb3JtYXRpb24gZm9yIGEgbG9hbiBwYXltZW50IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblBheW1lbnRIaXN0b3J5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblBheW1lbnRIaXN0b3J5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5kZXggdG8gaWRlbnRpZnkgdGhlIGxvYW5cXCdzIHBheW1lbnQgcGVyaW9kLCBzdGFydGluZyBmcm9tIDEuIEZvciBleGFtcGxlOiAgIDEgbWVhbnMgdGhlIHBlcmlvZCBiZXR3ZWVuIHRoZSBsb2FuXFwncyBvcGVuaW5nIGRhdGUgYW5kIHRoZSAxc3QgcGF5bWVudCBkdWUgZGF0ZS4gICAyIG1lYW5zIHRoZSBwZXJpb2QgYmV0d2VlbiB0aGUgbG9hblxcJ3MgMXN0IHBheW1lbnQgZHVlIGRhdGUgYW5kIDJuZCBwYXltZW50IGR1ZSBkYXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5QYXltZW50SGlzdG9yeVxuICAgICAqL1xuICAgIHBlcmlvZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXltZW50IGR1ZSBkYXRlIG9yIGVuZCBkYXRlIG9mIHRoZSBwYXltZW50IHBlcmlvZC4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblBheW1lbnRIaXN0b3J5XG4gICAgICovXG4gICAgZHVlX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgdGhlIGxvYW4gd2FzIGRlbGlucXVlbnQgYXQgdGhlIGVuZCBvZiB0aGUgcGF5IHBlcmlvZC4gSWYgc3BlY2lmaWVkLCBzaG91bGQgYmUgZ3JlYXRlciBvZiBlcXVhbCB0byAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5QYXltZW50SGlzdG9yeVxuICAgICAqL1xuICAgIGRheXNfcGFzdF9kdWU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHBhc3QgZHVlIG9yIHRoZSBjaGFyZ2Utb2ZmIGFtb3VudCBvZiB0aGUgbG9hbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXltZW50IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUGF5bWVudEhpc3RvcnlcbiAgICAgKi9cbiAgICBhbW91bnRfcGFzdF9kdWU/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbGFuY2UgcmVtYWluaW5nIG9uIHRoZSBsb2FuIGF0IHRoZSBlbmQgb2YgdGhlIHBheW1lbnQgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5QYXltZW50SGlzdG9yeVxuICAgICAqL1xuICAgIGJhbGFuY2VfcmVtYWluaW5nPzogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IG9mIGEgbG9hblxcJ3MgcGF5bWVudCBzY2hlZHVsZS4gYEJJV0VFS0xZYCByZXByZXNlbnRzIG9uZSBwYXltZW50IGV2ZXJ5IHR3byB3ZWVrcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYUxvYW5QYXltZW50U2NoZWR1bGUge1xuICAgIERhaWx5ID0gJ0RBSUxZJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBRdWFydGVybHkgPSAnUVVBUlRFUkxZJyxcbiAgICBBbm51YWxseSA9ICdBTk5VQUxMWScsXG4gICAgT3RoZXIgPSAnT1RIRVInXG59XG5cbi8qKlxuICogQ29udGFpbnMgbG9hbiBkYXRhIHRvIHJlZ2lzdGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuUmVnaXN0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuUmVnaXN0ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGZvciB0aGUgdXNlciBhc3NvY2lhdGVkIHdpdGggdGhlIGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuLiAgUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGxvYW5faWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIGxvYW5faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hblR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5SZWdpc3RlclxuICAgICAqL1xuICAgIHR5cGU6IENyYUxvYW5UeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFMb2FuUGF5bWVudFNjaGVkdWxlfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJcbiAgICAgKi9cbiAgICBwYXltZW50X3NjaGVkdWxlOiBDcmFMb2FuUGF5bWVudFNjaGVkdWxlO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSBsb2FuIGFjY291bnQgd2FzIG9wZW5lZC4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgb3BlbmVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbk9wZW5lZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgb3BlbmVkX3dpdGhfc3RhdHVzOiBDcmFMb2FuT3BlbmVkU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgdGhlIGFwcHJvdmVkIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblJlZ2lzdGVyXG4gICAgICovXG4gICAgbG9hbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbj86IENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uO1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGFwcGxpY2F0aW9uIGRhdGEgdG8gcmVnaXN0ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5SZWdpc3RlckFwcGxpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblJlZ2lzdGVyQXBwbGljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBsb2FuIGFwcGxpY2F0aW9uLiAgUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGFwcGxpY2F0aW9uX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB1c2VyIGFwcGxpZWQgZm9yIHRoZSBsb2FuLiBUaGUgZGF0ZSBzaG91bGQgYmUgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuUmVnaXN0ZXJBcHBsaWNhdGlvblxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2RhdGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGxvYW4uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFMb2FuU3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgRGVjbGluZWQgPSAnREVDTElORUQnLFxuICAgIEJvb2tlZCA9ICdCT09LRUQnLFxuICAgIEN1cnJlbnQgPSAnQ1VSUkVOVCcsXG4gICAgRGVsaW5xdWVudCA9ICdERUxJTlFVRU5UJyxcbiAgICBEZWZhdWx0ID0gJ0RFRkFVTFQnLFxuICAgIENoYXJnZWRPZmYgPSAnQ0hBUkdFRF9PRkYnLFxuICAgIFRyYW5zZmVycmVkID0gJ1RSQU5TRkVSUkVEJyxcbiAgICBQYWlkT2ZmID0gJ1BBSURfT0ZGJyxcbiAgICBPdGhlciA9ICdPVEhFUidcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgc3RhdHVzIGFuZCBkYXRlIG9mIGFuIHVwZGF0ZSB0byB0aGUgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyYUxvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5TdGF0dXNIaXN0b3J5VXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzOiBDcmFMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZmZlY3RpdmUgZGF0ZSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgbG9hbi4gVGhlIGRhdGUgc2hvdWxkIGJlIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGVcbiAgICAgKi9cbiAgICBkYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB0eXBlIG9mIGxvYW4gdGhlIHVzZXIgYXBwbGllZCBmb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmFMb2FuVHlwZSB7XG4gICAgUGVyc29uYWwgPSAnUEVSU09OQUwnLFxuICAgIENyZWRpdENhcmQgPSAnQ1JFRElUX0NBUkQnLFxuICAgIEJ1c2luZXNzID0gJ0JVU0lORVNTJyxcbiAgICBNb3J0Z2FnZSA9ICdNT1JUR0FHRScsXG4gICAgQXV0byA9ICdBVVRPJyxcbiAgICBQYXlkYXkgPSAnUEFZREFZJyxcbiAgICBTdHVkZW50ID0gJ1NUVURFTlQnLFxuICAgIEhvbWVFcXVpdHkgPSAnSE9NRV9FUVVJVFknLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGxvYW4gZGF0YSBmb3IgdGhlIGxvYW4gYmVpbmcgdW5yZWdpc3RlcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuVW5yZWdpc3RlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5VbnJlZ2lzdGVyIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbG9hbi4gIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBsb2FuX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVW5yZWdpc3RlclxuICAgICAqL1xuICAgIGxvYW5faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JhTG9hbkNsb3NlZFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVucmVnaXN0ZXJcbiAgICAgKi9cbiAgICBjbG9zZWRfd2l0aF9zdGF0dXM6IENyYUxvYW5DbG9zZWRTdGF0dXM7XG59XG4vKipcbiAqIENyYUxvYW5VbnJlZ2lzdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hblVucmVnaXN0ZXJSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5VbnJlZ2lzdGVyUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBsb2FuIGRhdGEgdG8gdXBkYXRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFMb2FuVXBkYXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hblVwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGxvYW4uICBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgbG9hbl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hblVwZGF0ZVxuICAgICAqL1xuICAgIGxvYW5faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHN0YXR1cyB1cGRhdGUgaGlzdG9yeSBvZiB0aGUgbG9hbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblN0YXR1c0hpc3RvcnlVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2FuVXBkYXRlXG4gICAgICovXG4gICAgc3RhdHVzX2hpc3Rvcnk/OiBBcnJheTxDcmFMb2FuU3RhdHVzSGlzdG9yeVVwZGF0ZT47XG4gICAgLyoqXG4gICAgICogVGhlIHVwZGF0ZXMgdG8gdGhlIHBheW1lbnQgaGlzdG9yeSBmb3IgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge0FycmF5PENyYUxvYW5QYXltZW50SGlzdG9yeT59XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5VcGRhdGVcbiAgICAgKi9cbiAgICBwYXltZW50X2hpc3Rvcnk/OiBBcnJheTxDcmFMb2FuUGF5bWVudEhpc3Rvcnk+O1xufVxuLyoqXG4gKiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGxvYW4gYXBwbGljYXRpb25zIHRvIHJlZ2lzdGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFMb2FuQXBwbGljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uczogQXJyYXk8Q3JhTG9hbkFwcGxpY2F0aW9uPjtcbn1cbi8qKlxuICogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFMb2Fuc1JlZ2lzdGVyUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyYS9sb2Fucy9yZWdpc3RlcmAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gdW5yZWdpc3Rlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhTG9hblVucmVnaXN0ZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5VbnJlZ2lzdGVyPjtcbn1cbi8qKlxuICogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9sb2Fucy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYUxvYW5zVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbG9hbnMgdG8gdXBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFMb2FuVXBkYXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbG9hbnM6IEFycmF5PENyYUxvYW5VcGRhdGU+O1xufVxuLyoqXG4gKiBDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmEvbG9hbnMvdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTG9hbnNVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYUxvYW5zVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFMb2Fuc1VwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlOiBNb25pdG9yaW5nQ29uc3VtZXJSZXBvcnRQZXJtaXNzaWJsZVB1cnBvc2U7XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYGNyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIGEgVXNlciBNb25pdG9yaW5nIEluc2lnaHRzIFJlcG9ydC4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoaXMgSUQgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2luc2lnaHRzX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgTW9uaXRvcmluZyBJbnNpZ2h0cyBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhIE1vbml0b3JpbmcgSW5zaWdodHMgSXRlbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgc3BlY2lmaWMgaW5zaWdodHMgd2VyZSBnZW5lcmF0ZWQgKHBlci1pdGVtKSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChlLmcuIFxcXCIyMDE4LTA0LTEyVDAzOjMyOjExWlxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBkYXRlX2dlbmVyYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnNpZ2h0c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc2lnaHRzOiBNb25pdG9yaW5nSW5zaWdodHMgfCBudWxsO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL3N1YnNjcmliZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCBNb25pdG9yaW5nIEluc2lnaHRzIHdlYmhvb2tzLCBmb3IgZXhhbXBsZSB3aGVuIHRoZSByZXF1ZXN0ZWQgTW9uaXRvcmluZyBJbnNpZ2h0cyBpcyByZWFkeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBjcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9zdWJzY3JpYmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3Vic2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3Vic2NyaXB0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy91bnN1YnNjcmliZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzdWJzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgc3Vic2NyaXB0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgY3JhL21vbml0b3JpbmdfaW5zaWdodHMvdW5zdWJzY3JpYmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgZGF0YSBhYm91dCB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFOZXR3b3JrSW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGUgdXNlciBsaW5rZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgQ1JBIE5ldHdvcmsgQXR0cmlidXRlcyBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTmV0d29yayBBdHRyaWJ1dGVzIHJlcG9ydCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgcmVwb3J0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgTmV0d29yayBBdHRyaWJ1dGVzIFJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYU5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBtYXAgb2YgbmV0d29yayBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQsIGludCwgb3IgYm9vbGVhbi5cbiAgICAgKiBAdHlwZSB7b2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBDcmFOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBuZXR3b3JrX2F0dHJpYnV0ZXM6IG9iamVjdDtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbXMgdGhlIGVuZCB1c2VyIGNvbm5lY3RlZCBpbiBMaW5rLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmFOZXR3b3JrSW5zaWdodHNJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyYU5ldHdvcmtJbnNpZ2h0c0l0ZW0+O1xufVxuLyoqXG4gKiBBIGxpc3Qgb2YgYWRkLW9ucyB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgUERGLiAgYGNyYV9pbmNvbWVfaW5zaWdodHNgOiBJbmNsdWRlIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgaW4gdGhlIFBERi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyYVBERkFkZE9ucyB7XG4gICAgQ3JhSW5jb21lSW5zaWdodHMgPSAnY3JhX2luY29tZV9pbnNpZ2h0cydcbn1cblxuLyoqXG4gKiBUaGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgb2YgdGhlIGJhbmsgZGF0YSBmb3IgYW4gZW5kIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhlIFBhcnRuZXIgSW5zaWdodHMgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIHJlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBQYXJ0bmVyIEluc2lnaHRzIHJlcG9ydCB3YXMgZ2VuZXJhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNQcmlzbX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgcHJpc20/OiBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyB1c2VkIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIGl0ZW1zPzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBwYXJ0bmVyIGluc2lnaHRzIHJlcG9ydCBoYXMgZmluaXNoZWQgZ2VuZXJhdGluZyBhbmQgcmVzdWx0cyBhcmUgYXZhaWxhYmxlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0NvbXBsZXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0NvbXBsZXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENSQV9JTlNJR0hUU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEFSVE5FUl9JTlNJR0hUU19DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhIHBhcnRuZXIgaW5zaWdodHMgcmVwb3J0IGhhcyBmYWlsZWQgdG8gZ2VuZXJhdGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRXJyb3JXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzRXJyb3JXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQ1JBX0lOU0lHSFRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQQVJUTkVSX0lOU0lHSFRTX0VSUk9SYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0Vycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNFcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyYVBhcnRuZXJJbnNpZ2h0cz59XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVwb3J0PzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGFuZCBtZXRhZGF0YSBmb3IgYW4gZW5kIHVzZXJcXCdzIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGF0IHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGluIHRoZSBpdGVtXG4gICAgICogQHR5cGUge0FycmF5PENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8Q3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnQ+O1xufVxuLyoqXG4gKiBBY2NvdW50IGRhdGEgY29ycmVzcG9uZGluZyB0byB0aGUgaXRlbSBmcm9tIHdoaWNoIFBhcnRuZXIgSW5zaWdodHMgd2VyZSBnZW5lcmF0ZWQgZnJvbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIHZhbHVlIHdpbGwgbm90IGNoYW5nZSB1bmxlc3MgUGxhaWQgY2FuXFwndCByZWNvbmNpbGUgdGhlIGFjY291bnQgd2l0aCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGlzIG1heSBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdGhlIG5hbWUgb2YgdGhlIGFjY291bnQgY2hhbmdlcy4gSWYgdGhpcyBoYXBwZW5zIGEgbmV3IGBhY2NvdW50X2lkYCB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBhY2NvdW50LiAgSWYgYW4gYWNjb3VudCB3aXRoIGEgc3BlY2lmaWMgYGFjY291bnRfaWRgIGRpc2FwcGVhcnMgaW5zdGVhZCBvZiBjaGFuZ2luZywgdGhlIGFjY291bnQgaXMgbGlrZWx5IGNsb3NlZC4gQ2xvc2VkIGFjY291bnRzIGFyZSBub3QgcmV0dXJuZWQgYnkgdGhlIFBsYWlkIEFQSS4gIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGFjY291bnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLCBhbmQgaXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudFxuICAgICAqL1xuICAgIG9mZmljaWFsX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRvcnlBY2NvdW50U3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlOiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFR5cGU7XG4gICAgLyoqXG4gICAgICogRGF0YSByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFib3V0IHRoZSBhY2NvdW50IG93bmVyIG9yIG93bmVycy4gSWRlbnRpdHkgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwsIHNvIGZpZWxkIG1heSByZXR1cm4gYW4gZW1wdHkgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PE93bmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRcbiAgICAgKi9cbiAgICBvd25lcnM6IEFycmF5PE93bmVyPjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgbWV0YWRhdGEgYWJvdXQgdGhlIGV4dHJhY3RlZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzSXRlbUFjY291bnRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGV4dHJhY3RlZCB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c0l0ZW1BY2NvdW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBtb3N0IHJlY2VudCBleHRyYWN0ZWQgdHJhbnNhY3Rpb24sIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNJdGVtQWNjb3VudE1ldGFkYXRhXG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBQcmlzbSBEYXRhIGluc2lnaHRzIGZvciB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgaW5zaWdodHM/OiBQcmlzbUluc2lnaHRzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmV9XG4gICAgICogQG1lbWJlcm9mIENyYVBhcnRuZXJJbnNpZ2h0c1ByaXNtXG4gICAgICovXG4gICAgY2FzaF9zY29yZT86IFByaXNtQ2FzaFNjb3JlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21GaXJzdERldGVjdH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhUGFydG5lckluc2lnaHRzUHJpc21cbiAgICAgKi9cbiAgICBmaXJzdF9kZXRlY3Q/OiBQcmlzbUZpcnN0RGV0ZWN0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXRhaWxzIG9uIHdoZXRoZXIgdGhlIFByaXNtIERhdGEgYXR0cmlidXRlcyBzdWNjZWVkZWQgb3IgZmFpbGVkIHRvIGJlIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQYXJ0bmVySW5zaWdodHNQcmlzbVxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcHJlZGljdGlvbiBpbnRlcnZhbCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFQcmVkaWN0aW9uSW50ZXJ2YWwge1xuICAgIC8qKlxuICAgICAqIFRoZSBsb3dlciBib3VuZCBvZiB0aGUgcHJlZGljdGVkIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHByb2JhYmlsaXR5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyYVByZWRpY3Rpb25JbnRlcnZhbFxuICAgICAqL1xuICAgIGxvd2VyX2JvdW5kPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXBwZXIgYm91bmQgb2YgdGhlIHByZWRpY3RlZCBhdHRyaWJ1dGUgZm9yIHRoZSBnaXZlbiBwcm9iYWJpbGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAgICAgKi9cbiAgICB1cHBlcl9ib3VuZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2JhYmlsaXR5IG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBmYWxsaW5nIHdpdGhpbiB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kLiBUaGlzIGlzIGEgcGVyY2VudGFnZSByZXByZXNlbnRlZCBhcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgMS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmFQcmVkaWN0aW9uSW50ZXJ2YWxcbiAgICAgKi9cbiAgICBwcm9iYWJpbGl0eT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSBDaGVjayBSZXBvcnQgdXBncmFkZSBhdHRlbXB0IGhhcyBmYWlsZWRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmFVcGdyYWRlRmFpbGVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENIRUNLX1JFUE9SVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVUEdSQURFX0ZBSUxFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgdXNlcl9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgdXNlciB0aGUgd2ViaG9vayBoYXMgZmlyZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyYVVwZ3JhZGVGYWlsZWRXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGBpdGVtX2lkYHMgZm9yIGl0ZW1zIHRoYXQgZmFpbGVkIHRvIGJlIHVwZ3JhZGVkIGJ5IGEgQ2hlY2sgUmVwb3J0IHVwZ3JhZGUgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JhVXBncmFkZUZhaWxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBDcmFVcGdyYWRlRmFpbGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gZW5kIHVzZXJcXCdzIDEwOTkgdGF4IGZvcm1cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0MTA5OVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdDEwOTkge1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rm9ybTEwOTlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZm9ybV8xMDk5X3R5cGU/OiBGb3JtMTA5OVR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdDEwOTlSZWNpcGllbnR9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByZWNpcGllbnQ/OiBDcmVkaXQxMDk5UmVjaXBpZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXQxMDk5UGF5ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcj86IENyZWRpdDEwOTlQYXllcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0MTA5OUZpbGVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlsZXI/OiBDcmVkaXQxMDk5RmlsZXI7XG4gICAgLyoqXG4gICAgICogVGF4IHllYXIgb2YgdGhlIHRheCBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IGluIHJlbnQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHJlbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgaW4gcm95YWx0aWVzIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICByb3lhbHRpZXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBvdGhlciBpbmNvbWUgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG90aGVyX2luY29tZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGZlZGVyYWwgaW5jb21lIHRheCB3aXRoaGVsZCBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBmaXNoaW5nIGJvYXQgcHJvY2VlZHMgZnJvbSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZmlzaGluZ19ib2F0X3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbWVkaWNhbCBhbmQgaGVhbHRoY2FyZSBwYXltZW50cyBmcm9tIHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtZWRpY2FsX2FuZF9oZWFsdGhjYXJlX3BheW1lbnRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2Ygbm9uZW1wbG95ZWUgY29tcGVuc2F0aW9uIGZyb20gcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vbmVtcGxveWVlX2NvbXBlbnNhdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN1YnN0aXR1dGUgcGF5bWVudHMgbWFkZSBieSBwYXllci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3Vic3RpdHV0ZV9wYXltZW50c19pbl9saWV1X29mX2RpdmlkZW5kc19vcl9pbnRlcmVzdD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciBvciBub3QgcGF5ZXIgbWFkZSBkaXJlY3Qgc2FsZXMgb3ZlciAkNTAwMCBvZiBjb25zdW1lciBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcGF5ZXJfbWFkZV9kaXJlY3Rfc2FsZXNfb2ZfNTAwMF9vcl9tb3JlX29mX2NvbnN1bWVyX3Byb2R1Y3RzX3RvX2J1eWVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgY3JvcCBpbnN1cmFuY2UgcHJvY2VlZHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGNyb3BfaW5zdXJhbmNlX3Byb2NlZWRzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgZ29sZGVuIHBhcmFjaHV0ZSBwYXltZW50cyBtYWRlIGJ5IHBheWVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBleGNlc3NfZ29sZGVuX3BhcmFjaHV0ZV9wYXltZW50cz86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGdyb3NzIHByb2NlZWRzIHBhaWQgdG8gYW4gYXR0b3JuZXkgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGdyb3NzX3Byb2NlZWRzX3BhaWRfdG9fYW5fYXR0b3JuZXk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGRlZmVycmFscyBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9kZWZlcnJhbHM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiA0MDlBIGluY29tZSBlYXJuZWQgYnkgcGF5ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY3Rpb25fNDA5YV9pbmNvbWU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiBzdGF0ZSB0YXggd2l0aGhlbGQgb2YgcGF5ZXIgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHN0YXRlX3RheF93aXRoaGVsZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIHN0YXRlIHRheCB3aXRoaGVsZCBvZiBwYXllciBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzdGF0ZV90YXhfd2l0aGhlbGRfbG93ZXI/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgc3RhdGUgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHBheWVyX3N0YXRlX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwYXllcl9zdGF0ZV9udW1iZXJfbG93ZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSByZXBvcnRlZCBmb3IgcHJpbWFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpbmNvbWUgcmVwb3J0ZWQgZm9yIHNlY29uZGFyeSBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgc3RhdGVfaW5jb21lX2xvd2VyPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPbmUgb2YgdGhlIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkIFBheW1lbnQgY2FyZCBUaGlyZCBwYXJ0eSBuZXR3b3JrXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19yZXBvcnRlZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgUFNFIChQYXltZW50IFNldHRsZW1lbnQgRW50aXR5KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHNlX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvcm1hdHRlZCAoWFhYKSBYWFgtWFhYWC4gUGhvbmUgbnVtYmVyIG9mIHRoZSBQU0UgKFBheW1lbnQgU2V0dGxlbWVudCBFbnRpdHkpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwc2VfdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogR3Jvc3MgYW1vdW50IHJlcG9ydGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBncm9zc19hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBpbiBjYXJkIG5vdCBwcmVzZW50IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgY2FyZF9ub3RfcHJlc2VudF90cmFuc2FjdGlvbj86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVyY2hhbnQgY2F0ZWdvcnkgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG1lcmNoYW50X2NhdGVnb3J5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBwYXltZW50IHRyYW5zYWN0aW9ucyBtYWRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBudW1iZXJfb2ZfcGF5bWVudF90cmFuc2FjdGlvbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgSmFudWFyeS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgamFudWFyeV9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgRmVicnVhcnkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGZlYnJ1YXJ5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBNYXJjaC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgbWFyY2hfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEFwcmlsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBhcHJpbF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTWF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBtYXlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bmUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bmVfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEp1bHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIGp1bHlfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgcmVwb3J0ZWQgZm9yIEF1Z3VzdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgYXVndXN0X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBTZXB0ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlcHRlbWJlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgT2N0b2Jlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgb2N0b2Jlcl9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCByZXBvcnRlZCBmb3IgTm92ZW1iZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIG5vdmVtYmVyX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW1vdW50IHJlcG9ydGVkIGZvciBEZWNlbWJlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgZGVjZW1iZXJfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IHN0YXRlIG9mIGJ1c2luZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBwcmltYXJ5X3N0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTZWNvbmRhcnkgc3RhdGUgb2YgYnVzaW5lc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHNlY29uZGFyeV9zdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUHJpbWFyeSBzdGF0ZSBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5XG4gICAgICovXG4gICAgcHJpbWFyeV9zdGF0ZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU2Vjb25kYXJ5IHN0YXRlIElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGluY29tZSB0YXggcmVwb3J0ZWQgZm9yIHByaW1hcnkgc3RhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVxuICAgICAqL1xuICAgIHByaW1hcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaW5jb21lIHRheCByZXBvcnRlZCBmb3Igc2Vjb25kYXJ5IHN0YXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfc3RhdGVfaW5jb21lX3RheD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBmaWxlciB1c2VkIGJ5IDEwOTktSyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5RmlsZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgZmlsZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBmaWxlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5RmlsZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyB3aWxsIGJlIHByb3ZpZGVkOiBQYXltZW50IFNldHRsZW1lbnQgRW50aXR5IChQU0UpLCBFbGVjdHJvbmljIFBheW1lbnQgRmFjaWxpdGF0b3IgKEVQRiksIE90aGVyIFRoaXJkIFBhcnR5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OUZpbGVyXG4gICAgICovXG4gICAgdHlwZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBwYXllciB1c2VkIGJ5IDEwOTktTUlTQyB0YXggZG9jdW1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5UGF5ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGF4IGlkZW50aWZpY2F0aW9uIG51bWJlciBvZiBwYXllci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXQxMDk5UGF5ZXJcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbGVwaG9uZSBudW1iZXIgb2YgcGF5ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVBheWVyXG4gICAgICovXG4gICAgdGVsZXBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSByZWNpcGllbnQgdXNlZCBpbiBib3RoIDEwOTktSyBhbmQgMTA5OS1NSVNDIHRheCBkb2N1bWVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdDEwOTlSZWNpcGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXQxMDk5UmVjaXBpZW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRheCBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICB0aW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgbnVtYmVyIG51bWJlciBvZiByZWNpcGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaGVja2VkIGlmIEZBQ1RBIGlzIGEgZmlsaW5nIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdDEwOTlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBmYWN0YV9maWxpbmdfcmVxdWlyZW1lbnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIENoZWNrZWQgaWYgMm5kIFRJTiBleGlzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0MTA5OVJlY2lwaWVudFxuICAgICAqL1xuICAgIHNlY29uZF90aW5fZXhpc3RzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIHRoZSB1c2UgY2FzZSBvZiB0aGUgdHJhbnNmZXIuIFJlcXVpcmVkIGZvciB0cmFuc2ZlcnMgb24gYW4gQUNIIG5ldHdvcmsuICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcIndlYlxcXCJgIC0gQSBjcmVkaXQgRW50cnkgaW5pdGlhdGVkIGJ5IG9yIG9uIGJlaGFsZiBvZiBhIGhvbGRlciBvZiBhIENvbnN1bWVyIEFjY291bnQgdGhhdCBpcyBpbnRlbmRlZCBmb3IgYSBDb25zdW1lciBBY2NvdW50IG9mIGEgUmVjZWl2ZXJcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEFDSENsYXNzIHtcbiAgICBDY2QgPSAnY2NkJyxcbiAgICBQcGQgPSAncHBkJyxcbiAgICBXZWIgPSAnd2ViJ1xufVxuXG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGNyZWRpdCBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWNyZWRpdCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRBY2NvdW50U3VidHlwZSB7XG4gICAgQ3JlZGl0Q2FyZCA9ICdjcmVkaXQgY2FyZCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBUaGlzIGNvbnRhaW5zIGFuIGFtb3VudCwgZGVub21pbmF0ZWQgaW4gdGhlIGN1cnJlbmN5IHNwZWNpZmllZCBieSBlaXRoZXIgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3lcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3kge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgcmVwb3J0IHRva2VuczsgY2FuIGluY2x1ZGUgYXQgbW9zdCBvbmUgVk9BL3N0YW5kYXJkIEFzc2V0IFJlcG9ydCB0b2tlbnMgYW5kIG9uZSBWT0UgQXNzZXQgUmVwb3J0IFRva2VuLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdG9rZW5zOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHRva2VuIHRoYXQgY2FuIGJlIHNoYXJlZCB3aXRoIGEgdGhpcmQgcGFydHkgYXVkaXRvciwgd2hpY2ggYWxsb3dzIHRoZW0gdG8gZmV0Y2ggdGhlIEFzc2V0IFJlcG9ydHMgYXR0YWNoZWQgdG8gdGhlIHRva2VuLiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X2NvcHlfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYXVkaXRfY29weV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSBBdWRpdCBDb3B5IHlvdSB3b3VsZCBsaWtlIHRvIHJldm9rZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB5b3Ugd291bGQgbGlrZSB0byB1cGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXVkaXRfY29weV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHRva2VucyB3aGljaCB0aGUgc3BlY2lmaWVkIEF1ZGl0IENvcHkgVG9rZW4gd2lsbCBiZSB1cGRhdGVkIHdpdGguIFRoZSB0eXBlcyBvZiB0b2tlbiBzdXBwb3J0ZWQgYXJlIGFzc2V0IHJlcG9ydCB0b2tlbiBhbmQgZW1wbG95bWVudCByZXBvcnQgdG9rZW4uIFRoZXJlIGNhbiBiZSBhdCBtb3N0IDEgb2YgZWFjaCB0b2tlbiB0eXBlIGluIHRoZSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3Rva2VuczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQXVkaXQgQ29weSBUb2tlbiB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBlbXBsb3llciBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGV0YWlsZWQgaW5mb3JtYXRpb24gZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBiYW5rIGVtcGxveW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdEJhbmtFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbW9zdCByZWNlbnQgZGVwb3NpdCBmcm9tIHRoaXMgZW1wbG95ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRcbiAgICAgKi9cbiAgICBsYXRlc3RfZGVwb3NpdF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVhcmxpZXN0IGRlcG9zaXQgZnJvbSB0aGlzIGVtcGxveWVyIGZyb20gd2l0aGluIHRoZSBwZXJpb2Qgb2YgdGhlIGRheXMgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50XG4gICAgICovXG4gICAgZWFybGllc3RfZGVwb3NpdF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL2NyZWRpdC92MS9iYW5rX2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEJhbmsgRW1wbG95bWVudCBkYXRhLiBFYWNoIGVudHJ5IGluIHRoZSBhcnJheSB3aWxsIGJlIGEgZGlzdGluY3QgYmFuayBlbXBsb3ltZW50IHJlcG9ydC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X3JlcG9ydHM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgYW5kIG1ldGFkYXRhIGZvciBhbiBlbmQgdXNlclxcJ3MgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoaXMgSXRlbVxcJ3MgZGF0YSB3YXMgbGFzdCByZXRyaWV2ZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGUuZy4gXFxcIjIwMTgtMDQtMTJUMDM6MzI6MTFaXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudEl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBiYW5rIGVtcGxveW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBkaWZmZXJlbnQgZW1wbG95ZXIgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50czogQXJyYXk8Q3JlZGl0QmFua0VtcGxveW1lbnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtXFwncyBhY2NvdW50cyB0aGF0IGhhdmUgQmFuayBFbXBsb3ltZW50IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgYmFua19lbXBsb3ltZW50X2FjY291bnRzOiBBcnJheTxDcmVkaXRCYW5rSW5jb21lQWNjb3VudD47XG59XG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBkYXRhIGZvciBhbiBlbmQgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0VtcGxveW1lbnRSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBFbXBsb3ltZW50IFJlcG9ydC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGJhbmtfZW1wbG95bWVudF9yZXBvcnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0IHdhcyBnZW5lcmF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoZS5nLiBcXFwiMjAxOC0wNC0xMlQwMzozMjoxMVpcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIGdlbmVyYXRlZF90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbGlzdCBvZiBJdGVtcyBpbiB0aGUgcmVwb3J0IGFsb25nIHdpdGggdGhlIGFzc29jaWF0ZWQgbWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtFbXBsb3ltZW50UmVwb3J0XG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtFbXBsb3ltZW50SXRlbT47XG4gICAgLyoqXG4gICAgICogSWYgZGF0YSBmcm9tIHRoZSBCYW5rIEVtcGxveW1lbnQgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFJlcG9ydFxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmc+O1xufVxuLyoqXG4gKiBUaGUgd2FybmluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGRhdGEgdGhhdCB3YXMgdW5hdmFpbGFibGUgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgUmVwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rRW1wbG95bWVudFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU6IENyZWRpdEJhbmtFbXBsb3ltZW50V2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19jb2RlOiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENyZWRpdEJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgdHlwZSB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQkFOS19FTVBMT1lNRU5UX1dBUk5JTkdgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0VtcGxveW1lbnRXYXJuaW5nVHlwZSB7XG4gICAgQmFua0VtcGxveW1lbnRXYXJuaW5nID0gJ0JBTktfRU1QTE9ZTUVOVF9XQVJOSU5HJ1xufVxuXG4vKipcbiAqIFRoZSByZXBvcnQgb2YgdGhlIEJhbmsgSW5jb21lIGRhdGEgZm9yIGFuIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgQmFuayBJbmNvbWUgUmVwb3J0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZSB3aGVuIHRoZSByZXBvcnQgd2FzIGdlbmVyYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY3VzdG9tZXIgZm9yIHRoZSByZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIEl0ZW1zIGluIHRoZSByZXBvcnQgYWxvbmcgd2l0aCB0aGUgYXNzb2NpYXRlZCBtZXRhZGF0YSBhYm91dCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgaXRlbXM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc3VtbWFyeT86IENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIElmIGRhdGEgZnJvbSB0aGUgcmVwb3J0IHdhcyB1bmFibGUgdG8gYmUgcmV0cmlldmVkLCB0aGUgd2FybmluZ3Mgd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvciB0aGF0IGNhdXNlZCB0aGUgZGF0YSB0byBiZSBpbmNvbXBsZXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICB3YXJuaW5ncz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIEl0ZW1cXCdzIGJhbmsgYWNjb3VudHMgdGhhdCBoYXZlIHRoZSBzZWxlY3RlZCBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci4gTm90ZSB0aGF0IHRoZSBtYXNrIG1heSBiZSBub24tdW5pcXVlIGJldHdlZW4gYW4gSXRlbVxcJ3MgYWNjb3VudHMsIGFuZCBpdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50XG4gICAgICovXG4gICAgb2ZmaWNpYWxfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU6IERlcG9zaXRvcnlBY2NvdW50U3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU6IENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBEYXRhIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIGFjY291bnQgb3duZXIgb3Igb3duZXJzLiBJZGVudGl0eSBpbmZvcm1hdGlvbiBpcyBvcHRpb25hbCwgc28gZmllbGQgbWF5IHJldHVybiBhbiBlbXB0eSBhcnJheS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8T3duZXI+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyczogQXJyYXk8T3duZXI+O1xufVxuLyoqXG4gKiBUaGUgYWNjb3VudCB0eXBlLiBUaGlzIHdpbGwgYWx3YXlzIGJlIGBkZXBvc2l0b3J5YC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVBY2NvdW50VHlwZSB7XG4gICAgRGVwb3NpdG9yeSA9ICdkZXBvc2l0b3J5J1xufVxuXG4vKipcbiAqIFRoZSBpbmNvbWUgY2F0ZWdvcnkuICBgQkFOS19JTlRFUkVTVGA6IEludGVyZXN0IGVhcm5lZCBmcm9tIGEgYmFuayBhY2NvdW50LiBgQkVORUZJVF9PVEhFUmA6IEdvdmVybm1lbnQgYmVuZWZpdHMgb3RoZXIgdGhhbiByZXRpcmVtZW50LCB1bmVtcGxveW1lbnQsIGNoaWxkIHN1cHBvcnQsIG9yIGRpc2FiaWxpdHkuIEN1cnJlbnRseSB1c2VkIG9ubHkgaW4gdGhlIFVLLCB0byByZXByZXNlbnQgYmVuZWZpdHMgc3VjaCBhcyBDb3N0IG9mIExpdmluZyBQYXltZW50cy4gYENBU0hgOiBEZXByZWNhdGVkIGFuZCB1c2VkIG9ubHkgZm9yIGV4aXN0aW5nIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbnMuIEhhcyBiZWVuIHJlcGxhY2VkIGJ5IGBDQVNIX0RFUE9TSVRgIGFuZCBgVFJBTlNGRVJfRlJPTV9BUFBMSUNBVElPTmAuIGBDQVNIX0RFUE9TSVRgOiBBIGNhc2ggb3IgY2hlY2sgZGVwb3NpdC4gYENISUxEX1NVUFBPUlRgOiBDaGlsZCBzdXBwb3J0IHBheW1lbnRzIHJlY2VpdmVkLiBgR0lHX0VDT05PTVlgOiBJbmNvbWUgZWFybmVkIGFzIGEgZ2lnIGVjb25vbXkgd29ya2VyLCBlLmcuIGRyaXZpbmcgZm9yIFViZXIsIEx5ZnQsIFBvc3RtYXRlcywgRG9vckRhc2gsIGV0Yy4gYExPTkdfVEVSTV9ESVNBQklMSVRZYDogRGlzYWJpbGl0eSBwYXltZW50cywgaW5jbHVkaW5nIFNvY2lhbCBTZWN1cml0eSBkaXNhYmlsaXR5IGJlbmVmaXRzLiBgT1RIRVJgOiBJbmNvbWUgdGhhdCBjb3VsZCBub3QgYmUgY2F0ZWdvcml6ZWQgYXMgYW55IG90aGVyIGluY29tZSBjYXRlZ29yeS4gYE1JTElUQVJZYDogVmV0ZXJhbnMgYmVuZWZpdHMuIEluY29tZSBlYXJuZWQgYXMgc2FsYXJ5IGZvciBzZXJ2aW5nIGluIHRoZSBtaWxpdGFyeSAoZS5nLiB0aHJvdWdoIERGQVMpIHdpbGwgYmUgY2xhc3NpZmllZCBhcyBgU0FMQVJZYCByYXRoZXIgdGhhbiBgTUlMSVRBUllgLiAgYFJFTlRBTGA6IEluY29tZSBlYXJuZWQgZnJvbSBhIHJlbnRhbCBwcm9wZXJ0eS4gSW5jb21lIG1heSBiZSBpZGVudGlmaWVkIGFzIHJlbnRhbCB3aGVuIHRoZSBwYXltZW50IGlzIHJlY2VpdmVkIHRocm91Z2ggYSByZW50YWwgcGxhdGZvcm0sIGUuZy4gQWlyYm5iOyByZW50IHBhaWQgZGlyZWN0bHkgYnkgdGhlIHRlbmFudCB0byB0aGUgcHJvcGVydHkgb3duZXIgKGUuZy4gdmlhIGNhc2gsIGNoZWNrLCBvciBBQ0gpIHdpbGwgdHlwaWNhbGx5IG5vdCBiZSBjbGFzc2lmaWVkIGFzIHJlbnRhbCBpbmNvbWUuICBgUkVUSVJFTUVOVGA6IFBheW1lbnRzIGZyb20gcHJpdmF0ZSByZXRpcmVtZW50IHN5c3RlbXMsIHBlbnNpb25zLCBhbmQgZ292ZXJubWVudCByZXRpcmVtZW50IHByb2dyYW1zLCBpbmNsdWRpbmcgU29jaWFsIFNlY3VyaXR5IHJldGlyZW1lbnQgYmVuZWZpdHMuIGBTQUxBUllgOiBQYXltZW50IGZyb20gYW4gZW1wbG95ZXIgdG8gYW4gZWFybmVyIG9yIG90aGVyIGZvcm0gb2YgcGVybWFuZW50IGVtcGxveW1lbnQuIGBUQVhfUkVGVU5EYDogQSB0YXggcmVmdW5kLiBgVFJBTlNGRVJfRlJPTV9BUFBMSUNBVElPTmA6IERlcG9zaXRzIGZyb20gYSBtb25leSB0cmFuc2ZlciBhcHAsIHN1Y2ggYXMgVmVubW8sIENhc2ggQXBwLCBvciBaZWxsZS4gYFVORU1QTE9ZTUVOVGA6IFVuZW1wbG95bWVudCBiZW5lZml0cy4gSW4gdGhlIFVLLCBpbmNsdWRlcyBjZXJ0YWluIGxvdy1pbmNvbWUgYmVuZWZpdHMgc3VjaCBhcyB0aGUgVW5pdmVyc2FsIENyZWRpdC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeSB7XG4gICAgU2FsYXJ5ID0gJ1NBTEFSWScsXG4gICAgVW5lbXBsb3ltZW50ID0gJ1VORU1QTE9ZTUVOVCcsXG4gICAgQ2FzaCA9ICdDQVNIJyxcbiAgICBHaWdFY29ub215ID0gJ0dJR19FQ09OT01ZJyxcbiAgICBSZW50YWwgPSAnUkVOVEFMJyxcbiAgICBDaGlsZFN1cHBvcnQgPSAnQ0hJTERfU1VQUE9SVCcsXG4gICAgTWlsaXRhcnkgPSAnTUlMSVRBUlknLFxuICAgIFJldGlyZW1lbnQgPSAnUkVUSVJFTUVOVCcsXG4gICAgTG9uZ1Rlcm1EaXNhYmlsaXR5ID0gJ0xPTkdfVEVSTV9ESVNBQklMSVRZJyxcbiAgICBCYW5rSW50ZXJlc3QgPSAnQkFOS19JTlRFUkVTVCcsXG4gICAgQ2FzaERlcG9zaXQgPSAnQ0FTSF9ERVBPU0lUJyxcbiAgICBUcmFuc2ZlckZyb21BcHBsaWNhdGlvbiA9ICdUUkFOU0ZFUl9GUk9NX0FQUExJQ0FUSU9OJyxcbiAgICBUYXhSZWZ1bmQgPSAnVEFYX1JFRlVORCcsXG4gICAgQmVuZWZpdE90aGVyID0gJ0JFTkVGSVRfT1RIRVInLFxuICAgIE90aGVyID0gJ09USEVSJ1xufVxuXG4vKipcbiAqIEFuIGVycm9yIG9iamVjdCBhbmQgYXNzb2NpYXRlZCBgaXRlbV9pZGAgdXNlZCB0byBpZGVudGlmeSBhIHNwZWNpZmljIEl0ZW0gYW5kIGVycm9yIHdoZW4gYSBiYXRjaCBvcGVyYXRpb24gb3BlcmF0aW5nIG9uIG11bHRpcGxlIEl0ZW1zIGhhcyBlbmNvdW50ZXJlZCBhbiBlcnJvciBpbiBvbmUgb2YgdGhlIEl0ZW1zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lQ2F1c2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFdlIHVzZSBzdGFuZGFyZCBIVFRQIHJlc3BvbnNlIGNvZGVzIGZvciBzdWNjZXNzIGFuZCBmYWlsdXJlIG5vdGlmaWNhdGlvbnMsIGFuZCBvdXIgZXJyb3JzIGFyZSBmdXJ0aGVyIGNsYXNzaWZpZWQgYnkgYGVycm9yX3R5cGVgLiBJbiBnZW5lcmFsLCAyMDAgSFRUUCBjb2RlcyBjb3JyZXNwb25kIHRvIHN1Y2Nlc3MsIDQwWCBjb2RlcyBhcmUgZm9yIGRldmVsb3Blci0gb3IgdXNlci1yZWxhdGVkIGZhaWx1cmVzLCBhbmQgNTBYIGNvZGVzIGFyZSBmb3IgUGxhaWQtcmVsYXRlZCBpc3N1ZXMuIEVycm9yIGZpZWxkcyB3aWxsIGJlIGBudWxsYCBpZiBubyBlcnJvciBoYXMgb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZXJyb3JfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGV2ZWxvcGVyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lQ2F1c2VcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1c2VyLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBlcnJvciBjb2RlLiBudWxsIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUNhdXNlXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3YXJuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVDYXVzZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbn1cbi8qKlxuICogQSBicm9hZCBjYXRlZ29yaXphdGlvbiBvZiB0aGUgZXJyb3IuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lRXJyb3JUeXBlIHtcbiAgICBJbnRlcm5hbFNlcnZlckVycm9yID0gJ0lOVEVSTkFMX1NFUlZFUl9FUlJPUicsXG4gICAgSW5zdWZmaWNpZW50Q3JlZGVudGlhbHMgPSAnSU5TVUZGSUNJRU5UX0NSRURFTlRJQUxTJyxcbiAgICBJdGVtTG9ja2VkID0gJ0lURU1fTE9DS0VEJyxcbiAgICBVc2VyU2V0dXBSZXF1aXJlZCA9ICdVU0VSX1NFVFVQX1JFUVVJUkVEJyxcbiAgICBDb3VudHJ5Tm90U3VwcG9ydGVkID0gJ0NPVU5UUllfTk9UX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Eb3duID0gJ0lOU1RJVFVUSU9OX0RPV04nLFxuICAgIEluc3RpdHV0aW9uTm9Mb25nZXJTdXBwb3J0ZWQgPSAnSU5TVElUVVRJT05fTk9fTE9OR0VSX1NVUFBPUlRFRCcsXG4gICAgSW5zdGl0dXRpb25Ob3RSZXNwb25kaW5nID0gJ0lOU1RJVFVUSU9OX05PVF9SRVNQT05ESU5HJyxcbiAgICBJbnZhbGlkQ3JlZGVudGlhbHMgPSAnSU5WQUxJRF9DUkVERU5USUFMUycsXG4gICAgSW52YWxpZE1mYSA9ICdJTlZBTElEX01GQScsXG4gICAgSW52YWxpZFNlbmRNZXRob2QgPSAnSU5WQUxJRF9TRU5EX01FVEhPRCcsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgTWZhTm90U3VwcG9ydGVkID0gJ01GQV9OT1RfU1VQUE9SVEVEJyxcbiAgICBOb0FjY291bnRzID0gJ05PX0FDQ09VTlRTJyxcbiAgICBJdGVtTm90U3VwcG9ydGVkID0gJ0lURU1fTk9UX1NVUFBPUlRFRCcsXG4gICAgQWNjZXNzTm90R3JhbnRlZCA9ICdBQ0NFU1NfTk9UX0dSQU5URUQnXG59XG5cbi8qKlxuICogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBIb3cgbWFueSBCYW5rIEluY29tZSBSZXBvcnRzIHNob3VsZCBiZSBmZXRjaGVkLiBNdWx0aXBsZSByZXBvcnRzIG1heSBiZSBhdmFpbGFibGUgaWYgdGhlIHJlcG9ydCBoYXMgYmVlbiByZS1jcmVhdGVkIG9yIHJlZnJlc2hlZC4gSWYgbW9yZSB0aGFuIG9uZSByZXBvcnQgaXMgYXZhaWxhYmxlLCB0aGUgbW9zdCByZWNlbnQgcmVwb3J0cyB3aWxsIGJlIHJldHVybmVkIGZpcnN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWU+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbmQgdXNlclxcJ3MgbW9udGhseSBzdW1tYXJ5IGZvciB0aGUgaW5jb21lIHNvdXJjZShzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgZWFybmluZ3MgZm9yIHRoZSBpbmNvbWUgc291cmNlKHMpIG9mIHRoZSB1c2VyIGZvciB0aGUgbW9udGggaW4gdGhlIHN1bW1hcnkuIFRoaXMgbWF5IHJldHVybiBhbiBpbmNvcnJlY3QgdmFsdWUgaWYgdGhlIHN1bW1hcnkgaW5jbHVkZXMgaW5jb21lIHNvdXJjZXMgaW4gbXVsdGlwbGUgY3VycmVuY2llcy4gUGxlYXNlIHVzZSBbYHRvdGFsX2Ftb3VudHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbmNvbWUvI2NyZWRpdC1iYW5rX2luY29tZS1nZXQtcmVzcG9uc2UtYmFuay1pbmNvbWUtaXRlbXMtYmFuay1pbmNvbWUtc291cmNlcy1oaXN0b3JpY2FsLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWl0ZW1zLWJhbmstaW5jb21lLXNvdXJjZXMtaGlzdG9yaWNhbC1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBmb3IgdGhlIGluY29tZSBzb3VyY2Uocykgb2YgdGhlIHVzZXIgZm9yIHRoZSBtb250aCBpbiB0aGUgc3VtbWFyeS4gVGhpcyBjYW4gY29udGFpbiBtdWx0aXBsZSBhbW91bnRzLCB3aXRoIGVhY2ggYW1vdW50IGRlbm9taW5hdGVkIGluIG9uZSB1bmlxdWUgY3VycmVuY3kuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFtb3VudFdpdGhDdXJyZW5jeT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudHM/OiBBcnJheTxDcmVkaXRBbW91bnRXaXRoQ3VycmVuY3k+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBwZXJpb2QgY292ZXJlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGgsIHVubGVzcyB0aGUgbW9udGggYmVpbmcgY292ZXJlZCBpcyBhIHBhcnRpYWwgbW9udGggYmVjYXVzZSBpdCBpcyB0aGUgZmlyc3QgbW9udGggaW5jbHVkZWQgaW4gdGhlIHN1bW1hcnkgYW5kIHRoZSBkYXRlIHJhbmdlIGJlaW5nIHJlcXVlc3RlZCBkb2VzIG5vdCBiZWdpbiB3aXRoIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF0ZSB3aWxsIGJlIHJldHVybmVkIGluIGFuIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHBlcmlvZCBpbmNsdWRlZCBpbiB0aGlzIG1vbnRobHkgc3VtbWFyeS4gVGhpcyBkYXRlIHdpbGwgYmUgdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aCwgdW5sZXNzIHRoZSBtb250aCBiZWluZyBjb3ZlcmVkIGlzIGEgcGFydGlhbCBtb250aCBiZWNhdXNlIGl0IGlzIHRoZSBsYXN0IG1vbnRoIGluY2x1ZGVkIGluIHRoZSBzdW1tYXJ5IGFuZCB0aGUgZGF0ZSByYW5nZSBiZWluZyByZXF1ZXN0ZWQgZG9lcyBub3QgZW5kIHdpdGggdGhlIGxhc3QgZGF5IG9mIHRoZSBtb250aC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeVxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnlcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBBcnJheTxDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBhbmQgbWV0YWRhdGEgZm9yIGFuIGVuZCB1c2VyXFwncyBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbVxcJ3MgYWNjb3VudHMgdGhhdCBoYXZlIEJhbmsgSW5jb21lIGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9hY2NvdW50cz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIHNvdXJjZXMgZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBzaW5nbGUgaW5jb21lIHNvdXJjZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZVNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVJdGVtXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfc291cmNlcz86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVTb3VyY2U+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhpcyBJdGVtXFwncyBkYXRhIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBsYXN0X3VwZGF0ZWRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZUl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGluY29tZSBwYXkgZnJlcXVlbmN5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeSB7XG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogSG93IG1hbnkgZGF5cyBvZiBkYXRhIHRvIGluY2x1ZGUgaW4gdGhlIHJlZnJlc2guIElmIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBkYXlzIHJlcXVlc3RlZCBpbiB0aGUgbW9zdCByZWNlbnRseSBnZW5lcmF0ZWQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxlZCBpbmZvcm1hdGlvbiBmb3IgdGhlIGluY29tZSBzb3VyY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbiBpbmNvbWUgc291cmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfc291cmNlX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9jYXRlZ29yeT86IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1pbmltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE1heGltdW0gb2YgYWxsIGRhdGVzIHdpdGhpbiB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZXMgaW4gdGhlIHVzZXLigJlzIGJhbmsgYWNjb3VudCBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua0luY29tZVBheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBDcmVkaXRCYW5rSW5jb21lUGF5RnJlcXVlbmN5O1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBpbiB0aGUgdXNlcuKAmXMgYmFuayBhY2NvdW50IGZvciB0aGUgc3BlY2lmaWMgaW5jb21lIHNvdXJjZSBmb3IgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU291cmNlXG4gICAgICovXG4gICAgdG90YWxfYW1vdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0cmFuc2FjdGlvbnMgZm9yIHRoZSBpbmNvbWUgc291cmNlIHdpdGhpbiB0aGUgc3RhcnQgYW5kIGVuZCBkYXRlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua0luY29tZUhpc3RvcmljYWxTdW1tYXJ5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc3VtbWFyeT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT47XG59XG4vKipcbiAqIFN1bW1hcnkgZm9yIGJhbmsgaW5jb21lIGFjcm9zcyBhbGwgaW5jb21lIHNvdXJjZXMgYW5kIGl0ZW1zIChtYXggaGlzdG9yeSBvZiA3MzAgZGF5cykuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiBlYXJuaW5ncyBhY3Jvc3MgYWxsIHRoZSBpbmNvbWUgc291cmNlcyBpbiB0aGUgZW5kIHVzZXJcXCdzIEl0ZW1zIGZvciB0aGUgZGF5cyByZXF1ZXN0ZWQgYnkgdGhlIGNsaWVudC4gVGhpcyBtYXkgcmV0dXJuIGFuIGluY29ycmVjdCB2YWx1ZSBpZiB0aGUgc3VtbWFyeSBpbmNsdWRlcyBpbmNvbWUgc291cmNlcyBpbiBtdWx0aXBsZSBjdXJyZW5jaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFsX2Ftb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIFBsZWFzZSB1c2UgW2B0b3RhbF9hbW91bnRzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW5jb21lLyNjcmVkaXQtYmFua19pbmNvbWUtZ2V0LXJlc3BvbnNlLWJhbmstaW5jb21lLWJhbmstaW5jb21lLXN1bW1hcnktdG90YWwtYW1vdW50cykgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiBQbGVhc2UgdXNlIFtgdG90YWxfYW1vdW50c2BdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2luY29tZS8jY3JlZGl0LWJhbmtfaW5jb21lLWdldC1yZXNwb25zZS1iYW5rLWluY29tZS1iYW5rLWluY29tZS1zdW1tYXJ5LXRvdGFsLWFtb3VudHMpIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVG90YWwgYW1vdW50IG9mIGVhcm5pbmdzIGFjcm9zcyBhbGwgdGhlIGluY29tZSBzb3VyY2VzIGluIHRoZSBlbmQgdXNlclxcJ3MgSXRlbXMgZm9yIHRoZSBkYXlzIHJlcXVlc3RlZCBieSB0aGUgY2xpZW50LiBUaGlzIGNhbiBjb250YWluIG11bHRpcGxlIGFtb3VudHMsIHdpdGggZWFjaCBhbW91bnQgZGVub21pbmF0ZWQgaW4gb25lIHVuaXF1ZSBjdXJyZW5jeS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICB0b3RhbF9hbW91bnRzPzogQXJyYXk8Q3JlZGl0QW1vdW50V2l0aEN1cnJlbmN5PjtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSB3aXRoaW4gdGhlIGRheXMgcmVxdWVzdGVkIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiBhIHVzZXJcXCdzIGFjY291bnQuIFRoZSBkYXRlIHdpbGwgYmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCBkYXRlIGluIHdoaWNoIGFsbCBpbmNvbWUgc291cmNlcyBpZGVudGlmaWVkIGJ5IFBsYWlkIGFwcGVhciBpbiB0aGUgdXNlclxcJ3MgYWNjb3VudC4gVGhlIGRhdGUgd2lsbCBiZSByZXR1cm5lZCBpbiBhbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIHBlciBlbmQgdXNlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VzX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBpbmNvbWUgY2F0ZWdvcmllcyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcmllc19jb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaW5jb21lIHRyYW5zYWN0aW9ucyBwZXIgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVN1bW1hcnlcbiAgICAgKi9cbiAgICBpbmNvbWVfdHJhbnNhY3Rpb25zX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rSW5jb21lSGlzdG9yaWNhbFN1bW1hcnk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc3VtbWFyeT86IEFycmF5PENyZWRpdEJhbmtJbmNvbWVIaXN0b3JpY2FsU3VtbWFyeT47XG59XG4vKipcbiAqIFRoZSB0cmFuc2FjdGlvbnMgZGF0YSBmb3IgdGhlIGVuZCB1c2VyXFwncyBpbmNvbWUgc291cmNlKHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3kgYXMgc3RhdGVkIGluIGBpc29fY3VycmVuY3lfY29kZWAgb3IgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAuIFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBjcmVkaXQgY2FyZCBwdXJjaGFzZXMgYXJlIHBvc2l0aXZlOyBjcmVkaXQgY2FyZCBwYXltZW50LCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBvcmlnaW5hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSB0cmFuc2FjdGlvbi4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgdHJhbnNhY3Rpb25faWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtJbmNvbWVUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB3YXJuaW5nIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGF0YSB0aGF0IHdhcyB1bmF2YWlsYWJsZSBmb3IgdGhlIEJhbmsgSW5jb21lIFJlcG9ydC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2FybmluZyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX3R5cGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVXYXJuaW5nQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU/OiBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtJbmNvbWVDYXVzZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdhcm5pbmdcbiAgICAgKi9cbiAgICBjYXVzZT86IENyZWRpdEJhbmtJbmNvbWVDYXVzZTtcbn1cbi8qKlxuICogVGhlIHdhcm5pbmcgY29kZSBpZGVudGlmaWVzIGEgc3BlY2lmaWMga2luZCBvZiB3YXJuaW5nLiBgSURFTlRJVFlfVU5BVkFJTEFCTEVgOiBVbmFibGUgdG8gZXh0cmFjdCBpZGVudGl0eSBmb3IgdGhlIEl0ZW0gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWA6IFVuYWJsZSB0byBleHRyYWN0IHRyYW5zYWN0aW9ucyBmb3IgdGhlIEl0ZW0gYElURU1fVU5BUFBST1ZFRGA6IFVzZXIgZXhpdGVkIGZsb3cgYmVmb3JlIGdpdmluZyBwZXJtaXNzaW9uIHRvIHNoYXJlIGRhdGEgZm9yIHRoZSBJdGVtIGBSRVBPUlRfREVMRVRFRGA6IFJlcG9ydCBkZWxldGVkIGR1ZSB0byBjdXN0b21lciBvciBjb25zdW1lciByZXF1ZXN0IGBEQVRBX1VOQVZBSUxBQkxFYDogTm8gcmVsZXZhbnQgZGF0YSB3YXMgZm91bmQgZm9yIHRoZSBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRCYW5rSW5jb21lV2FybmluZ0NvZGUge1xuICAgIElkZW50aXR5VW5hdmFpbGFibGUgPSAnSURFTlRJVFlfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRScsXG4gICAgSXRlbVVuYXBwcm92ZWQgPSAnSVRFTV9VTkFQUFJPVkVEJyxcbiAgICBSZXBvcnREZWxldGVkID0gJ1JFUE9SVF9ERUxFVEVEJyxcbiAgICBEYXRhVW5hdmFpbGFibGUgPSAnREFUQV9VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBUaGUgd2FybmluZyB0eXBlIHdoaWNoIHdpbGwgYWx3YXlzIGJlIGBCQU5LX0lOQ09NRV9XQVJOSU5HYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdEJhbmtJbmNvbWVXYXJuaW5nVHlwZSB7XG4gICAgQmFua0luY29tZVdhcm5pbmcgPSAnQkFOS19JTkNPTUVfV0FSTklORydcbn1cblxuLyoqXG4gKiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgc2hvdWxkIGJlIGVuYWJsZWQgZm9yIHByb2FjdGl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGVpciBpbmNvbWUgY2hhbmdlc1xuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmFibGVfd2ViaG9va3M6IGJvb2xlYW47XG59XG4vKipcbiAqIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCB0aGUgb3duZXIgb2YgdGhlIGJhbmsgYWNjb3VudCBmb3IgdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lciB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQgb3duZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcztcbn1cbi8qKlxuICogQWRkcmVzcyBvbiB0aGUgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEFjY291bnRPd25lckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGRhdGEgYWJvdXQgYSB1c2VyXFwncyBiYW5rIGFjY291bnQgcmVsYXRlZCB0byBhbiB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYmFuayBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBiYW5rX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGhlIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGJhbmsgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRBY2NvdW50T3duZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFxuICAgICAqL1xuICAgIG93bmVyOiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQWNjb3VudE93bmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBlcmlvZCBvYmplY3RzLCBjb250YWluaW5nIG1vcmUgZGF0YSBvbiB0aGUgb3ZlcmFsbCBwZXJpb2Qgb2YgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50XG4gICAgICovXG4gICAgcGVyaW9kczogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkIG9mIHRoZSBiYW5rIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIG9uIHRoZSBvdmVyYWxsIHBlcmlvZCBvZiB0aGUgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIG9mIHRoZSBzdGF0ZW1lbnQgcGVyaW9kIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnRQZXJpb2RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnRpbmcgYmFsYW5jZSBvZiB0aGUgYmFuayBhY2NvdW50IGZvciB0aGUgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRCYW5rQWNjb3VudFBlcmlvZFxuICAgICAqL1xuICAgIHN0YXJ0aW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZGluZyBiYWxhbmNlIG9mIHRoZSBiYW5rIGFjY291bnQgZm9yIHRoZSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50UGVyaW9kXG4gICAgICovXG4gICAgZW5kaW5nX2JhbGFuY2U6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHN0YXRlbWVudCB1cGxvYWQgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBiYW5rX3N0YXRlbWVudHM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBkYXRhIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYSB1c2VyLXVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZE9iamVjdCB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb25zIGFwcGVhcmluZyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudF9tZXRhZGF0YTogQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIG9mIHRoZSBkb2N1bWVudCByZWZlcmVuY2VkIGJ5IHRoZSBkb2N1bWVudCBtZXRhZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYmFuayBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHVwbG9hZGVkIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkQmFua0FjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkT2JqZWN0XG4gICAgICovXG4gICAgYmFua19hY2NvdW50czogQXJyYXk8Q3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZEJhbmtBY2NvdW50Pjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZGF0YSBhYm91dCBhIHRyYW5zYWN0aW9uIGFwcGVhcmluZyBvbiBhIHVzZXItdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQSBuZWdhdGl2ZSBhbW91bnQgaW5kaWNhdGVzIHRoYXQgbW9uZXkgbW92ZWQgaW50byB0aGUgYWNjb3VudCAoc3VjaCBhcyBhIHBheWNoZWNrIGJlaW5nIGRlcG9zaXRlZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHdoZW4gdGhlIHRyYW5zYWN0aW9uIHdhcyBtYWRlLCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdyBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNhY3Rpb24gYXMgaXQgYXBwZWFycyBvbiB0aGUgYmFuayBzdGF0ZW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudFVwbG9hZFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZCBvZiB0aGUgYmFuayBhY2NvdW50IHRoYXQgdGhpcyB0cmFuc2FjdGlvbiBvY2N1cnMgaW5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyB3aG9zZSBiYW5rIHN0YXRlbWVudHMgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIGJhbmsgc3RhdGVtZW50cyB1cGxvYWRlZCBpdGVtLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgYWxsIGBpdGVtX2lkYHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdXNlcl90b2tlbmAgd2lsbCByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2Jhbmtfc3RhdGVtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYmFuayBzdGF0ZW1lbnQgdXBsb2FkIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRCYW5rU3RhdGVtZW50VXBsb2FkSXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PENyZWRpdEJhbmtTdGF0ZW1lbnRVcGxvYWRJdGVtPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBjcmVkaXQgY2FyZCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0Q2FyZExpYWJpbGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFyaW91cyBpbnRlcmVzdCByYXRlcyB0aGF0IGFwcGx5IHRvIHRoZSBhY2NvdW50LiBBUFIgaW5mb3JtYXRpb24gaXMgbm90IHByb3ZpZGVkIGJ5IGFsbCBjYXJkIGlzc3VlcnM7IGlmIEFQUiBkYXRhIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgYXJyYXkgd2lsbCBiZSBlbXB0eS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8QVBSPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0Q2FyZExpYWJpbGl0eVxuICAgICAqL1xuICAgIGFwcnM6IEFycmF5PEFQUj47XG4gICAgLyoqXG4gICAgICogdHJ1ZSBpZiBhIHBheW1lbnQgaXMgY3VycmVudGx5IG92ZXJkdWUuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgaXNfb3ZlcmR1ZTogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9zdGF0ZW1lbnRfaXNzdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG93ZWQgYXMgb2YgdGhlIGxhc3Qgc3RhdGVtZW50IGlzc3VlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdENhcmRMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkdWUgZGF0ZSBmb3IgdGhlIG5leHQgcGF5bWVudC4gVGhlIGR1ZSBkYXRlIGlzIGBudWxsYCBpZiBhIHBheW1lbnQgaXMgbm90IGV4cGVjdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXJkTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNb3N0IHJlbGV2YW50IGZvciBjcmVkaXQgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuICBTZWUgdGhlIFtgdGF4b25vbXkgY3N2IGZpbGVgXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvY3JlZGl0LWNhdGVnb3J5LXRheG9ub215LmNzdikgZm9yIGEgZnVsbCBsaXN0IG9mIGNyZWRpdCBjYXRlZ29yaWVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdENhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgdHJhbnNhY3Rpb25cXCdzIGludGVudC4gVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRDYXRlZ29yeVxuICAgICAqL1xuICAgIGRldGFpbGVkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCByZXByZXNlbnRpbmcgbWV0YWRhdGEgcGVydGFpbmluZyB0byB0aGUgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXREb2N1bWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBQQVlTVFVCYDogQSBwYXlzdHViLiAgYEJBTktfU1RBVEVNRU5UYDogQSBiYW5rIHN0YXRlbWVudC4gIGBVU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYFVTX01JTElUQVJZX0VSQVNgOiBBbiBlbGVjdHJvbmljIFJldGlyZW1lbnQgQWNjb3VudCBTdGF0ZW1lbnQgKGVSQVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgVVNfTUlMSVRBUllfTEVTYDogQSBMZWF2ZSBhbmQgRWFybmluZ3MgU3RhdGVtZW50IChMRVMpIGlzc3VlZCBieSB0aGUgVVMgbWlsaXRhcnkuICBgVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBHSUdgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGluY29tZSBpcyByZWxhdGVkIHRvIGdpZyB3b3JrLiBEb2VzIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGEgc3BlY2lmaWMgZG9jdW1lbnQgdHlwZS4gIGBQTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREZgOiBVc2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIFBERiBmb3IgdGhlIHBheXN0dWIgd2FzIGdlbmVyYXRlZCBieSBQbGFpZC4gIGBOT05FYDogVXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIHVuZGVybHlpbmcgZG9jdW1lbnQgZm9yIHRoZSBkYXRhLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNpZ25lZCBVUkwgdG8gcmV0cmlldmUgdGhlIHVuZGVybHlpbmcgZmlsZS4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgZmlsZSB0eXBlIHdpbGwgYWx3YXlzIGJlIFBERiwgYW5kIHRoZSBmaWxlIG1heSBub3QgYmUgYXZhaWxhYmxlLCBpbiB3aGljaCBjYXNlIHRoZSBmaWVsZCB3aWxsIGJlIGBudWxsYC4gSWYgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gZ2VuZXJhdGUgYSBQREYgaWYgdGhlIG9yaWdpbmFsIGlzIG5vdCBhdmFpbGFibGUsIGNvbnRhY3QgeW91ciBBY2NvdW50IE1hbmFnZXIuIFtFeGFtcGxlIGdlbmVyYXRlZCBwYXkgc3R1Yl0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3VtZW50cy9wbGFpZC1nZW5lcmF0ZWQtbW9jay1wYXlzdHViLnBkZikuICBGb3IgRG9jdW1lbnQgSW5jb21lLCB0aGlzIGZpZWxkIHdpbGwgbm90IGJlIGBudWxsYCwgYW5kIHRoZSBmaWxlIHR5cGUgd2lsbCBiZSB0aGUgb3JpZ2luYWwgZmlsZSB0eXBlIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLiBGb3IgbW9yZSBkZXRhaWxzIG9uIGF2YWlsYWJsZSBmaWxlIHR5cGVzLCBzZWUgdGhlIFtEb2N1bWVudCBJbmNvbWVdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2luY29tZS9wYXlyb2xsLWluY29tZSkgZG9jdW1lbnRhdGlvbi4gIFRoaXMgZG93bmxvYWQgVVJMIGNhbiBvbmx5IGJlIHVzZWQgb25jZSBhbmQgZXhwaXJlcyBhZnRlciB0d28gbWludXRlcy4gVG8gZ2VuZXJhdGUgYSBuZXcgZG93bmxvYWQgVVJMLCBjYWxsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgYWdhaW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvd25sb2FkX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgZG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuICBgRE9DVU1FTlRfRVJST1JgOiBUaGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6IFRoZSBkb2N1bWVudCB3YXMgYW4gdW5hY2NlcHRhYmxlIGRvY3VtZW50IHR5cGUgc3VjaCBhcyBhbiBvZmZlciBsZXR0ZXIgb3IgYmFuayBzdGF0ZW1lbnQsIHRoZSBkb2N1bWVudCBpbWFnZSB3YXMgY3JvcHBlZCBvciBibHVycnksIG9yIHRoZSBkb2N1bWVudCB3YXMgY29ycnVwdGVkLiAgYFVOS05PV05gIG9yIGBudWxsYDogQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIElmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5LCBjb250YWN0IHN1cHBvcnQgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBhZ2VzIG9mIHRoZSB1cGxvYWRlZCBkb2N1bWVudCAoaWYgYXZhaWxhYmxlKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXREb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbiB3aHkgYSBmYWlsdXJlIG9jY3VycmVkIGR1cmluZyBkb2N1bWVudCBwcm9jZXNzaW5nIChpZiBhdmFpbGFibGUpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdERvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95ZXJWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBlbXBsb3ltZW50IGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRFbXBsb3ltZW50SXRlbT59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxDcmVkaXRFbXBsb3ltZW50SXRlbT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG9iamVjdCBjb250YWluaW5nIGVtcGxveW1lbnQgaXRlbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRJdGVtXG4gICAgICovXG4gICAgZW1wbG95bWVudHM6IEFycmF5PENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb24+O1xuICAgIC8qKlxuICAgICAqIFRva2VuIHRvIHJlcHJlc2VudCB0aGUgdW5kZXJseWluZyBFbXBsb3ltZW50IGRhdGFcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50SXRlbVxuICAgICAqL1xuICAgIGVtcGxveW1lbnRfcmVwb3J0X3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5pbmcgcHJvb2Ygb2YgZW1wbG95bWVudCBkYXRhIGZvciBhbiBpbmRpdmlkdWFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGVtcGxveW1lbnQgc3RhdHVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhcnQgb2YgZW1wbG95bWVudCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEVuZCBvZiBlbXBsb3ltZW50LCBpZiBhcHBsaWNhYmxlLiBQcm92aWRlZCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVyOiBDcmVkaXRFbXBsb3llclZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRpdGxlIG9mIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGxhdGZvcm1JZHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwbGF0Zm9ybV9pZHM6IENyZWRpdFBsYXRmb3JtSWRzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGVtcGxveW1lbnQgZm9yIHRoZSBpbmRpdmlkdWFsLiBgXFxcIkZVTExfVElNRVxcXCJgOiBBIGZ1bGwtdGltZSBlbXBsb3llZS4gYFxcXCJQQVJUX1RJTUVcXFwiYDogQSBwYXJ0LXRpbWUgZW1wbG95ZWUuIGBcXFwiQ09OVFJBQ1RPUlxcXCJgOiBBbiBlbXBsb3llZSB0eXBpY2FsbHkgaGlyZWQgZXh0ZXJuYWxseSB0aHJvdWdoIGEgY29udHJhY3RpbmcgZ3JvdXAuIGBcXFwiVEVNUE9SQVJZXFxcImA6IEEgdGVtcG9yYXJ5IGVtcGxveWVlLiBgXFxcIk9USEVSXFxcImA6IFRoZSBlbXBsb3llZSB0eXBlIGlzIG5vdCBvbmUgb2YgdGhlIGFib3ZlIGRlZmluZWQgdHlwZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGVtcGxveWVlX3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIGVtcGxveWVlXFwncyBtb3N0IHJlY2VudCBwYXlzdHViIGluIElTTyA4NjAxIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RW1wbG95bWVudFZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGxhc3RfcGF5c3R1Yl9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8Q3JlZGl0QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Fzc2V0RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBBU1NFVF9ERVRBSUw6IEFzc2V0RGV0YWlsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldE93bmVyc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfT1dORVJTOiBBc3NldE93bmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXNzZXRIb2xkZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFxuICAgICAqL1xuICAgIEFTU0VUX0hPTERFUjogQXNzZXRIb2xkZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0XG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05TOiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZhbGlkYXRpb25Tb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRcbiAgICAgKi9cbiAgICBWQUxJREFUSU9OX1NPVVJDRVM6IFZhbGlkYXRpb25Tb3VyY2VzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nLi4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldFRyYW5zYWN0aW9uRGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIEFTU0VUX1RSQU5TQUNUSU9OX0RFVEFJTDogQXNzZXRUcmFuc2FjdGlvbkRldGFpbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgQVNTRVRfVFJBTlNBQ1RJT05fREVTQ1JJUFRJT046IEFycmF5PEFzc2V0VHJhbnNhY3Rpb25EZXNjcmlwdGlvbj47XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjQXNzZXRUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBBU1NFVF9UUkFOU0FDVElPTjogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNBc3NldHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjQXNzZXRzIHtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEZyZWRkaWVNYWNBc3NldD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNBc3NldHNcbiAgICAgKi9cbiAgICBBU1NFVDogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY0Fzc2V0Pjtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjSW5kaXZpZHVhbE5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIEZpcnN0TmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTGFzdE5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWlkZGxlIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwgcmVwcmVzZW50ZWQgYnkgdGhlIHBhcmVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0luZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgTWlkZGxlTmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIG1vcnRnYWdlIGxvYW4gYWdyZWVtZW50IGJldHdlZW4gb25lIG9yIG1vcmUgYm9ycm93ZXJzIGFuZCBhIG1vcnRnYWdlIGxlbmRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNMb2FuSWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNMb2FuXG4gICAgICovXG4gICAgTE9BTl9JREVOVElGSUVSUzogQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVycztcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIGxvYW4uIFRoZSB2YWx1ZSBjYW4gb25seSBiZSBcXFwiU3ViamVjdExvYW5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5cbiAgICAgKi9cbiAgICBMb2FuUm9sZVR5cGU6IHN0cmluZztcbn1cbi8qKlxuICogQ29sbGVjdGlvbiBvZiBjdXJyZW50IGFuZCBwcmV2aW91cyBpZGVudGlmaWVycyBmb3IgdGhpcyBsb2FuLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PExvYW5JZGVudGlmaWVyPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5JZGVudGlmaWVyc1xuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUjogQXJyYXk8TG9hbklkZW50aWZpZXI+O1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgbG9hbnMgdGhhdCBhcmUgcGFydCBvZiBhIHNpbmdsZSBkZWFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjTG9hbnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjTG9hbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY0xvYW5zXG4gICAgICovXG4gICAgTE9BTjogQ3JlZGl0RnJlZGRpZU1hY0xvYW47XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHBhcnRpZXMgdG8gYSBkZWFsLiBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3QgcGFydGljaXBhdGluZyBwYXJ0aWVzLCBzdWNoIGFzIGJvcnJvd2VyIGFuZCBzZWxsZXIgYW5kIHRoZSBpbmRpcmVjdCBwYXJ0aWVzIHN1Y2ggYXMgdGhlIGNyZWRpdCByZXBvcnQgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnRpZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRGcmVkZGllTWFjUGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydGllc1xuICAgICAqL1xuICAgIFBBUlRZOiBBcnJheTxDcmVkaXRGcmVkZGllTWFjUGFydHk+O1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgcGFydHkgdG8gYSB0cmFuc2FjdGlvbi4gSW5jbHVkZWQgZGlyZWN0IHBhcnRpY2lwYW50cyBsaWtlIHRoZSBib3Jyb3dlciBhbmQgc2VsbGVyIGFzIHdlbGwgYXMgaW5kaXJlY3QgcGFydGljaXBhbnRzIHN1Y2ggYXMgdGhlIGZsb29kIGNlcnRpZmljYXRlIHByb3ZpZGVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBJTkRJVklEVUFMOiBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5XG4gICAgICovXG4gICAgUk9MRVM6IFJvbGVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklkZW50aWZpZXJzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUGFydHlcbiAgICAgKi9cbiAgICBUQVhQQVlFUl9JREVOVElGSUVSUzogVGF4cGF5ZXJJZGVudGlmaWVycztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUGFydHlJbmRpdmlkdWFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5SW5kaXZpZHVhbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1BhcnR5SW5kaXZpZHVhbFxuICAgICAqL1xuICAgIE5BTUU6IENyZWRpdEZyZWRkaWVNYWNJbmRpdmlkdWFsTmFtZTtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgYW4gcmVwb3J0IGlkZW50aWZpZXIgYW5kIGEgcmVwb3J0IG5hbWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvbiB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRpbmdJbmZvcm1hdGlvblxuICAgICAqL1xuICAgIFJlcG9ydERhdGVUaW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy4gVGhlIHZhbHVlIGNhbiBvbmx5IGJlIFxcXCJSZXBvcnRJRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRJZGVudGlmaWVyVHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0aW5nSW5mb3JtYXRpb25QYXJlbnRJZGVudGlmaWVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBSZXBvcnRpbmdJbmZvcm1hdGlvbklkZW50aWZpZXI6IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzaGFyZWQgd2l0aCBhIHRoaXJkIHBhcnR5IGF1ZGl0b3IgdG8gYWxsb3cgdGhlbSB0byBvYnRhaW4gYWNjZXNzIHRvIHRoZSBBc3NldCBSZXBvcnQuIFRoaXMgdG9rZW4gc2hvdWxkIGJlIHN0b3JlZCBzZWN1cmVseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdWRpdF9jb3B5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L2ZyZWRkaWVfbWFjL3JlcG9ydHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWx9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBERUFMOiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldHNEZWFsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBWZXJpZmljYXRpb24gT2YgQXNzZXRzIChWT0EpIHNjaGVtYSB2ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBTY2hlbWFWZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjU2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjU2VydmljZVxuICAgICAqL1xuICAgIFZFUklGSUNBVElPTl9PRl9BU1NFVDogQXJyYXk8Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdGF0dXNlc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VcbiAgICAgKi9cbiAgICBTVEFUVVNFUzogU3RhdHVzZXM7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVzY3JpYmUgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyBmb3Igc2VydmljZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdEZyZWRkaWVNYWNTZXJ2aWNlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjU2VydmljZXNcbiAgICAgKi9cbiAgICBTRVJWSUNFOiBDcmVkaXRGcmVkZGllTWFjU2VydmljZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFJFUE9SVElOR19JTkZPUk1BVElPTjogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydGluZ0luZm9ybWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFxuICAgICAqL1xuICAgIFNFUlZJQ0VfUFJPRFVDVF9GVUxGSUxMTUVOVDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVRfUkVTUE9OU0U6IENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2U7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjQXNzZXRzfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRGcmVkZGllTWFjVmVyaWZpY2F0aW9uT2ZBc3NldFJlc3BvbnNlXG4gICAgICovXG4gICAgQVNTRVRTOiBDcmVkaXRGcmVkZGllTWFjQXNzZXRzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIHNjaGVtYS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjTG9hbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBMT0FOUzogQ3JlZGl0RnJlZGRpZU1hY0xvYW5zO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjUGFydGllc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0RnJlZGRpZU1hY1ZlcmlmaWNhdGlvbk9mQXNzZXRzRGVhbFxuICAgICAqL1xuICAgIFBBUlRJRVM6IENyZWRpdEZyZWRkaWVNYWNQYXJ0aWVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGcmVkZGllTWFjU2VydmljZXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdEZyZWRkaWVNYWNWZXJpZmljYXRpb25PZkFzc2V0c0RlYWxcbiAgICAgKi9cbiAgICBTRVJWSUNFUzogQ3JlZGl0RnJlZGRpZU1hY1NlcnZpY2VzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGVuZCB1c2VyXFwncyBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheVN0dWIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRGVkdWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGRlZHVjdGlvbnM6IENyZWRpdFBheVN0dWJEZWR1Y3Rpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0RG9jdW1lbnRNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YlxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhOiBDcmVkaXREb2N1bWVudE1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRWFybmluZ3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBlYXJuaW5nczogQ3JlZGl0UGF5U3R1YkVhcm5pbmdzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llZTogQ3JlZGl0UGF5U3R1YkVtcGxveWVlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llcjogQ3JlZGl0UGF5U3R1YkVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViTmV0UGF5fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViXG4gICAgICovXG4gICAgbmV0X3BheTogQ3JlZGl0UGF5U3R1Yk5ldFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YlBheVBlcmlvZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2RldGFpbHM6IFBheVN0dWJQYXlQZXJpb2REZXRhaWxzO1xufVxuLyoqXG4gKiBBZGRyZXNzIG9uIHRoZSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIHRoZSBkZWR1Y3Rpb24gaW5mb3JtYXRpb24gZm91bmQgb24gYSBwYXkgc3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRGVkdWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnNcbiAgICAgKi9cbiAgICBicmVha2Rvd246IEFycmF5PFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5U3R1YkRlZHVjdGlvbnNUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkRlZHVjdGlvbnNcbiAgICAgKi9cbiAgICB0b3RhbDogUGF5U3R1YkRlZHVjdGlvbnNUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIGEgYnJlYWtkb3duIG9mIGVhcm5pbmdzIG9uIGEgcGF5IHN0dWIgYW5kIHRoZSB0b3RhbCBlYXJuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBBcnJheTxQYXlTdHViRWFybmluZ3NCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViRWFybmluZ3NUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVhcm5pbmdzXG4gICAgICovXG4gICAgdG90YWw6IFBheVN0dWJFYXJuaW5nc1RvdGFsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5U3R1YkVtcGxveWVlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IENyZWRpdFBheVN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1hcml0YWwgc3RhdHVzIG9mIHRoZSBlbXBsb3llZSAtIGVpdGhlciBgU0lOR0xFYCBvciBgTUFSUklFRGAgb3IgYE5PVCBMSVNURURgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJFbXBsb3llZVxuICAgICAqL1xuICAgIG1hcml0YWxfc3RhdHVzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlTdHViVGF4cGF5ZXJJRH1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVlXG4gICAgICovXG4gICAgdGF4cGF5ZXJfaWQ6IFBheVN0dWJUYXhwYXllcklEO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW1wbG95ZXIgb24gdGhlIHBheSBzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzczogQ3JlZGl0UGF5U3R1YkFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVyIG9uIHRoZSBwYXkgc3R1Yi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXQgcGF5IGFtb3VudCBvbiB0aGUgcGF5IHN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheVN0dWJOZXRQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlTdHViTmV0UGF5IHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBuZXQgcGF5IGZvciB0aGUgcGF5IHBlcmlvZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIG5ldCBwYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheVN0dWJOZXRQYXlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5U3R1Yk5ldFBheVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgbmV0IHBheS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlTdHViTmV0UGF5XG4gICAgICovXG4gICAgeXRkX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGV4cGxpY2l0IHBheSBiYXNpcyBvbiB0aGUgcGF5c3R1YiAoaWYgcHJlc2VudCkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBDcmVkaXRQYXlTdHViUGF5QmFzaXNUeXBlIHtcbiAgICBTYWxhcnkgPSAnU0FMQVJZJyxcbiAgICBIb3VybHkgPSAnSE9VUkxZJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nXG59XG5cbi8qKlxuICogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIHJlcXVlc3Qgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIHdob3NlIHBheXJvbGwgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIGl0ZW0uIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCBhbGwgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB1c2VyX3Rva2VuYCB3aWxsIHJldHVybmVkIGluIHRoZSByZXNwb25zZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaXRlbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBib2R5IGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaXRlbXMuXG4gICAgICogQHR5cGUge0FycmF5PFBheXJvbGxJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PFBheXJvbGxJdGVtPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2RvY3VtZW50cy91cGRhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIGFuYWx5c2lzIHRvIGVuYWJsZSBmb3IgdGhlIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGFyc2luZ19jb25maWc6IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+O1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvZG9jdW1lbnRzL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byBJdGVtcyBiZWxvbmdpbmcgdG8gdGhlIHVzZXIgd2hvc2UgZWxpZ2liaWxpdHkgaXMgYmVpbmcgY2hlY2tlZC4gTm90ZSB0aGF0IGlmIHRoZSBJdGVtcyBzcGVjaWZpZWQgaGVyZSBhcmUgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgcHJvdmlkaW5nIHRoZW0gaW4gdGhpcyBmaWVsZCB3aWxsIGNhdXNlIHRoZXNlIEl0ZW1zIHRvIGJlIGluaXRpYWxpemVkIHdpdGggKGFuZCBiaWxsZWQgZm9yKSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIGVtcGxveWVyPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNfbWlsaXRhcnlfaW5mbz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBwYXlyb2xsX2luc3RpdHV0aW9uPzogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24gfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2V9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlkZW5jZTogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVxdWVzdCBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyB0byBiZSByZWZyZXNoZWQuIEVhY2ggYGl0ZW1faWRgIHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSBhIHBheXJvbGwgaW5jb21lIGl0ZW0uIElmIHRoaXMgZmllbGQgaXMgbm90IHByb3ZpZGVkLCBhbGwgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB1c2VyX3Rva2VuYCB3aWxsIGJlIHJlZnJlc2hlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGl0ZW1faWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHdoZXJlIFBsYWlkIHdpbGwgc2VuZCB0aGUgcGF5cm9sbCBpbmNvbWUgcmVmcmVzaCB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gcmVmcmVzaCBzdGF0dXMuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJVU0VSX1BSRVNFTkNFX1JFUVVJUkVEXFxcImAgVXNlciBwcmVzZW5jZSBpcyByZXF1aXJlZCB0byByZWZyZXNoIGFuIGluY29tZSB2ZXJpZmljYXRpb24uIGBcXFwiU1VDQ0VTU0ZVTFxcXCJgIFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggd2FzIHN1Y2Nlc3NmdWwuIGBcXFwiTk9UX0ZPVU5EXFxcImAgTm8gbmV3IGRhdGEgd2FzIGZvdW5kIGFmdGVyIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHJlZnJlc2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9yZWZyZXNoX3N0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBwYXlyb2xsIGl0ZW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXlyb2xsUmlza1NpZ25hbHNJdGVtPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8UGF5cm9sbFJpc2tTaWduYWxzSXRlbT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvYmplY3QgY29udGFpbmluZyBhIHNldCBvZiBpZHMgcmVsYXRlZCB0byBhbiBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UGxhdGZvcm1JZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRQbGF0Zm9ybUlkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgZW1wbG95ZWVfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIHBheXJvbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwYXlyb2xsX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFBsYXRmb3JtSWRzXG4gICAgICovXG4gICAgcG9zaXRpb25faWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiByZXBvcnQgdG9rZW4gc3RyaW5ncywgd2l0aCBhdCBtb3N0IG9uZSB0b2tlbiBvZiBlYWNoIHJlcG9ydCB0eXBlLiBDdXJyZW50bHkgb25seSBBc3NldCBSZXBvcnQgdG9rZW4gaXMgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdG9rZW5zOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2Vjb25kYXJ5X2NsaWVudF9pZGAgaXMgdGhlIGNsaWVudCBpZCBvZiB0aGUgdGhpcmQgcGFydHkgd2l0aCB3aG9tIHlvdSB3b3VsZCBsaWtlIHRvIHNoYXJlIHRoZSByZWxheSB0b2tlbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNvbmRhcnlfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVJMIHRvIHdoaWNoIFBsYWlkIHdpbGwgc2VuZCB3ZWJob29rcyB3aGVuIHRoZSBTZWNvbmRhcnkgQ2xpZW50IHN1Y2Nlc3NmdWxseSByZXRyaWV2ZXMgYW4gQXNzZXQgUmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgc2hhcmVkIHdpdGggYSB0aGlyZCBwYXJ0eSB0byBhbGxvdyB0aGVtIHRvIGFjY2VzcyB0aGUgQXNzZXQgUmVwb3J0LiBUaGlzIHRva2VuIHNob3VsZCBiZSBzdG9yZWQgc2VjdXJlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgZ3JhbnRpbmcgYWNjZXNzIHRvIHRoZSByZXBvcnQgeW91IHdvdWxkIGxpa2UgdG8gZ2V0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlcG9ydFR5cGV9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHJlcG9ydF90eXBlOiBSZXBvcnRUeXBlO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB5b3Ugd291bGQgbGlrZSB0byByZXRyaWV2ZSB0aGUgQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGBmYWxzZWAgb3RoZXJ3aXNlLiBUaGlzIGZpZWxkIGRlZmF1bHRzIHRvIGBmYWxzZWAgaWYgb21pdHRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5jbHVkZV9pbnNpZ2h0cz86IGJvb2xlYW47XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcmVsYXlfdG9rZW5gIGdyYW50aW5nIGFjY2VzcyB0byB0aGUgcmVwb3J0IHlvdSB3b3VsZCBsaWtlIHRvIGdldC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXBvcnRfdHlwZTogUmVwb3J0VHlwZTtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHJlbGF5X3Rva2VuYCBncmFudGluZyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCB5b3Ugd291bGQgbGlrZSB0byByZWZyZXNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxheV90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZXBvcnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwb3J0X3R5cGU6IFJlcG9ydFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCByZWdpc3RlcmVkIHRvIHJlY2VpdmUgd2ViaG9va3Mgd2hlbiB0aGUgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW4gaGFzIGJlZW4gcmVmcmVzaGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgYW4gQXNzZXQgUmVwb3J0LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhpcyBJRCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2V0X3JlcG9ydF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9jcmVkaXQvcmVsYXkvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWxheV90b2tlbmAgeW91IHdvdWxkIGxpa2UgdG8gcmV2b2tlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlbGF5X3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2NyZWRpdC9yZWxheS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRSZWxheVJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIHJlbGF5IHRva2VuIHdhcyBzdWNjZXNzZnVsbHkgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFJlbGF5UmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFuZCByZXN1bHRzIGZvciBhIExpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTGluayBzZXNzaW9uLiBUaGlzIGlkZW50aWZpZXIgbWF0Y2hlcyB0aGUgYGxpbmtfc2Vzc2lvbl9pZGAgcmV0dXJuZWQgaW4gdGhlIG9uU3VjY2Vzcy9vbkV4aXQgY2FsbGJhY2tzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25cbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWUgd2hlbiB0aGUgTGluayBzZXNzaW9uIHN0YXJ0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgc2Vzc2lvbl9zdGFydF90aW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRTZXNzaW9uUmVzdWx0c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblxuICAgICAqL1xuICAgIHJlc3VsdHM/OiBDcmVkaXRTZXNzaW9uUmVzdWx0cztcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIGVycm9ycyB0aGF0IG9jY3VycmVkIGR1cmluZyB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uRXJyb3I+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uXG4gICAgICovXG4gICAgZXJyb3JzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkVycm9yPjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzPzogQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEJhbmsgRW1wbG95bWVudCBMaW5rIHNlc3Npb24uICBgQVBQUk9WRURgOiBVc2VyIGhhcyBhcHByb3ZlZCBhbmQgdmVyaWZpZWQgdGhlaXIgZW1wbG95bWVudC4gIGBOT19FTVBMT1lNRU5UU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGVtcGxveW1lbnQgaW4gdGhlIGNvbm5lY3RlZCBhY2NvdW50LiAgYEVNUExPWUVSX05PVF9MSVNURURgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZGlkIG5vdCBzZWUgdGhlaXIgY3VycmVudCBvciBwcmV2aW91cyBlbXBsb3llciBpbiB0aGUgbGlzdCBvZiBlbXBsb3llciBuYW1lcyBmb3VuZC4gIGBTVEFSVEVEYDogVGhlIHVzZXIgYmVnYW4gdGhlIGJhbmsgaW5jb21lIHBvcnRpb24gb2YgdGhlIGxpbmsgZmxvdy4gIGBJTlRFUk5BTF9FUlJPUmA6IFRoZSB1c2VyIGVuY291bnRlcmVkIGFuIGludGVybmFsIGVycm9yLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9FbXBsb3llcnNGb3VuZCA9ICdOT19FTVBMT1lFUlNfRk9VTkQnLFxuICAgIEVtcGxveWVyTm90TGlzdGVkID0gJ0VNUExPWUVSX05PVF9MSVNURUQnXG59XG5cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgc3RhdHVzPzogQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIEJhbmsgSW5jb21lIExpbmsgc2Vzc2lvbi4gIGBBUFBST1ZFRGA6IFVzZXIgaGFzIGFwcHJvdmVkIGFuZCB2ZXJpZmllZCB0aGVpciBpbmNvbWUgIGBOT19ERVBPU0lUU19GT1VORGA6IFdlIGF0dGVtcHRlZCwgYnV0IHdlcmUgdW5hYmxlIHRvIGZpbmQgYW55IGluY29tZSBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgVVNFUl9SRVBPUlRFRF9OT19JTkNPTUVgOiBUaGUgdXNlciBleHBsaWNpdGx5IGluZGljYXRlZCB0aGF0IHRoZXkgZG9uXFwndCByZWNlaXZlIGluY29tZSBpbiB0aGUgY29ubmVjdGVkIGFjY291bnQuICBgU1RBUlRFRGA6IFRoZSB1c2VyIGJlZ2FuIHRoZSBiYW5rIGluY29tZSBwb3J0aW9uIG9mIHRoZSBsaW5rIGZsb3cuICBgSU5URVJOQUxfRVJST1JgOiBUaGUgdXNlciBlbmNvdW50ZXJlZCBhbiBpbnRlcm5hbCBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIENyZWRpdFNlc3Npb25CYW5rSW5jb21lU3RhdHVzIHtcbiAgICBBcHByb3ZlZCA9ICdBUFBST1ZFRCcsXG4gICAgTm9EZXBvc2l0c0ZvdW5kID0gJ05PX0RFUE9TSVRTX0ZPVU5EJyxcbiAgICBVc2VyUmVwb3J0ZWROb0luY29tZSA9ICdVU0VSX1JFUE9SVEVEX05PX0lOQ09NRSdcbn1cblxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uRG9jdW1lbnRJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3BheXN0dWJzX3VwbG9hZGVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB3MnMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3cyc191cGxvYWRlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdFxuICAgICAqL1xuICAgIG51bV9iYW5rX3N0YXRlbWVudHNfdXBsb2FkZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIDEwOTlzIHVwbG9hZGVkIGJ5IHRoZSB1c2VyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtXzEwOTlzX3VwbG9hZGVkOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgTGluayBlcnJvci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbkVycm9yIHtcbiAgICAvKipcbiAgICAgKiBBIGJyb2FkIGNhdGVnb3JpemF0aW9uIG9mIHRoZSBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkVycm9yXG4gICAgICovXG4gICAgZXJyb3JfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdXNlci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gYG51bGxgIGlmIHRoZSBlcnJvciBpcyBub3QgcmVsYXRlZCB0byB1c2VyIGFjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uRXJyb3JcbiAgICAgKi9cbiAgICBkaXNwbGF5X21lc3NhZ2U/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhbiBJdGVtIGFkZCBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBDcmVkaXRTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBSZXR1cm5lZCBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxpbmtlZCB0aGVpciBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbiBpbiBMaW5rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgcGF5c3R1YnMgcmV0cmlldmVkIGZyb20gYSBwYXlyb2xsIHByb3ZpZGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgbnVtX3BheXN0dWJzX3JldHJpZXZlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHcycyByZXRyaWV2ZWQgZnJvbSBhIHBheXJvbGwgcHJvdmlkZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fdzJzX3JldHJpZXZlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEluc3RpdHV0aW9uIE5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNldCBvZiByZXN1bHRzIGZvciBhIExpbmsgc2Vzc2lvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRTZXNzaW9uUmVzdWx0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBJdGVtIGFkZHMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFNlc3Npb25JdGVtQWRkUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBpdGVtX2FkZF9yZXN1bHRzPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbkl0ZW1BZGRSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHQ+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGJhbmtfaW5jb21lX3Jlc3VsdHM/OiBBcnJheTxDcmVkaXRTZXNzaW9uQmFua0luY29tZVJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBiYW5rIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvblJlc3VsdHNcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnRfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb25zIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWVfcmVzdWx0cz86IEFycmF5PENyZWRpdFNlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGRvY3VtZW50X2luY29tZV9yZXN1bHRzPzogQ3JlZGl0U2Vzc2lvbkRvY3VtZW50SW5jb21lUmVzdWx0IHwgbnVsbDtcbn1cbi8qKlxuICogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2NyZWRpdC9zZXNzaW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvY3JlZGl0L3Nlc3Npb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBMaW5rIHNlc3Npb25zIGZvciB0aGUgdXNlci4gU2Vzc2lvbnMgd2lsbCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRTZXNzaW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlc3Npb25zPzogQXJyYXk8Q3JlZGl0U2Vzc2lvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFNlc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3JlZGl0VzJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVkaXRXMiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdERvY3VtZW50TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IENyZWRpdERvY3VtZW50TWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBkb2N1bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRQYXlTdHViRW1wbG95ZXJ9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgZW1wbG95ZXI6IENyZWRpdFBheVN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0UGF5U3R1YkVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGVtcGxveWVlOiBDcmVkaXRQYXlTdHViRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogVGhlIHRheCB5ZWFyIG9mIHRoZSBXMiBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHRheF95ZWFyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSB0aXBzIGFuZCBvdGhlciBjb21wZW5zYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICB3YWdlc190aXBzX290aGVyX2NvbXA6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmVkZXJhbCBpbmNvbWUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBmZWRlcmFsX2luY29tZV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU29jaWFsIHNlY3VyaXR5IHRheCB3aXRoaGVsZCBmb3IgdGhlIHRheCB5ZWFyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3RheF93aXRoaGVsZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIG1lZGljYXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgbWVkaWNhcmVfd2FnZXNfYW5kX3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGlwcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90aXBzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG9jYXRlZCB0aXBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYWxsb2NhdGVkX3RpcHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBib3hfOTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXBlbmRlbnQgY2FyZSBiZW5lZml0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIGRlcGVuZGVudF9jYXJlX2JlbmVmaXRzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5vbnF1YWxpZmllZCBwbGFucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIG5vbnF1YWxpZmllZF9wbGFuczogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgYm94XzEyOiBBcnJheTxXMkJveDEyPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBzdGF0dXRvcnlfZW1wbG95ZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgcmV0aXJlbWVudF9wbGFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIENyZWRpdFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgQ3JlZGl0VzJcbiAgICAgKi9cbiAgICBvdGhlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+fVxuICAgICAqIEBtZW1iZXJvZiBDcmVkaXRXMlxuICAgICAqL1xuICAgIHN0YXRlX2FuZF9sb2NhbF93YWdlczogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBUaGUgb2JqZWN0IGNvbnRhaW5zIGEgcmlzayBzY29yZSBhbmQgYSByaXNrIHRpZXIgdGhhdCBldmFsdWF0ZSB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgb2YgYW4gdW5hdXRob3JpemVkIGRlYml0LiBDb21tb24gcmV0dXJuIGNvZGVzIGluIHRoaXMgY2F0ZWdvcnkgaW5jbHVkZTogXFxcIlIwNVxcXCIsIFxcXCJSMDdcXFwiLCBcXFwiUjEwXFxcIiwgXFxcIlIxMVxcXCIsIFxcXCJSMjlcXFwiLiBUaGVzZSByZXR1cm5zIHR5cGljYWxseSBoYXZlIGEgcmV0dXJuIHRpbWUgZnJhbWUgb2YgdXAgdG8gNjAgY2FsZW5kYXIgZGF5cy4gRHVyaW5nIHRoaXMgcGVyaW9kLCB0aGUgY3VzdG9tZXIgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjYW4gZGlzcHV0ZSBhIHRyYW5zYWN0aW9uIGFzIHVuYXV0aG9yaXplZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrIHtcbiAgICAvKipcbiAgICAgKiBBIHNjb3JlIGZyb20gMS05OSB0aGF0IGluZGljYXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2s6IGEgaGlnaGVyIHJpc2sgc2NvcmUgc3VnZ2VzdHMgYSBoaWdoZXIgcmV0dXJuIGxpa2VsaWhvb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgc2NvcmU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHRpZXIgY29ycmVzcG9uZGluZyB0byB0aGUgcHJvamVjdGVkIGxpa2VsaWhvb2QgdGhhdCB0aGUgdHJhbnNhY3Rpb24sIGlmIGluaXRpYXRlZCwgd2lsbCBiZSBzdWJqZWN0IHRvIGEgcmV0dXJuLiAgSW4gdGhlIGBjdXN0b21lcl9pbml0aWF0ZWRfcmV0dXJuX3Jpc2tgIG9iamVjdCwgdGhlcmUgYXJlIGZpdmUgcmlzayB0aWVycyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29yZXM6ICAgMTogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAwJSAtIDAuMDIlICAgMjogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjAyJSAtIDAuMDUlICAgMzogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgYmV0d2VlbiAwLjA1JSAtIDAuMSUgICA0OiBQcmVkaWN0ZWQgY3VzdG9tZXItaW5pdGlhdGVkIHJldHVybiBpbmNpZGVuY2UgcmF0ZSBiZXR3ZWVuIDAuMSUgLSAwLjUlICAgNTogUHJlZGljdGVkIGN1c3RvbWVyLWluaXRpYXRlZCByZXR1cm4gaW5jaWRlbmNlIHJhdGUgZ3JlYXRlciB0aGFuIDAuNSUgXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrXG4gICAgICovXG4gICAgcmlza190aWVyOiBudW1iZXI7XG59XG4vKipcbiAqIEFjY291bnQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGEgdGVhbSBtZW1iZXIgd2l0aCBhY2Nlc3MgdG8gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGFzaGJvYXJkVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXIge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkX2F0OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlclxuICAgICAqL1xuICAgIHN0YXR1czogRGFzaGJvYXJkVXNlclN0YXR1cztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYSBkYXNoYm9hcmQgdXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGFzaGJvYXJkX3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYSB0ZWFtIG1lbWJlciB3aXRoIGFjY2VzcyB0byB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGFzaGJvYXJkVXNlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBEYXNoYm9hcmRVc2VyU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgZGFzaGJvYXJkIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZGFzaGJvYXJkIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGRhc2hib2FyZCB1c2Vyc1xuICAgICAqIEB0eXBlIHtBcnJheTxEYXNoYm9hcmRVc2VyPn1cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGRhc2hib2FyZF91c2VyczogQXJyYXk8RGFzaGJvYXJkVXNlcj47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGFzaGJvYXJkVXNlckxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRGFzaGJvYXJkVXNlclN0YXR1cyB7XG4gICAgSW52aXRlZCA9ICdpbnZpdGVkJyxcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBEZWFjdGl2YXRlZCA9ICdkZWFjdGl2YXRlZCdcbn1cblxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBzb3VyY2Ugb2YgZGF0YSBmb3IgYSBnaXZlbiBwcm9kdWN0L2RhdGEgdHlwZS4gIGBJTlNUSVRVVElPTmA6IFRoZSBpbnN0aXR1dGlvbiBzdXBwb3J0cyB0aGlzIHByb2R1Y3QsIGFuZCB0aGUgZGF0YSB3YXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBgSU5TVElUVVRJT05fTUFTS2A6IFRoZSB1c2VyIG1hbnVhbGx5IHByb3ZpZGVkIHRoZSBmdWxsIGFjY291bnQgbnVtYmVyLCB3aGljaCB3YXMgbWF0Y2hlZCB0byB0aGUgYWNjb3VudCBtYXNrIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gT25seSBhcHBsaWNhYmxlIHRvIHRoZSBgbnVtYmVyc2AgZGF0YSB0eXBlLiBgVVNFUmA6IFRoZSBpbnN0aXR1dGlvbiBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgcHJvZHVjdCwgYW5kIHRoZSBkYXRhIHdhcyBtYW51YWxseSBwcm92aWRlZCBieSB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERhdGFTb3VyY2VzIHtcbiAgICBJbnN0aXR1dGlvbiA9ICdJTlNUSVRVVElPTicsXG4gICAgSW5zdGl0dXRpb25NYXNrID0gJ0lOU1RJVFVUSU9OX01BU0snLFxuICAgIFVzZXIgPSAnVVNFUidcbn1cblxuLyoqXG4gKiBBIGRhdGUgcmFuZ2Ugd2l0aCBhIHN0YXJ0IGFuZCBlbmQgZGF0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEYXRlUmFuZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRlUmFuZ2Uge1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEYXRlUmFuZ2VcbiAgICAgKi9cbiAgICBiZWdpbm5pbmc6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGF0ZVJhbmdlXG4gICAgICovXG4gICAgZW5kaW5nOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIHRoZSBkZWR1Y3Rpb24gaW5mb3JtYXRpb24gZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVkdWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3VidG90YWxzPzogQXJyYXk8VG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZWR1Y3Rpb25zQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIGJyZWFrZG93bjogQXJyYXk8RGVkdWN0aW9uc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWxzPzogQXJyYXk8VG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZWR1Y3Rpb25zVG90YWx9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNcbiAgICAgKi9cbiAgICB0b3RhbDogRGVkdWN0aW9uc1RvdGFsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVkdWN0aW9uc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlZHVjdGlvbnNCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkZWR1Y3Rpb25zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZWR1Y3Rpb25zVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWR1Y3Rpb25zVG90YWwge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgdG90YWwgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25zXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gbmV3IHRyYW5zYWN0aW9uIGRhdGEgaXMgYXZhaWxhYmxlIGZvciBhbiBJdGVtLiBQbGFpZCB3aWxsIHR5cGljYWxseSBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBkZXRlY3RlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSB0aGUgd2ViaG9vayByZWxhdGVzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIERlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIFRoZSB1c2VyXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIChEZXByZWNhdGVkKSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC9hbHQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnR9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudDogRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdGFyZ2V0X3VzZXI6IERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIChEZXByZWNhdGVkKSBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2FsdC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIElEIGlzIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY2Nlc3MgdG9rZW4gZm9yIHRoZSB0YXJnZXQgSXRlbSwgdHlwaWNhbGx5IHByb3ZpZGVkIGluIHRoZSBJbXBvcnQgSXRlbSByZXNwb25zZS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWQgQWNjb3VudCBJRCB0aGF0IHNwZWNpZmllcyB0aGUgdGFyZ2V0IGJhbmsgYWNjb3VudC4gVGhpcyBhY2NvdW50IHdpbGwgYmVjb21lIHRoZSByZWNpcGllbnQgZm9yIGEgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0YXJnZXRfYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGU/OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3B0aW9ucz86IERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdENvdW50cnlDb2RlRW51bSB7XG4gICAgVXMgPSAnVVMnLFxuICAgIENhID0gJ0NBJ1xufVxuXG4vKipcbiAqIChEZXByZWNhdGVkKSBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCBjYW5ub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIHdoZW4gdGhlIHN0YXR1cyBvZiBhIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QgaGFzIGNoYW5nZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byB0cmFuc2FjdGlvbiBpdGVtcyB0byB1c2Ugd2hlbiBhdHRlbXB0aW5nIHRvIG1hdGNoIHRoZSB1c2VyIHRvIHRoZWlyIFBheXJvbGwgUHJvdmlkZXIuIFRoZXNlIHRva2VucyBtdXN0IGJlIGNyZWF0ZWQgYnkgdGhlIHNhbWUgY2xpZW50IGlkIGFzIHRoZSBvbmUgY3JlYXRpbmcgdGhlIHN3aXRjaCwgYW5kIGhhdmUgYWNjZXNzIHRvIHRoZSB0cmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faXRlbV9hY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyBJRCBpcyBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2RlcG9zaXRfc3dpdGNoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGJhbmsgYWNjb3VudCB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSXRlbSB0aGUgZGlyZWN0IGRlcG9zaXQgd2FzIHN3aXRjaGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRhcmdldF9pdGVtX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqICBUaGUgc3RhdGUsIG9yIHN0YXR1cywgb2YgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5pdGlhbGl6ZWRgIOKAkyBUaGUgZGVwb3NpdCBzd2l0Y2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdXNlciBlbnRlcmluZyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgLSBgcHJvY2Vzc2luZ2Ag4oCTIFRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBiZWVuIHN1Ym1pdHRlZCBhbmQgaXMgYmVpbmcgcHJvY2Vzc2VkLiAgLSBgY29tcGxldGVkYCDigJMgVGhlIHVzZXJcXCdzIGVtcGxveWVyIGhhcyBmdWxmaWxsZWQgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICAtIGBlcnJvcmAg4oCTIFRoZXJlIHdhcyBhbiBlcnJvciBwcm9jZXNzaW5nIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXRlOiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW07XG4gICAgLyoqXG4gICAgICogVGhlIG1ldGhvZCB1c2VkIHRvIG1ha2UgdGhlIGRlcG9zaXQgc3dpdGNoLiAgLSBgaW5zdGFudGAg4oCTIFVzZXIgaW5zdGFudGx5IHN3aXRjaGVkIHRoZWlyIGRpcmVjdCBkZXBvc2l0IHRvIGEgbmV3IG9yIGV4aXN0aW5nIGJhbmsgYWNjb3VudCBieSBjb25uZWN0aW5nIHRoZWlyIHBheXJvbGwgb3IgZW1wbG95ZXIgYWNjb3VudC4gIC0gYG1haWxgIOKAkyBVc2VyIHJlcXVlc3RlZCB0aGF0IFBsYWlkIGNvbnRhY3QgdGhlaXIgZW1wbG95ZXIgYnkgbWFpbCB0byBtYWtlIHRoZSBkaXJlY3QgZGVwb3NpdCBzd2l0Y2guICAtIGBwZGZgIOKAkyBVc2VyIGdlbmVyYXRlZCBhIFBERiBvciBlbWFpbCB0byBiZSBzZW50IHRvIHRoZWlyIGVtcGxveWVyIHdpdGggdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBkZXBvc2l0IHN3aXRjaC5cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2l0Y2hfbWV0aG9kPzogRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlU3dpdGNoTWV0aG9kRW51bTtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgZ29lcyB0byBtdWx0aXBsZSBiYW5rcy4gV2hlbiBmYWxzZSwgdXNlcuKAmXMgZGlyZWN0IGRlcG9zaXQgb25seSBnb2VzIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9oYXNfbXVsdGlwbGVfYWxsb2NhdGlvbnM6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdGFyZ2V0IGFjY291bnQgaXMgYWxsb2NhdGVkIHRoZSByZW1haW5kZXIgb2YgZGlyZWN0IGRlcG9zaXQgYWZ0ZXIgYWxsIG90aGVyIGFsbG9jYXRpb25zIGhhdmUgYmVlbiBkZWR1Y3RlZC4gV2hlbiBgZmFsc2VgLCB1c2Vy4oCZcyBkaXJlY3QgZGVwb3NpdCBpcyBhbGxvY2F0ZWQgYXMgYSBwZXJjZW50IG9yIGFtb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYWxsb2NhdGVkX3JlbWFpbmRlcjogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhIHBlcmNlbnRhZ2Ugb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQgb3IgaWYgYGlzX2FsbG9jYXRlZF9yZW1haW5kZXJgIGlzIHRydWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyY2VudF9hbGxvY2F0ZWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRvbGxhciBhbW91bnQgb2YgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGVkIHRvIHRoZSB0YXJnZXQgYWNjb3VudC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgdGFyZ2V0IGFjY291bnQgaXMgbm90IGFsbG9jYXRlZCBhbiBhbW91bnQgb3IgaWYgdGhlIGRlcG9zaXQgc3dpdGNoIGhhcyBub3QgYmVlbiBjb21wbGV0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYW1vdW50X2FsbG9jYXRlZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZW1wbG95ZXIgc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGVtcGxveWVyLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gc2VsZWN0ZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGRpZCBub3Qgc2VsZWN0IGFuIGluc3RpdHV0aW9uLCB0aGUgdmFsdWUgcmV0dXJuZWQgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlIHRoZSBkZXBvc2l0IHN3aXRjaCB3YXMgY3JlYXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZGF0ZSB0aGUgZGVwb3NpdCBzd2l0Y2ggd2FzIGNvbXBsZXRlZC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgZGVwb3NpdCBzd2l0Y2ggaGFzIG5vdCBiZWVuIGNvbXBsZXRlZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0ZV9jb21wbGV0ZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTdGF0ZUVudW0ge1xuICAgIEluaXRpYWxpemVkID0gJ2luaXRpYWxpemVkJyxcbiAgICBQcm9jZXNzaW5nID0gJ3Byb2Nlc3NpbmcnLFxuICAgIENvbXBsZXRlZCA9ICdjb21wbGV0ZWQnLFxuICAgIEVycm9yID0gJ2Vycm9yJ1xufVxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoR2V0UmVzcG9uc2VTd2l0Y2hNZXRob2RFbnVtIHtcbiAgICBJbnN0YW50ID0gJ2luc3RhbnQnLFxuICAgIE1haWwgPSAnbWFpbCcsXG4gICAgUGRmID0gJ3BkZicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIChEZXByZWNhdGVkKSBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0IGhhcyBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFxcXCJERVBPU0lUX1NXSVRDSFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgXFxcIlNXSVRDSF9TVEFURV9VUERBVEVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hTdGF0ZVVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogIFRoZSBzdGF0ZSwgb3Igc3RhdHVzLCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2guICBgaW5pdGlhbGl6ZWRgOiBUaGUgZGVwb3NpdCBzd2l0Y2ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgdXNlciBlbnRlcmluZyB0aGUgaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gc3VibWl0IHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgYHByb2Nlc3NpbmdgOiBUaGUgZGVwb3NpdCBzd2l0Y2ggcmVxdWVzdCBoYXMgYmVlbiBzdWJtaXR0ZWQgYW5kIGlzIGJlaW5nIHByb2Nlc3NlZC4gIGBjb21wbGV0ZWRgOiBUaGUgdXNlclxcJ3MgZW1wbG95ZXIgaGFzIGZ1bGZpbGxlZCBhbmQgY29tcGxldGVkIHRoZSBkZXBvc2l0IHN3aXRjaCByZXF1ZXN0LiAgYGVycm9yYDogVGhlcmUgd2FzIGFuIGVycm9yIHByb2Nlc3NpbmcgdGhlIGRlcG9zaXQgc3dpdGNoIHJlcXVlc3QuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZSBbRGVwb3NpdCBTd2l0Y2ggQVBJIHJlZmVyZW5jZV0oL2RvY3MvZGVwb3NpdC1zd2l0Y2gvcmVmZXJlbmNlI2RlcG9zaXRfc3dpdGNoZ2V0KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgc3RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBkZXBvc2l0IHN3aXRjaC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoU3RhdGVVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFN0YXRlVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50PzogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgVGhlIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCBudW1iZXIgZm9yIGRlcG9zaXQgc3dpdGNoIGRlc3RpbmF0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJvdXRpbmcgbnVtYmVyIGZvciBkZXBvc2l0IHN3aXRjaCBkZXN0aW5hdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZGVwb3NpdCBzd2l0Y2ggZGVzdGluYXRpb24gYWNjb3VudCwgYXMgaXQgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyIGluIHRoZSBEZXBvc2l0IFN3aXRjaCBpbnRlcmZhY2UuIEl0IGlzIG5vdCByZXF1aXJlZCB0byBtYXRjaCB0aGUgbmFtZSB1c2VkIGluIG9ubGluZSBiYW5raW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZSBvZiB0aGUgYWNjb3VudCwgZWl0aGVyIGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBEZXBvc2l0U3dpdGNoVGFyZ2V0QWNjb3VudEFjY291bnRTdWJ0eXBlRW51bSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncydcbn1cblxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgVGhlIGRlcG9zaXQgc3dpdGNoIHRhcmdldCB1c2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBnaXZlbiBuYW1lIChmaXJzdCBuYW1lKSBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZmFtaWx5IG5hbWUgKGxhc3QgbmFtZSkgb2YgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwaG9uZSBudW1iZXIgb2YgdGhlIHVzZXIuIFRoZSBlbmRwb2ludCBjYW4gYWNjZXB0IGEgdmFyaWV0eSBvZiBwaG9uZSBudW1iZXIgZm9ybWF0cywgaW5jbHVkaW5nIEUuMTY0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERlcG9zaXRTd2l0Y2hUYXJnZXRVc2VyXG4gICAgICovXG4gICAgcGhvbmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW1haWwgYWRkcmVzcyBvZiB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RlcG9zaXRTd2l0Y2hBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRhcmdldFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBEZXBvc2l0U3dpdGNoQWRkcmVzc0RhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIHRheHBheWVyIElEIG9mIHRoZSB1c2VyLCBnZW5lcmFsbHkgdGhlaXIgU1NOLCBFSU4sIG9yIFRJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVGFyZ2V0VXNlclxuICAgICAqL1xuICAgIHRheF9wYXllcl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvZGVwb3NpdF9zd2l0Y2gvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2hfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogKERlcHJlY2F0ZWQpIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIERlcG9zaXQgc3dpdGNoIHRva2VuLCB1c2VkIHRvIGluaXRpYWxpemUgTGluayBmb3IgdGhlIERlcG9zaXQgU3dpdGNoIHByb2R1Y3RcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRXhwaXJhdGlvbiB0aW1lIG9mIHRoZSB0b2tlbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZXBvc2l0X3N3aXRjaF90b2tlbl9leHBpcmF0aW9uX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGRlcG9zaXRvcnkgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1kZXBvc2l0b3J5KS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERlcG9zaXRvcnlBY2NvdW50U3VidHlwZSB7XG4gICAgQ2hlY2tpbmcgPSAnY2hlY2tpbmcnLFxuICAgIFNhdmluZ3MgPSAnc2F2aW5ncycsXG4gICAgSHNhID0gJ2hzYScsXG4gICAgQ2QgPSAnY2QnLFxuICAgIE1vbmV5TWFya2V0ID0gJ21vbmV5IG1hcmtldCcsXG4gICAgUGF5cGFsID0gJ3BheXBhbCcsXG4gICAgUHJlcGFpZCA9ICdwcmVwYWlkJyxcbiAgICBDYXNoTWFuYWdlbWVudCA9ICdjYXNoIG1hbmFnZW1lbnQnLFxuICAgIEVidCA9ICdlYnQnLFxuICAgIEFsbCA9ICdhbGwnXG59XG5cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGVwb3NpdG9yeUZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIERlcG9zaXRvcnlGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlczogQXJyYXk8RGVwb3NpdG9yeUFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogT3JpZ2luYXRvciBhbmQgdGhlaXIgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRhaWxlZE9yaWdpbmF0b3JcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRhaWxlZE9yaWdpbmF0b3Ige1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3LigJlzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIHRyYW5zZmVyX2RpbGlnZW5jZV9zdGF0dXM6IFRyYW5zZmVyRGlsaWdlbmNlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRhaWxlZE9yaWdpbmF0b3JcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIG91dHN0YW5kaW5nIHJlcXVpcmVtZW50cyBmb3Igc2NhbGVkIHBsYXRmb3JtIG9yaWdpbmF0b3JzLiBPbmx5IHBvcHVsYXRlZCB3aGVuIGB0cmFuc2Zlcl9kaWxpZ2VuY2Vfc3RhdHVzYCBpcyBgbW9yZV9pbmZvcm1hdGlvbl9yZXF1aXJlZGAuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudD59XG4gICAgICogQG1lbWJlcm9mIERldGFpbGVkT3JpZ2luYXRvclxuICAgICAqL1xuICAgIG91dHN0YW5kaW5nX3JlcXVpcmVtZW50cz86IEFycmF5PFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudD47XG59XG4vKipcbiAqIEEgcG9zc2libGUgYWNjb3VudCBkZXRlY3RlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggYSB0cmFuc2FjdGlvbiB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEZXRlY3RlZEFjY291bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXRlY3RlZEFjY291bnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXRlY3RlZCBhY2NvdW50IHR5cGUgKGRlcG9zaXRvcnksIGNyZWRpdCwgbG9hbiwgaW52ZXN0bWVudCBldGMuKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGVjdGVkIHN1YnR5cGUgb2YgdGhlIGFjY291bnQsIGJhc2VkIG9uIHRoZSB0cmFuc2FjdGlvbnMgdG8vZnJvbSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRldGVjdGVkIGFjY291bnQgdHlwZSBhdCB0aGlzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEZXRlY3RlZEFjY291bnRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBvbGRlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFtb3VudCBvZiB0aGUgbW9zdCByZWNlbnQgdHJhbnNhY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXRlY3RlZCBhY2NvdW50IHR5cGUgYXQgdGhpcyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV0ZWN0ZWRBY2NvdW50XG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGV0ZWN0ZWQgYWNjb3VudCB0eXBlIGF0IHRoaXMgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIERldGVjdGVkQWNjb3VudFxuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbn1cbi8qKlxuICogRGV2aWNlIElkIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlIHVzZWQgZHVyaW5nIHRoZSBwcmV2aW91cyBsaW5rIHNlc3Npb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRGV2aWNlSWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXZpY2VJZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGV2aWNlSWRcbiAgICAgKi9cbiAgICB0eXBlPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgZm9yIHRoZSBkZXZpY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEZXZpY2VJZFxuICAgICAqL1xuICAgIGlkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3RyaWJ1dGlvbkJyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGN1cnJlbnRfcGF5PzogUGF5O1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBkb2N1bWVudC4gIGBET0NVTUVOVF9UWVBFX1BBWVNUVUJgOiBBIHBheXN0dWIuICBgRE9DVU1FTlRfVFlQRV9CQU5LX1NUQVRFTUVOVGA6IEEgYmFuayBzdGF0ZW1lbnQuICBgRE9DVU1FTlRfVFlQRV9VU19UQVhfVzJgOiBBIFctMiB3YWdlIGFuZCB0YXggc3RhdGVtZW50IHByb3ZpZGVkIGJ5IGEgVVMgZW1wbG95ZXIgcmVmbGVjdGluZyB3YWdlcyBlYXJuZWQgYnkgdGhlIGVtcGxveWVlLiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfRVJBU2A6IEFuIGVsZWN0cm9uaWMgUmV0aXJlbWVudCBBY2NvdW50IFN0YXRlbWVudCAoZVJBUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0xFU2A6IEEgTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoTEVTKSBpc3N1ZWQgYnkgdGhlIFVTIG1pbGl0YXJ5LiAgYERPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFU2A6IEEgQ2l2aWxpYW4gTGVhdmUgYW5kIEVhcm5pbmdzIFN0YXRlbWVudCAoQ0xFUykgaXNzdWVkIGJ5IHRoZSBVUyBtaWxpdGFyeS4gIGBET0NVTUVOVF9UWVBFX0dJR2A6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgaW5jb21lIGlzIHJlbGF0ZWQgdG8gZ2lnIHdvcmsuIERvZXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYSBzcGVjaWZpYyBkb2N1bWVudCB0eXBlLiAgYERPQ1VNRU5UX1RZUEVfTk9ORWA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBubyB1bmRlcmx5aW5nIGRvY3VtZW50IGZvciB0aGUgZGF0YS4gIGBET0NVTUVOVF9UWVBFX1BMQUlEX0dFTkVSQVRFRF9QQVlTVFVCX1BERmA6IFVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgUERGIGZvciB0aGUgcGF5c3R1YiB3YXMgZ2VuZXJhdGVkIGJ5IFBsYWlkLiAgYFVOS05PV05gOiBEb2N1bWVudCB0eXBlIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jVHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBEb2N1bWVudFR5cGVQYXlzdHViID0gJ0RPQ1VNRU5UX1RZUEVfUEFZU1RVQicsXG4gICAgRG9jdW1lbnRUeXBlQmFua1N0YXRlbWVudCA9ICdET0NVTUVOVF9UWVBFX0JBTktfU1RBVEVNRU5UJyxcbiAgICBEb2N1bWVudFR5cGVVc1RheFcyID0gJ0RPQ1VNRU5UX1RZUEVfVVNfVEFYX1cyJyxcbiAgICBEb2N1bWVudFR5cGVVc01pbGl0YXJ5RXJhcyA9ICdET0NVTUVOVF9UWVBFX1VTX01JTElUQVJZX0VSQVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlMZXMgPSAnRE9DVU1FTlRfVFlQRV9VU19NSUxJVEFSWV9MRVMnLFxuICAgIERvY3VtZW50VHlwZVVzTWlsaXRhcnlDbGVzID0gJ0RPQ1VNRU5UX1RZUEVfVVNfTUlMSVRBUllfQ0xFUycsXG4gICAgRG9jdW1lbnRUeXBlR2lnID0gJ0RPQ1VNRU5UX1RZUEVfR0lHJyxcbiAgICBEb2N1bWVudFR5cGVOb25lID0gJ0RPQ1VNRU5UX1RZUEVfTk9ORScsXG4gICAgRG9jdW1lbnRUeXBlVXNUYXgxMDk5TWlzYyA9ICdET0NVTUVOVF9UWVBFX1VTX1RBWF8xMDk5X01JU0MnLFxuICAgIERvY3VtZW50VHlwZVVzVGF4MTA5OUsgPSAnRE9DVU1FTlRfVFlQRV9VU19UQVhfMTA5OV9LJyxcbiAgICBEb2N1bWVudFR5cGVQbGFpZEdlbmVyYXRlZFBheXN0dWJQZGYgPSAnRE9DVU1FTlRfVFlQRV9QTEFJRF9HRU5FUkFURURfUEFZU1RVQl9QREYnXG59XG5cbi8qKlxuICogSGlnaCBsZXZlbCBkZXNjcmlwdGlvbnMgb2YgaG93IHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50IHdhcyBwcm9jZXNzZWQuIElmIGEgZG9jdW1lbnQgZmFpbHMgdmVyaWZpY2F0aW9uLCB0aGUgZGV0YWlscyBpbiB0aGUgYGFuYWx5c2lzYCBvYmplY3Qgc2hvdWxkIGhlbHAgY2xhcmlmeSB3aHkgdGhlIGRvY3VtZW50IHdhcyByZWplY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGF1dGhlbnRpY2l0eTogRG9jdW1lbnRBdXRoZW50aWNpdHlNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGltYWdlX3F1YWxpdHk6IEltYWdlUXVhbGl0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRBbmFseXNpc1xuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRBbmFseXNpc0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50QW5hbHlzaXNcbiAgICAgKi9cbiAgICBmcmF1ZF9hbmFseXNpc19kZXRhaWxzPzogRnJhdWRBbmFseXNpc0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbWFnZVF1YWxpdHlEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudEFuYWx5c2lzXG4gICAgICovXG4gICAgaW1hZ2VfcXVhbGl0eV9kZXRhaWxzPzogSW1hZ2VRdWFsaXR5RGV0YWlscyB8IG51bGw7XG59XG4vKipcbiAqIEhpZ2ggbGV2ZWwgc3VtbWFyeSBvZiB3aGV0aGVyIHRoZSBkb2N1bWVudCBpbiB0aGUgcHJvdmlkZWQgaW1hZ2UgbWF0Y2hlcyB0aGUgZm9ybWF0dGluZyBydWxlcyBhbmQgc2VjdXJpdHkgY2hlY2tzIGZvciB0aGUgYXNzb2NpYXRlZCBqdXJpc2RpY3Rpb24uICBGb3IgZXhhbXBsZSwgbW9zdCBpZGVudGl0eSBkb2N1bWVudHMgaGF2ZSBmb3JtYXR0aW5nIHJ1bGVzIGxpa2UgdGhlIGZvbGxvd2luZzogICBUaGUgaW1hZ2Ugb2YgdGhlIHBlcnNvblxcJ3MgZmFjZSBtdXN0IGhhdmUgYSBjZXJ0YWluIGNvbnRyYXN0IGluIG9yZGVyIHRvIGhpZ2hsaWdodCBza2luIHRvbmUgICBUaGUgc3ViamVjdCBpbiB0aGUgZG9jdW1lbnRcXCdzIGltYWdlIG11c3QgcmVtb3ZlIGV5ZSBnbGFzc2VzIGFuZCBwb3NlIGluIGEgY2VydGFpbiB3YXkgICBUaGUgaW5mb3JtYXRpb25hbCBmaWVsZHMgKG5hbWUsIGRhdGUgb2YgYmlydGgsIElEIG51bWJlciwgZXRjLikgbXVzdCBiZSBjb2xvcmVkIGFuZCBhbGlnbmVkIGFjY29yZGluZyB0byBzcGVjaWZpYyBydWxlcyAgIFNlY3VyaXR5IGZlYXR1cmVzIGxpa2Ugd2F0ZXJtYXJrcyBhbmQgYmFja2dyb3VuZCBwYXR0ZXJucyBtdXN0IGJlIHByZXNlbnQgIFNvIGEgYG1hdGNoYCBzdGF0dXMgZm9yIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50IGluIHRoZSBwcm92aWRlZCBpbWFnZSBzZWVtcyB0byBjb25mb3JtIHRvIHRoZSB2YXJpb3VzIGZvcm1hdHRpbmcgYW5kIHNlY3VyaXR5IHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV0ZWN0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBEb2N1bWVudEF1dGhlbnRpY2l0eU1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBIG1hdGNoIHN1bW1hcnkgZGVzY3JpYmluZyB0aGUgY3Jvc3MgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzdWJqZWN0XFwncyBkYXRlIG9mIGJpcnRoLCBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQgaW1hZ2UsIGFuZCB0aGUgZGF0ZSBvZiBiaXJ0aCB0aGV5IHNlcGFyYXRlbHkgcHJvdmlkZWQgdG8gdGhlIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIGZyb20gdGhlIGVuZCB1c2VyXFwncyB1cGxvYWRlZCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc2luZyBzdGF0dXMgb2YgdGhlIGRvY3VtZW50LiAgYFBST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgZG9jdW1lbnQgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQuICBgRE9DVU1FTlRfRVJST1JgOiBUaGUgZG9jdW1lbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC4gUG9zc2libGUgY2F1c2VzIGluY2x1ZGU6IFRoZSBkb2N1bWVudCB3YXMgYW4gdW5hY2NlcHRhYmxlIGRvY3VtZW50IHR5cGUgc3VjaCBhcyBhbiBvZmZlciBsZXR0ZXIgb3IgYmFuayBzdGF0ZW1lbnQsIHRoZSBkb2N1bWVudCBpbWFnZSB3YXMgY3JvcHBlZCBvciBibHVycnksIG9yIHRoZSBkb2N1bWVudCB3YXMgY29ycnVwdGVkLiAgYFVOS05PV05gIG9yIGBudWxsYDogQW4gaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuIElmIHRoaXMgaGFwcGVucyByZXBlYXRlZGx5LCBjb250YWN0IHN1cHBvcnQgb3IgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgdGhhdCBpcyBhbHNvIHByZXNlbnQgaW4gdGhlIHBheXN0dWIgcmVzcG9uc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY19pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY190eXBlPzogRG9jVHlwZTtcbn1cbi8qKlxuICogQSBtYXRjaCBzdW1tYXJ5IGRlc2NyaWJpbmcgdGhlIGNyb3NzIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc3ViamVjdFxcJ3MgbmFtZSwgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50IGltYWdlLCBhbmQgdGhlIG5hbWUgdGhleSBzZXBhcmF0ZWx5IHByb3ZpZGVkIHRvIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRG9jdW1lbnROYW1lTWF0Y2hDb2RlIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgUGFydGlhbE1hdGNoID0gJ3BhcnRpYWxfbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgYSBjZXJ0YWluIHJlYXNvbiBhcyB0byB3aHkgYSBkb2N1bWVudCBjb3VsZCBwb3RlbnRpYWxseSBiZSBmcmF1ZHVsZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWwge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHJpc2sgZm91bmQgaW4gdGhlIHJpc2sgc2lnbmFsIGNoZWNrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZpZWxkIHdoaWNoIHRoZSByaXNrIHNpZ25hbCB3YXMgY29tcHV0ZWQgZm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgZmllbGQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHVzZWQgdG8gcXVpY2tseSBpZGVudGlmeSBpZiB0aGUgc2lnbmFsIGluZGljYXRlcyB0aGF0IHRoaXMgZmllbGQgaXMgYXV0aGVudGljIG9yIGZyYXVkdWxlbnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgaGFzX2ZyYXVkX3Jpc2s6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9tZXRhZGF0YTogRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGVjdGVkIHZhbHVlIG9mIHRoZSBmaWVsZCwgYXMgc2VlbiBvbiB0aGUgZG9jdW1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBleHBlY3RlZF92YWx1ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGVyaXZlZCB2YWx1ZSBvYnRhaW5lZCBpbiB0aGUgcmlzayBzaWduYWwgY2FsY3VsYXRpb24gcHJvY2VzcyBmb3IgdGhpcyBmaWVsZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGFjdHVhbF92YWx1ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGV4cGxhbmF0aW9uIHByb3ZpZGluZyBtb3JlIGRldGFpbCBpbnRvIHRoZSBwYXJ0aWN1bGFyIHJpc2sgc2lnbmFsXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgc2lnbmFsX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWxldmFudCBwYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmlzayBzaWduYWwuIElmIHRoZSByaXNrIHNpZ25hbCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgcGFnZSwgdGhlIHZhbHVlIHdpbGwgYmUgMC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBwYWdlX251bWJlcjogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGFkZGl0aW9uYWwgbWV0YWRhdGEgYWJvdXQgdGhlIGluc3RpdHV0aW9uIHVzZWQgdG8gY29tcHV0ZSB0aGUgdmVyaWZpY2F0aW9uIGF0dHJpYnV0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudFJpc2tTaWduYWxJbnN0aXR1dGlvbk1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsSW5zdGl0dXRpb25NZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbEluc3RpdHV0aW9uTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGZyYXVkIHJpc2sgZGF0YSBmb3IgYSBzZXQgb2YgaW5jb21lIGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgZG9jdW1lbnQgbWV0YWRhdGEgYW5kIGFzc29jaWF0ZWQgcmlzayBzaWduYWxzIHBlciBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtBcnJheTxTaW5nbGVEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTaWduYWxzT2JqZWN0XG4gICAgICovXG4gICAgc2luZ2xlX2RvY3VtZW50X3Jpc2tfc2lnbmFsczogQXJyYXk8U2luZ2xlRG9jdW1lbnRSaXNrU2lnbmFsPjtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiByaXNrIHNpZ25hbHMgY29tcHV0ZWQgZnJvbSBhIHNldCBvZiB1cGxvYWRlZCBkb2N1bWVudHMgYW5kIHRoZSBhc3NvY2lhdGVkIGRvY3VtZW50c1xcJyBtZXRhZGF0YVxuICAgICAqIEB0eXBlIHtBcnJheTxNdWx0aURvY3VtZW50Umlza1NpZ25hbD59XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50Umlza1NpZ25hbHNPYmplY3RcbiAgICAgKi9cbiAgICBtdWx0aV9kb2N1bWVudF9yaXNrX3NpZ25hbHM6IEFycmF5PE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsPjtcbn1cbi8qKlxuICogQSBzdW1tYXJ5IGFjcm9zcyBhbGwgcmlzayBzaWduYWxzIGFzc29jaWF0ZWQgd2l0aCBhIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIERvY3VtZW50Umlza1N1bW1hcnlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudFJpc2tTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCwgaW5jbHVzaXZlLCB3aGVyZSBhIHNjb3JlIGNsb3NlciB0byAwIGluZGljYXRlcyBhIGRvY3VtZW50IGlzIGxpa2VseSB0byBiZSB0cnVzdHdvcnRoeSBhbmQgYSBzY29yZSBjbG9zZXIgdG8gMTAwIGluZGljYXRlcyBhIGRvY3VtZW50IGlzIGxpa2VseSB0byBiZSBmcmF1ZHVsZW50LiBZb3UgY2FuIGF1dG9tYXRpY2FsbHkgcmVqZWN0IGRvY3VtZW50cyB3aXRoIGEgaGlnaCByaXNrIHNjb3JlLCBhdXRvbWF0aWNhbGx5IGFjY2VwdCBkb2N1bWVudHMgd2l0aCBhIGxvdyByaXNrIHNjb3JlLCBhbmQgbWFudWFsbHkgcmV2aWV3IGRvY3VtZW50cyBpbiBiZXR3ZWVuLiBXZSBzdWdnZXN0IHN0YXJ0aW5nIHdpdGggYSB0aHJlc2hvbGQgb2YgODAgZm9yIGF1dG8tcmVqZWN0aW9uIGFuZCAyMCBmb3IgYXV0by1hY2NlcHRhbmNlLiBBcyB5b3UgZ2F0aGVyIG1vcmUgZGF0YSBwb2ludHMgb24gdHlwaWNhbCByaXNrIHNjb3JlcyBmb3IgeW91ciB1c2UgY2FzZSwgeW91IGNhbiB0dW5lIHRoZXNlIHBhcmFtZXRlcnMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgZG9jdW1lbnRzIHVuZGVyZ29pbmcgbWFudWFsIHJldmlldy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudFJpc2tTdW1tYXJ5XG4gICAgICovXG4gICAgcmlza19zY29yZTogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb3V0Y29tZSBzdGF0dXMgZm9yIHRoaXMgc3BlY2lmaWMgZG9jdW1lbnQgc3VibWlzc2lvbi4gRGlzdGluY3QgZnJvbSB0aGUgb3ZlcmFsbCBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uLnN0YXR1c2AgdGhhdCBzdW1tYXJpemVzIHRoZSB2ZXJpZmljYXRpb24gb3V0Y29tZSBmcm9tIG9uZSBvciBtb3JlIGRvY3VtZW50cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIERvY3VtZW50U3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIE1hbnVhbGx5QXBwcm92ZWQgPSAnbWFudWFsbHlfYXBwcm92ZWQnXG59XG5cbi8qKlxuICogRGF0YSwgaW1hZ2VzLCBhbmFseXNpcywgYW5kIHJlc3VsdHMgZnJvbSB0aGUgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYCB1bmxlc3MgYHN0ZXBzLmRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgaGFzIHJlYWNoZWQgYSB0ZXJtaW5hbCBzdGF0ZSBvZiBlaXRoZXIgYHN1Y2Nlc3NgIG9yIGBmYWlsZWRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLmRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBkb2N1bWVudHMgc3VibWl0dGVkIHRvIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBzdGVwLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgb25lIHVzZXIgc3VibWlzc2lvbiwgd2hlcmUgZWFjaCBzdWJtaXNzaW9uIHdpbGwgY29udGFpbiBib3RoIGEgZnJvbnQgYW5kIGJhY2sgaW1hZ2UsIG9yIGp1c3QgYSBmcm9udCBpbWFnZSwgZGVwZW5kaW5nIG9uIHRoZSBkb2N1bWVudCB0eXBlLiAgTm90ZTogUGxhaWQgd2lsbCBhdXRvbWF0aWNhbGx5IGxldCBhIHVzZXIgc3VibWl0IGEgbmV3IHNldCBvZiBkb2N1bWVudCBpbWFnZXMgdXAgdG8gdGhyZWUgdGltZXMgaWYgd2UgZGV0ZWN0IHRoYXQgYSBwcmV2aW91cyBhdHRlbXB0IG1pZ2h0IGhhdmUgZmFpbGVkIGR1ZSB0byB1c2VyIGVycm9yLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpcnN0IHNldCBvZiBkb2N1bWVudCBpbWFnZXMgYXJlIGJsdXJyeSBvciBvYnNjdXJlZCBieSBnbGFyZSwgdGhlIHVzZXIgd2lsbCBiZSBhc2tlZCB0byBjYXB0dXJlIHRoZWlyIGRvY3VtZW50cyBhZ2FpbiwgcmVzdWx0aW5nIGluIGF0IGxlYXN0IHR3byBzZXBhcmF0ZSBlbnRyaWVzIHdpdGhpbiBgZG9jdW1lbnRzYC4gSWYgdGhlIG92ZXJhbGwgYGRvY3VtZW50YXJ5X3ZlcmlmaWNhdGlvbmAgaXMgYGZhaWxlZGAsIHRoZSB1c2VyIGhhcyBleGhhdXN0ZWQgdGhlaXIgcmV0cnkgYXR0ZW1wdHMuXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGRvY3VtZW50czogQXJyYXk8RG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudD47XG59XG4vKipcbiAqIEltYWdlcywgZXh0cmFjdGVkIGRhdGEsIGFuZCBhbmFseXNpcyBmcm9tIGEgdXNlclxcJ3MgaWRlbnRpdHkgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogRG9jdW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdHRlbXB0YCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBzdWJzZXF1ZW50IGRvY3VtZW50IHVwbG9hZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgYXR0ZW1wdDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50SW1hZ2VzfVxuICAgICAqIEBtZW1iZXJvZiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbkRvY3VtZW50XG4gICAgICovXG4gICAgaW1hZ2VzOiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIGV4dHJhY3RlZF9kYXRhOiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50QW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uRG9jdW1lbnRcbiAgICAgKi9cbiAgICBhbmFseXNpczogRG9jdW1lbnRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRG9jdW1lbnRhcnlWZXJpZmljYXRpb25Eb2N1bWVudFxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggYSBicmVha2Rvd24gb2YgZWFybmluZ3Mgb24gYSBwYXlzdHViIGFuZCB0aGUgdG90YWwgZWFybmluZ3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN1YnRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc1RvdGFsPn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRvdGFscz86IEFycmF5PEVhcm5pbmdzVG90YWw+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFYXJuaW5nc0JyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzXG4gICAgICovXG4gICAgYnJlYWtkb3duPzogQXJyYXk8RWFybmluZ3NCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc1RvdGFsfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1xuICAgICAqL1xuICAgIHRvdGFsPzogRWFybmluZ3NUb3RhbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZWFybmluZ3MgbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRWFybmluZ3NCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgaG91cnMgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSG91cmx5IHJhdGUgYXBwbGljYWJsZSBmb3IgdGhpcyBlYXJuaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgcmF0ZT86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVhcm5pbmdzQnJlYWtkb3duQ2Fub25pY2FsRGVzY3JpcHRpb24ge1xuICAgIEJvbnVzID0gJ0JPTlVTJyxcbiAgICBDb21taXNzaW9uID0gJ0NPTU1JU1NJT04nLFxuICAgIE92ZXJ0aW1lID0gJ09WRVJUSU1FJyxcbiAgICBQYWlkVGltZU9mZiA9ICdQQUlEIFRJTUUgT0ZGJyxcbiAgICBSZWd1bGFyUGF5ID0gJ1JFR1VMQVIgUEFZJyxcbiAgICBWYWNhdGlvbiA9ICdWQUNBVElPTicsXG4gICAgQmFzaWNBbGxvd2FuY2VIb3VzaW5nID0gJ0JBU0lDIEFMTE9XQU5DRSBIT1VTSU5HJyxcbiAgICBCYXNpY0FsbG93YW5jZVN1YnNpc3RlbmNlID0gJ0JBU0lDIEFMTE9XQU5DRSBTVUJTSVNURU5DRScsXG4gICAgT3RoZXIgPSAnT1RIRVInLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGJvdGggdGhlIGN1cnJlbnQgcGF5IHBlcmlvZCBhbmQgeWVhciB0byBkYXRlIGFtb3VudCBmb3IgYW4gZWFybmluZyBjYXRlZ29yeS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRWFybmluZ3NUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVhcm5pbmdzVG90YWwge1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGFtb3VudCBvZiB0aGUgZWFybmluZ3MgZm9yIHRoaXMgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3VycmVudF9wYXk/OiBQYXk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheX1cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VjdXJpdHkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBlYXJuaW5nc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBhbiBlbWFpbCBhZGRyZXNzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1haWwge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgZGF0YTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSBlbWFpbCBhZGRyZXNzIGFzIHRoZSBwcmltYXJ5IGVtYWlsIG9uIGFuIGFjY291bnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgcHJpbWFyeTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBlbWFpbCBhY2NvdW50IGFzIGRlc2NyaWJlZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtYWlsXG4gICAgICovXG4gICAgdHlwZTogRW1haWxUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBFbWFpbFR5cGVFbnVtIHtcbiAgICBQcmltYXJ5ID0gJ3ByaW1hcnknLFxuICAgIFNlY29uZGFyeSA9ICdzZWNvbmRhcnknLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIGVtYWlsIHByb3ZpZGVkIGJ5IHRoZSBBUEkgd2l0aCB0aGUgZW1haWwgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCBhbmQgMCBpcyBhIG5vIG1hdGNoLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1haWxBZGRyZXNzTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtYWlsQWRkcmVzc01hdGNoU2NvcmUge1xuICAgIC8qKlxuICAgICAqIE1hdGNoIHNjb3JlIGZvciBub3JtYWxpemVkIGVtYWlsLiAxMDAgaXMgYSBwZXJmZWN0IG1hdGNoLCA5OS03MCBpcyBhIHBhcnRpYWwgbWF0Y2ggKG1hdGNoaW5nIHRoZSBzYW1lIGVtYWlsIHdpdGggZGlmZmVyZW50IFxcJytcXCcgZXh0ZW5zaW9ucyksIGFueXRoaW5nIGJlbG93IDcwIGlzIGNvbnNpZGVyZWQgYSBtaXNtYXRjaC4gVHlwaWNhbGx5LCB0aGUgbWF0Y2ggdGhyZXNob2xkIHNob3VsZCBiZSBzZXQgdG8gYSBzY29yZSBvZiA3MCBvciBoaWdoZXIuIElmIHRoZSBlbWFpbCBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW1haWxBZGRyZXNzTWF0Y2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBQYXlzdHViQWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE1hcml0YWwgc3RhdHVzIG9mIHRoZSBlbXBsb3llZSAtIGVpdGhlciBgc2luZ2xlYCBvciBgbWFycmllZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZWVcbiAgICAgKi9cbiAgICBtYXJpdGFsX3N0YXR1cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySUR9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlXG4gICAgICovXG4gICAgdGF4cGF5ZXJfaWQ/OiBUYXhwYXllcklEO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZWUsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llZUluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgZW1wbG95ZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWRkcmVzc0RhdGFOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBBZGRyZXNzRGF0YU51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIG51bWJlciBmcm9tIDAgdG8gMSBpbmRpY2F0aW5nIFBsYWlkXFwncyBsZXZlbCBvZiBjb25maWRlbmNlIGluIHRoZSBwYWlyaW5nIGJldHdlZW4gdGhlIGVtcGxveWVyIGFuZCB0aGUgaW5zdGl0dXRpb24gKG5vdCB5ZXQgaW1wbGVtZW50ZWQpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVyXG4gICAgICovXG4gICAgY29uZmlkZW5jZV9zY29yZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgZW1wbG95ZXIsIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llckluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgZW1wbG95ZXIgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95ZXJWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXBsb3llclZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llclZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2VtcGxveWVycy9zZWFyY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbXBsb3llciBuYW1lIHRvIGJlIHNlYXJjaGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgcXVlcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgcHJvZHVjdHMgdGhlIHJldHVybmVkIGVtcGxveWVycyBzaG91bGQgc3VwcG9ydC4gQ3VycmVudGx5LCB0aGlzIGZpZWxkIG11c3QgYmUgc2V0IHRvIGBcXFwiZGVwb3NpdF9zd2l0Y2hcXFwiYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95ZXJzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvZW1wbG95ZXJzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveWVyc1NlYXJjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95ZXJzU2VhcmNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbXBsb3llcnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBjcml0ZXJpYS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1wbG95ZXI+fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveWVyczogQXJyYXk8RW1wbG95ZXI+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3llcnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBlbXBsb3ltZW50IGRldGFpbHMgZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbXBsb3ltZW50RGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYW5udWFsX3NhbGFyeT86IFBheTtcbiAgICAvKipcbiAgICAgKiBEYXRlIG9uIHdoaWNoIHRoZSBlbXBsb3llZSB3YXMgaGlyZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50RGV0YWlsc1xuICAgICAqL1xuICAgIGhpcmVfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgZW1wbG95bWVudCBkYXRhIHRoYXQgdXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gc2hhcmVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVtcGxveW1lbnRTb3VyY2VUeXBlIHtcbiAgICBCYW5rID0gJ2JhbmsnLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBwcm9vZiBvZiBlbXBsb3ltZW50IGRhdGEgZm9yIGFuIGluZGl2aWR1YWxcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc3RhdHVzPzogRW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhcnQgb2YgZW1wbG95bWVudCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmQgb2YgZW1wbG95bWVudCwgaWYgYXBwbGljYWJsZS4gUHJvdmlkZWQgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVyVmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBFbXBsb3llclZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IHRpdGxlIG9mIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0aXRsZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYXRmb3JtSWRzfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcGxhdGZvcm1faWRzPzogUGxhdGZvcm1JZHM7XG59XG4vKipcbiAqIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uIHN1bW1hcmllcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1wbG95bWVudFZlcmlmaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVtcGxveW1lbnRzOiBBcnJheTxFbXBsb3ltZW50VmVyaWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDdXJyZW50IGVtcGxveW1lbnQgc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRW1wbG95bWVudFZlcmlmaWNhdGlvblN0YXR1cyB7XG4gICAgRW1wbG95bWVudFN0YXR1c0FjdGl2ZSA9ICdFTVBMT1lNRU5UX1NUQVRVU19BQ1RJVkUnLFxuICAgIEVtcGxveW1lbnRTdGF0dXNJbmFjdGl2ZSA9ICdFTVBMT1lNRU5UX1NUQVRVU19JTkFDVElWRScsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgdGhlIFBsYWlkIHByb2R1Y2VkIHRyYW5zYWN0aW9uIGVuaGFuY2VtZW50IGZpZWxkcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW5oYW5jZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5oYW5jZW1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJpbWFyeSBjb3VudGVycGFydHksIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFzIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoZWNrIG51bWJlciBvZiB0aGUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIGNoZWNrIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q2hhbm5lbH1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBQYXltZW50Q2hhbm5lbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGNhdGVnb3JpZXMgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgY2F0ZWdvcmllcywgc2VlIFtgL2NhdGVnb3JpZXMvZ2V0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBsb2NhdGlvbjogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBFbmhhbmNlbWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeV9pY29uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgRW5oYW5jZW1lbnRzXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM/OiBBcnJheTxDb3VudGVycGFydHk+O1xufVxuLyoqXG4gKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgYWNjb3VudCBob2xkZXI6ICBgT1VURkxPV2AgLSBJbmNsdWRlcyBvdXRnb2luZyB0cmFuc2ZlcnMsIHB1cmNoYXNlcywgYW5kIGZlZXMuIChUeXBpY2FsbHkgcmVwcmVzZW50ZWQgYXMgYSBuZWdhdGl2ZSB2YWx1ZSBvbiBjaGVja2luZyBhY2NvdW50cyBhbmQgZGViaXQgY2FyZHMgYW5kIGEgcG9zaXRpdmUgdmFsdWUgb24gY3JlZGl0IGNhcmRzLikgIGBJTkZMT1dgIC0gSW5jbHVkZXMgaW5jb21pbmcgdHJhbnNmZXJzLCByZWZ1bmRzLCBhbmQgaW5jb21lLiAoVHlwaWNhbGx5IHJlcHJlc2VudGVkIGFzIGEgcG9zaXRpdmUgdmFsdWUgb24gY2hlY2tpbmcgYWNjb3VudHMgYW5kIGRlYml0IGNhcmRzIGFuZCBhIG5lZ2F0aXZlIHZhbHVlIG9uIGNyZWRpdCBjYXJkcy4pXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnJpY2hUcmFuc2FjdGlvbkRpcmVjdGlvbiB7XG4gICAgSW5mbG93ID0gJ0lORkxPVycsXG4gICAgT3V0ZmxvdyA9ICdPVVRGTE9XJ1xufVxuXG4vKipcbiAqIEEgZ3JvdXBpbmcgb2YgdGhlIFBsYWlkIHByb2R1Y2VkIHRyYW5zYWN0aW9uIGVucmljaG1lbnQgZmllbGRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnJpY2htZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVucmljaG1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgY2hlY2tfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRlcnBhcnRpZXMgcHJlc2VudCBpbiB0aGUgdHJhbnNhY3Rpb24uIENvdW50ZXJwYXJ0aWVzLCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcmUgZXh0cmFjdGVkIGJ5IFBsYWlkIGZyb20gdGhlIHJhdyBkZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBjb3VudGVycGFydGllczogQXJyYXk8Q291bnRlcnBhcnR5PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgSUQgdGhhdCBtYXBzIHRvIHRoZSBwcmltYXJ5IGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBsZWdhY3kgY2F0ZWdvcnkgdG8gd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBiZWxvbmdzLiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBXZSByZWNvbW1lbmQgdXNpbmcgdGhlIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBmb3IgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gdG8gb2J0YWluIHRoZSBiZXN0IHJlc3VsdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGxlZ2FjeV9jYXRlZ29yeV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBoaWVyYXJjaGljYWwgYXJyYXkgb2YgdGhlIGxlZ2FjeSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGxlZ2FjeSBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgZm9yIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHRvIG9idGFpbiB0aGUgYmVzdCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGVnYWN5X2NhdGVnb3J5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbG9nb191cmw6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHByaW1hcnkgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENoYW5uZWx9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGF5bWVudF9jaGFubmVsOiBQYXltZW50Q2hhbm5lbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGhvbmUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY291bnRlcnBhcnR5IGluIEUuIDE2NCBmb3JtYXQuIElmIHRoZXJlIGlzIGEgbG9jYXRpb24gbWF0Y2ggKGkuZS4gYSBzdHJlZXQgYWRkcmVzcyBpcyByZXR1cm5lZCBpbiB0aGUgbG9jYXRpb24gb2JqZWN0KSwgdGhlIHBob25lIG51bWJlciB3aWxsIGJlIGxvY2F0aW9uIHNwZWNpZmljLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVucmljaG1lbnRzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhbiBpY29uIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5LiBUaGUgaWNvbiB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnJpY2htZW50c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICByZWN1cnJlbmNlPzogUmVjdXJyZW5jZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW5yaWNobWVudHNcbiAgICAgKi9cbiAgICB3ZWJzaXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvZmZpY2lhbCBkb2N1bWVudCwgdXN1YWxseSBpc3N1ZWQgYnkgYSBnb3Zlcm5pbmcgYm9keSBvciBpbnN0aXR1dGlvbiwgd2l0aCBhbiBhc3NvY2lhdGVkIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eURvY3VtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5RG9jdW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlEb2N1bWVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eURvY3VtZW50XG4gICAgICovXG4gICAgdHlwZTogRW50aXR5RG9jdW1lbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1lcmljIG9yIGFscGhhbnVtZXJpYyBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRvY3VtZW50LiBNdXN0IGJlIGJldHdlZW4gNCBhbmQgMzIgY2hhcmFjdGVycyBsb25nLCBhbmQgY2Fubm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5RG9jdW1lbnRcbiAgICAgKi9cbiAgICBudW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGtpbmQgb2Ygb2ZmaWNpYWwgZG9jdW1lbnQgcmVwcmVzZW50ZWQgYnkgdGhpcyBvYmplY3QuICBgYmlrYCAtIFJ1c3NpYW4gYmFuayBjb2RlICBgYnVzaW5lc3NfbnVtYmVyYCAtIEEgbnVtYmVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgYnVzaW5lc3Mgd2l0aGluIGEgY2F0ZWdvcnkgb2YgYnVzaW5lc3NlcyAgYGltb2AgLSBOdW1iZXIgYXNzaWduZWQgdG8gdGhlIGVudGl0eSBieSB0aGUgSW50ZXJuYXRpb25hbCBNYXJpdGltZSBPcmdhbml6YXRpb24gIGBvdGhlcmAgLSBBbnkgZG9jdW1lbnQgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHN3aWZ0YCAtIE51bWJlciBpZGVudGlmeWluZyBhIGJhbmsgYW5kIGJyYW5jaC4gIGB0YXhfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGZvciB0aGUgcHVycG9zZSBvZiBjb2xsZWN0aW5nIHRheGVzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBFbnRpdHlEb2N1bWVudFR5cGUge1xuICAgIEJpayA9ICdiaWsnLFxuICAgIEJ1c2luZXNzTnVtYmVyID0gJ2J1c2luZXNzX251bWJlcicsXG4gICAgSW1vID0gJ2ltbycsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFN3aWZ0ID0gJ3N3aWZ0JyxcbiAgICBUYXhJZCA9ICd0YXhfaWQnXG59XG5cbi8qKlxuICogQW5hbHlzaXMgaW5mb3JtYXRpb24gZGVzY3JpYmluZyB3aHkgYSBzY3JlZW5pbmcgaGl0IG1hdGNoZWQgdGhlIHByb3ZpZGVkIGVudGl0eSBpbmZvcm1hdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3Nlcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgbG9jYXRpb25zPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBuYW1lcz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVycz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgdXJscz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgdGhlIGVudGl0eSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgIHRoYXQgd2VyZSBjb21wYXJlZCB3aGVuIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdCB3YXMgYWRkZWQuIGVudGl0eSBzY3JlZW5pbmcgaGl0cyBhcmUgaW1tdXRhYmxlIG9uY2UgdGhleSBoYXZlIGJlZW4gcmV2aWV3ZWQuIElmIGNoYW5nZXMgYXJlIGRldGVjdGVkIGR1ZSB0byB1cGRhdGVzIHRvIHRoZSBlbnRpdHkgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCwgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0sIG9yIHRoZSBsaXN0XFwncyBzb3VyY2UgZGF0YSBwcmlvciB0byByZXZpZXcsIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdCB3aWxsIGJlIHVwZGF0ZWQgdG8gcmVmbGVjdCB0aG9zZSBjaGFuZ2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zX3ZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogRW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzZXM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogTG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz47XG4gICAgLyoqXG4gICAgICogTmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPjtcbiAgICAvKipcbiAgICAgKiBQaG9uZSBudW1iZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogQXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXM+O1xuICAgIC8qKlxuICAgICAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICB1cmxzPzogQXJyYXk8RW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zPjtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZG9jdW1lbnRzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5RG9jdW1lbnR9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eURvY3VtZW50O1xufVxuLyoqXG4gKiBFbWFpbCBhZGRyZXNzIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHMge1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdEVtYWlsc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgZW1haWxzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0RW1haWxzSXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0RW1haWxzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRFbWFpbHM7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGVudGl0eSB3YXRjaGxpc3QgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0TmFtZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGVudGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQcmltYXJ5IG5hbWVzIGFyZSB0aG9zZSBtb3N0IGNvbW1vbmx5IHVzZWQgdG8gcmVmZXIgdG8gdGhpcyBlbnRpdHkuIE9ubHkgb25lIG5hbWUgd2lsbCBldmVyIGJlIG1hcmtlZCBhcyBwcmltYXJ5LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgd2Vha19hbGlhc19kZXRlcm1pbmF0aW9uOiBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uO1xufVxuLyoqXG4gKiBBbmFseXplZCBuYW1lcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdE5hbWVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IEVudGl0eVNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBQaG9uZSBudW1iZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaG9uZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFBob25lTnVtYmVyc1xuICAgICAqL1xuICAgIHR5cGU6IFBob25lVHlwZTtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFVSTHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbnRpdHkgc2NyZWVuaW5nIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0VXJscyB7XG4gICAgLyoqXG4gICAgICogQW4gXFwnaHR0cFxcJyBvciBcXCdodHRwc1xcJyBVUkwgKG11c3QgYmVnaW4gd2l0aCBlaXRoZXIgb2YgdGhvc2UpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbn1cbi8qKlxuICogQW5hbHl6ZWQgVVJMcyBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0VXJsc0l0ZW1zXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdFVybHN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ0hpdFVybHNJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRVcmxzO1xufVxuLyoqXG4gKiBBbmFseXplZCBwaG9uZSBudW1iZXJzIGZvciB0aGUgYXNzb2NpYXRlZCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5U2NyZWVuaW5nSGl0c1Bob25lTnVtYmVySXRlbXNcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IE1hdGNoU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5U2NyZWVuaW5nSGl0UGhvbmVOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdIaXRzUGhvbmVOdW1iZXJJdGVtc1xuICAgICAqL1xuICAgIGRhdGE/OiBFbnRpdHlTY3JlZW5pbmdIaXRQaG9uZU51bWJlcnM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gZW50aXR5IHNjcmVlbmluZyBzdGF0dXMgaGFzIGNoYW5nZWQsIHdoaWNoIGNhbiBvY2N1ciBtYW51YWxseSB2aWEgdGhlIGRhc2hib2FyZCBvciBkdXJpbmcgb25nb2luZyBtb25pdG9yaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgRU5USVRZX1NDUkVFTklOR2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTVEFUVVNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlTY3JlZW5pbmdTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW50aXR5X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU2hvcnRoYW5kIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgc2NyZWVuaW5nIGxpc3QgZm9yIGVudGl0aWVzLiAgYEFVX0NPTmA6IEF1c3RyYWxpYSBEZXBhcnRtZW50IG9mIEZvcmVpZ24gQWZmYWlycyBhbmQgVHJhZGUgQ29uc29saWRhdGVkIExpc3QgIGBDQV9DT05gOiBHb3Zlcm5tZW50IG9mIENhbmFkYSBDb25zb2xpZGF0ZWQgTGlzdCBvZiBTYW5jdGlvbnMgIGBFVV9DT05gOiBFdXJvcGVhbiBFeHRlcm5hbCBBY3Rpb24gU2VydmljZSBDb25zb2xpZGF0ZWQgTGlzdCAgYElaX1NPRWA6IFN0YXRlIE93bmVkIEVudGVycHJpc2UgTGlzdCAgYElaX1VOQ2A6IFVuaXRlZCBOYXRpb25zIENvbnNvbGlkYXRlZCBTYW5jdGlvbnMgIGBJWl9XQktgOiBXb3JsZCBCYW5rIExpc3Rpbmcgb2YgSW5lbGlnaWJsZSBGaXJtcyBhbmQgSW5kaXZpZHVhbHMgIGBVU19DQVBgOiBVUyBPRkFDIENvcnJlc3BvbmRlbnQgQWNjb3VudCBvciBQYXlhYmxlLVRocm91Z2ggQWNjb3VudCBTYW5jdGlvbnMgIGBVU19GU0VgOiBVUyBPRkFDIEZvcmVpZ24gU2FuY3Rpb25zIEV2YWRlcnMgIGBVU19NQlNgOiBVUyBOb24tU0ROIE1lbnUtQmFzZWQgU2FuY3Rpb25zICBgVVNfU0ROYDogVVMgU3BlY2lhbGx5IERlc2lnbmF0ZWQgTmF0aW9uYWxzIExpc3QgIGBVU19TU0lgOiBVUyBPRkFDIFNlY3RvcmFsIFNhbmN0aW9ucyBJZGVudGlmaWNhdGlvbnMgIGBVU19DTUNgOiBVUyBPRkFDIE5vbi1TRE4gQ2hpbmVzZSBNaWxpdGFyeS1JbmR1c3RyaWFsIENvbXBsZXggTGlzdCAgYFVTX1VWTGA6IEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQgU2VjdXJpdHkgVW52ZXJpZmllZCBMaXN0ICBgVUtfSE1DYDogVUsgSE0gVHJlYXN1cnkgQ29uc29saWRhdGVkIExpc3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEVudGl0eVdhdGNobGlzdENvZGUge1xuICAgIENhQ29uID0gJ0NBX0NPTicsXG4gICAgRXVDb24gPSAnRVVfQ09OJyxcbiAgICBJelNvZSA9ICdJWl9TT0UnLFxuICAgIEl6VW5jID0gJ0laX1VOQycsXG4gICAgSXpXYmsgPSAnSVpfV0JLJyxcbiAgICBVc0NhcCA9ICdVU19DQVAnLFxuICAgIFVzRnNlID0gJ1VTX0ZTRScsXG4gICAgVXNNYnMgPSAnVVNfTUJTJyxcbiAgICBVc1NkbiA9ICdVU19TRE4nLFxuICAgIFVzU3NpID0gJ1VTX1NTSScsXG4gICAgVXNDbWMgPSAnVVNfQ01DJyxcbiAgICBVc1V2bCA9ICdVU19VVkwnLFxuICAgIEF1Q29uID0gJ0FVX0NPTicsXG4gICAgVWtIbWMgPSAnVUtfSE1DJ1xufVxuXG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgZW50aXRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RQcm9ncmFtXG4gICAgICovXG4gICAgaXNfcmVzY2FubmluZ19lbmFibGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdhdGNobGlzdHMgZW5hYmxlZCBmb3IgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbVxuICAgICAqIEB0eXBlIHtTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgZW50aXR5IHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBPcmdhbml6YXRpb25zXFxcIiBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWVfc2Vuc2l0aXZpdHk6IFByb2dyYW1OYW1lU2Vuc2l0aXZpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1xuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogRGF0YSBmcm9tIGEgZ292ZXJubWVudCB3YXRjaGxpc3QgdGhhdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgc2NyZWVuaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcgaGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0hpdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcmV2aWV3X3N0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBmaXJzdF9hY3RpdmU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaW5hY3RpdmVfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGhpc3RvcmljYWxfc2luY2U6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdENvZGV9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGxpc3RfY29kZTogRW50aXR5V2F0Y2hsaXN0Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXZlcnNhbCBpZGVudGlmaWVyIGZvciBhIHdhdGNobGlzdCBpbmRpdmlkdWFsIHRoYXQgaXMgc3RhYmxlIGFjcm9zcyBzZWFyY2hlcyBhbmQgdXBkYXRlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBwbGFpZF91aWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBwcm92aWRlZCBieSB0aGUgc291cmNlIHNhbmN0aW9uIG9yIHdhdGNobGlzdC4gV2hlbiBvbmUgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBzb3VyY2UsIHRoaXMgaXMgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIHNvdXJjZV91aWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBhbmFseXNpcz86IEVudGl0eVNjcmVlbmluZ0hpdEFuYWx5c2lzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlTY3JlZW5pbmdIaXREYXRhfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBkYXRhPzogRW50aXR5U2NyZWVuaW5nSGl0RGF0YTtcbn1cbi8qKlxuICogQSByZXZpZXcgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBBIHJldmlldyBjYW4gYmUgZWl0aGVyIGEgY29tbWVudCBvbiB0aGUgY3VycmVudCBzY3JlZW5pbmcgc3RhdGUsIGFjdGlvbnMgdGFrZW4gYWdhaW5zdCBoaXRzIGF0dGFjaGVkIHRvIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nLCBvciBib3RoLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXcge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBIaXRzIG1hcmtlZCBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBjb21tZW50OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXdcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbn1cbi8qKlxuICogU2VhcmNoIHRlcm1zIGFzc29jaWF0ZWQgd2l0aCBhbiBlbnRpdHkgdXNlZCBmb3Igc2VhcmNoaW5nIGFnYWluc3Qgd2F0Y2hsaXN0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBvcmdhbml6YXRpb24gYmVpbmcgc2NyZWVuZWQuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYWxwaGFiZXRpY2FsIGNoYXJhY3RlciwgaGF2ZSBhIG1heGltdW0gbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLCBhbmQgbm90IGluY2x1ZGUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzZWFyY2ggdGVybXMuIFN0YXJ0cyBhdCBgMWAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIGVkaXQgdG8gYHNlYXJjaF90ZXJtc2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIFNlYXJjaCBpbnB1dHMgZm9yIGNyZWF0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIG9yZ2FuaXphdGlvbiBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC4gTXVzdCBiZSBiZXR3ZWVuIDQgYW5kIDMyIGNoYXJhY3RlcnMgbG9uZywgYW5kIGNhbm5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEVudGl0eVdhdGNobGlzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIFxcJ2h0dHBcXCcgb3IgXFwnaHR0cHNcXCcgVVJMIChtdXN0IGJlZ2luIHdpdGggZWl0aGVyIG9mIHRob3NlKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHVybD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgZGVzY3JpcHRpb24gb2Ygd2hldGhlciB0aGUgYXNzb2NpYXRlZCBkb2N1bWVudCB3YXMgZXhwaXJlZCB3aGVuIHRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZC4gIE5vdGU6IEluIHRoZSBjYXNlIHdoZXJlIGFuIGV4cGlyYXRpb24gZGF0ZSBpcyBub3QgcHJlc2VudCBvbiB0aGUgZG9jdW1lbnQgb3IgZmFpbGVkIHRvIGJlIGV4dHJhY3RlZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBub19kYXRhYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEV4cGlyYXRpb25EYXRlIHtcbiAgICBOb3RFeHBpcmVkID0gJ25vdF9leHBpcmVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFBsYWlkIGFuZCBGRFgtZGVmaW5lZCByZWNpcGllbnQgbWV0YWRhdGEgZmllbGRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY2lwaWVudCBuYW1lIGRpc3BsYXllZCBieSB0aGUgRGF0YSBQcm92aWRlciBkdXJpbmcgdGhlIGNvbnNlbnQgZmxvd1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgUmVjaXBpZW50IExvZ28gVVJMIGxvY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ29fdXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X2xlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2F0ZWdvcnkgdGhhdCB0aGUgcmVjaXBpZW50IGZhbGxzIHVuZGVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYXQgd2hpY2ggdGhlIHJlY2lwaWVudCBnYWluZWQgcHJvZHVjdGlvbiBhY2Nlc3MgdG8gUGxhaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgam9pbmVkX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIERhdGEgUGFydG5lciBjb25zdW1lcnMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIHRoZSByZWNpcGllbnQgZm9yIHRoZSBzcGVjaWZpYyBEYXRhIFBhcnRuZXJcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgY29ubmVjdGlvbl9jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2F0ZWdvcnkgdGhhdCB0aGUgcmVjaXBpZW50IGZhbGxzIHVuZGVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCB0aGUgcmVjaXBpZW50IGdhaW5lZCBwcm9kdWN0aW9uIGFjY2VzcyB0byBQbGFpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVuZGVkUmVjaXBpZW50TWV0YWRhdGFBbGxPZlxuICAgICAqL1xuICAgIGpvaW5lZF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBEYXRhIFBhcnRuZXIgY29uc3VtZXJzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byB0aGUgcmVjaXBpZW50IGZvciB0aGUgc3BlY2lmaWMgRGF0YSBQYXJ0bmVyXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YUFsbE9mXG4gICAgICovXG4gICAgY29ubmVjdGlvbl9jb3VudDogbnVtYmVyO1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgQWRkaXRpb25hbCBwYXltZW50IGNvbnNlbnQgb3B0aW9ucy4gUGxlYXNlIHVzZSBgcGF5ZXJfZGV0YWlsc2AgdG8gc3BlY2lmeSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICByZXF1ZXN0X3JlZnVuZF9kZXRhaWxzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBwYXllclxcJ3MgYWNjb3VudC4gV2hlcmUgcG9zc2libGUsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2V0IHVwIHBheW1lbnQgY29uc2VudCB1c2luZyBvbmx5IHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRJbml0aWF0aW9uQ29uc2VudE9wdGlvbnNcbiAgICAgKi9cbiAgICBiYWNzPzogUGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjcyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgcGF5bWVudCBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgUGxhaWQgd2lsbCBhdHRlbXB0IHRvIHJlcXVlc3QgcmVmdW5kIGRldGFpbHMgZnJvbSB0aGUgcGF5ZWVcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIFN1cHBvcnQgdmFyaWVzIGJldHdlZW4gZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgd2lsbCBub3QgYWx3YXlzIGJlIGF2YWlsYWJsZS4gIElmIHJlZnVuZCBkZXRhaWxzIGNvdWxkIGJlIHJldHJpZXZlZCwgdGhleSB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIHJlc3BvbnNlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRPcHRpb25zXG4gICAgICovXG4gICAgcmVxdWVzdF9yZWZ1bmRfZGV0YWlscz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcGF5ZXJcXCdzIGFjY291bnQuIFdoZXJlIHBvc3NpYmxlLCB0aGUgZW5kIHVzZXIgd2lsbCBiZSBhYmxlIHRvIHNlbmQgcGF5bWVudHMgb25seSBmcm9tIHRoZSBzcGVjaWZpZWQgYmFuayBhY2NvdW50IGlmIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudE9wdGlvbnNcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25PcHRpb25hbFJlc3RyaWN0aW9uQmFjc31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50T3B0aW9uc1xuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGV4dGVybmFsIHBheW1lbnQgcmVmdW5kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgYWNjb3VudCBob2xkZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGliYW46IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50UmVmdW5kRGV0YWlsc1xuICAgICAqL1xuICAgIGJhY3M6IFJlY2lwaWVudEJBQ1NOdWxsYWJsZSB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzY2hlZHVsZSB0aGF0IHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb24uIElmIGEgc2NoZWR1bGUgaXMgcHJvdmlkZWQsIHRoZSBwYXltZW50IGlzIGF1dG9tYXRpY2FsbHkgc2V0IHVwIGFzIGEgc3RhbmRpbmcgb3JkZXIuIElmIG5vIHNjaGVkdWxlIGlzIHNwZWNpZmllZCwgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbmx5IG9uY2UuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbD86IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGJlZ2luIG9uIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIGBzdGFydF9kYXRlYC4gIElmIHRoZSBmaXJzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYWZ0ZXIgdGhlIHN0YXJ0IGRhdGUgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSB0aGUgZmlyc3QgcGF5bWVudCBvbiB0aGF0IGRheSwgYnV0IGl0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGRvIHNvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEV4dGVybmFsUGF5bWVudFNjaGVkdWxlQmFzZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBlbmRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUJhc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHNjaGVkdWxlIHRoYXQgdGhlIHBheW1lbnQgd2lsbCBiZSBleGVjdXRlZCBvbi4gSWYgYSBzY2hlZHVsZSBpcyBwcm92aWRlZCwgdGhlIHBheW1lbnQgaXMgYXV0b21hdGljYWxseSBzZXQgdXAgYXMgYSBzdGFuZGluZyBvcmRlci4gSWYgbm8gc2NoZWR1bGUgaXMgc3BlY2lmaWVkLCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgb25jZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlZHVsZUludGVydmFsfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGludGVydmFsOiBQYXltZW50U2NoZWR1bGVJbnRlcnZhbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgcGF5bWVudC4gIElmIHRoZSBwYXltZW50IGludGVydmFsIGlzIHdlZWtseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA3IChTdW5kYXkpLiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgbW9udGhseSwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hpY2ggZGF5IG9mIHRoZSBtb250aCB0byBtYWtlIHRoZSBwYXltZW50IG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXkgb2YgdGhlIG1vbnRoLiBOZWdhdGl2ZSBpbnRlZ2VycyBmcm9tIC0xIHRvIC01IGNhbiBiZSB1c2VkIHRvIG1ha2UgYSBwYXltZW50IHJlbGF0aXZlIHRvIHRoZSBlbmQgb2YgdGhlIG1vbnRoLiBUbyBtYWtlIGEgcGF5bWVudCBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHBheW1lbnQgb24gdGhlIHNlY29uZC10by1sYXN0IGRheSwgdXNlIC0yLCBhbmQgc28gb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgZW5kIG9uIHRoZSBsYXN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBiZWZvcmUgdGhlIGBlbmRfZGF0ZWAuIElmIHRoZSBvbmx5IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBiZXR3ZWVuIHRoZSBzdGFydCBkYXRlIGFuZCB0aGUgZW5kIGRhdGUgKGluY2x1c2l2ZSkgaXMgYWxzbyB0aGUgc2FtZSBkYXkgdGhhdCBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcGF5bWVudCB3aWxsIGJlIGV4ZWN1dGVkIG9uLiBJZiBhIHNjaGVkdWxlIGlzIHByb3ZpZGVkLCB0aGUgcGF5bWVudCBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cCBhcyBhIHN0YW5kaW5nIG9yZGVyLiBJZiBubyBzY2hlZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBwYXltZW50IHdpbGwgYmUgZXhlY3V0ZWQgb25seSBvbmNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZWR1bGVJbnRlcnZhbH1cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW50ZXJ2YWw6IFBheW1lbnRTY2hlZHVsZUludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXkgb2YgdGhlIGludGVydmFsIG9uIHdoaWNoIHRvIHNjaGVkdWxlIHRoZSBwYXltZW50LiAgSWYgdGhlIHBheW1lbnQgaW50ZXJ2YWwgaXMgd2Vla2x5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgZnJvbSAxIChNb25kYXkpIHRvIDcgKFN1bmRheSkuICBJZiB0aGUgcGF5bWVudCBpbnRlcnZhbCBpcyBtb250aGx5LCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHBheW1lbnQgb24uIEludGVnZXJzIGZyb20gMSB0byAyOCBjYW4gYmUgdXNlZCB0byBtYWtlIGEgcGF5bWVudCBvbiB0aGF0IGRheSBvZiB0aGUgbW9udGguIE5lZ2F0aXZlIGludGVnZXJzIGZyb20gLTEgdG8gLTUgY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSBwYXltZW50IG9uIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGgsIHVzZSAtMTsgdG8gbWFrZSB0aGUgcGF5bWVudCBvbiB0aGUgc2Vjb25kLXRvLWxhc3QgZGF5LCB1c2UgLTIsIGFuZCBzbyBvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFN0YW5kaW5nIG9yZGVyIHBheW1lbnRzIHdpbGwgYmVnaW4gb24gdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgYHN0YXJ0X2RhdGVgLiAgSWYgdGhlIGZpcnN0IGBpbnRlcnZhbF9leGVjdXRpb25fZGF5YCBvbiBvciBhZnRlciB0aGUgc3RhcnQgZGF0ZSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBTdGFuZGluZyBvcmRlciBwYXltZW50cyB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgb25seSBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgYmV0d2VlbiB0aGUgc3RhcnQgZGF0ZSBhbmQgdGhlIGVuZCBkYXRlIChpbmNsdXNpdmUpIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIHdhcyBjYWxsZWQsIHRoZSBiYW5rICptYXkqIG1ha2UgYSBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0aW5nIGZvciBob2xpZGF5cyBvciB3ZWVrZW5kcy4gIFdpbGwgYmUgcHJvdmlkZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gSWYgdGhlIHN0YXJ0IGRhdGUgZGlkIG5vdCByZXF1aXJlIGFkanVzdG1lbnQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRqdXN0ZWRfc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFR5cGVzIG9mIGRvY3VtZW50IGZvcm1hdHMuIChTdWdnZXN0ZWQgdmFsdWVzKVxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYQ29udGVudFR5cGVzIHtcbiAgICBBcHBsaWNhdGlvblBkZiA9ICdhcHBsaWNhdGlvbi9wZGYnLFxuICAgIEltYWdlR2lmID0gJ2ltYWdlL2dpZicsXG4gICAgSW1hZ2VKcGVnID0gJ2ltYWdlL2pwZWcnLFxuICAgIEltYWdlVGlmZiA9ICdpbWFnZS90aWZmJyxcbiAgICBJbWFnZVBuZyA9ICdpbWFnZS9wbmcnLFxuICAgIEFwcGxpY2F0aW9uSnNvbiA9ICdhcHBsaWNhdGlvbi9qc29uJ1xufVxuXG4vKipcbiAqIEZpbmFuY2lhbCBJbnN0aXR1dGlvbiBwcm92aWRlci1zcGVjaWZpYyBhdHRyaWJ1dGVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYRmlBdHRyaWJ1dGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhGaUF0dHJpYnV0ZSB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiBhdHRyaWJ1dGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhGaUF0dHJpYnV0ZVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhdHRyaWJ1dGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhGaUF0dHJpYnV0ZVxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG59XG4vKipcbiAqIFJFU1QgYXBwbGljYXRpb24gY29uc3RyYWludCAoSHlwZXJtZWRpYSBBcyBUaGUgRW5naW5lIE9mIEFwcGxpY2F0aW9uIFN0YXRlKVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhIYXRlb2FzTGlua1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWEhhdGVvYXNMaW5rIHtcbiAgICAvKipcbiAgICAgKiBVUkwgdG8gaW52b2tlIHRoZSBhY3Rpb24gb24gdGhlIHJlc291cmNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICBocmVmOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWEhhdGVvYXNMaW5rQWN0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBGRFhIYXRlb2FzTGlua1xuICAgICAqL1xuICAgIGFjdGlvbj86IEZEWEhhdGVvYXNMaW5rQWN0aW9uO1xuICAgIC8qKlxuICAgICAqIFJlbGF0aW9uIG9mIHRoaXMgbGluayB0byBpdHMgY29udGFpbmluZyBlbnRpdHksIGFzIGRlZmluZWQgYnkgYW5kIHdpdGggbWFueSBleGFtcGxlIHJlbGF0aW9uIHZhbHVlcyBhdCBbSUVURiBSRkM1OTg4XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzU5ODgpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYSGF0ZW9hc0xpbmtcbiAgICAgKi9cbiAgICByZWw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ29udGVudC10eXBlcyB0aGF0IGNhbiBiZSB1c2VkIGluIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICogQHR5cGUge0FycmF5PEZEWENvbnRlbnRUeXBlcz59XG4gICAgICogQG1lbWJlcm9mIEZEWEhhdGVvYXNMaW5rXG4gICAgICovXG4gICAgdHlwZXM/OiBBcnJheTxGRFhDb250ZW50VHlwZXM+O1xufVxuLyoqXG4gKiBIVFRQIE1ldGhvZCB0byB1c2UgZm9yIHRoZSByZXF1ZXN0XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhIYXRlb2FzTGlua0FjdGlvbiB7XG4gICAgR2V0ID0gJ0dFVCcsXG4gICAgUG9zdCA9ICdQT1NUJyxcbiAgICBQYXRjaCA9ICdQQVRDSCcsXG4gICAgRGVsZXRlID0gJ0RFTEVURScsXG4gICAgUHV0ID0gJ1BVVCdcbn1cblxuLyoqXG4gKiBJbml0aWF0b3IgRmkgQXR0cmlidXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYSW5pdGlhdG9yRmlBdHRyaWJ1dGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWEluaXRpYXRvckZpQXR0cmlidXRlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYUGFydHlUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBGRFhJbml0aWF0b3JGaUF0dHJpYnV0ZVxuICAgICAqL1xuICAgIHZhbHVlPzogRkRYUGFydHlUeXBlO1xufVxuLyoqXG4gKiBQcm92aWRlcyB0aGUgYmFzZSBmaWVsZHMgb2YgYSBub3RpZmljYXRpb24uIENsaWVudHMgd2lsbCByZWFkIHRoZSBgdHlwZWAgcHJvcGVydHkgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBub3RpZmljYXRpb24gcGF5bG9hZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhOb3RpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGRFhOb3RpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIElkIG9mIG5vdGlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIG5vdGlmaWNhdGlvbklkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHR5cGU6IEZEWE5vdGlmaWNhdGlvblR5cGU7XG4gICAgLyoqXG4gICAgICogSVNPIDg2MDEgZGF0ZS10aW1lIGluIGZvcm1hdCBcXCdZWVlZLU1NLUREVGhoOm1tOnNzLm5ubltafFsrfC1daGg6bW1dXFwnIGFjY29yZGluZyB0byBbSUVURiBSRkMzMzM5XShodHRwczovL3htbDJyZmMudG9vbHMuaWV0Zi5vcmcvcHVibGljL3JmYy9odG1sL3JmYzMzMzkuaHRtbCNhbmNob3IxNClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzZW50T246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIGNhdGVnb3J5OiBGRFhOb3RpZmljYXRpb25DYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uU2V2ZXJpdHl9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIHNldmVyaXR5PzogRkRYTm90aWZpY2F0aW9uU2V2ZXJpdHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblByaW9yaXR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmlvcml0eT86IEZEWE5vdGlmaWNhdGlvblByaW9yaXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uXG4gICAgICovXG4gICAgcHVibGlzaGVyPzogRkRYUGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWFBhcnR5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdWJzY3JpYmVyPzogRkRYUGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWE5vdGlmaWNhdGlvblBheWxvYWR9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblxuICAgICAqL1xuICAgIG5vdGlmaWNhdGlvblBheWxvYWQ6IEZEWE5vdGlmaWNhdGlvblBheWxvYWQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZEWEhhdGVvYXNMaW5rfVxuICAgICAqIEBtZW1iZXJvZiBGRFhOb3RpZmljYXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBGRFhIYXRlb2FzTGluaztcbn1cbi8qKlxuICogQ2F0ZWdvcnkgb2YgTm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25DYXRlZ29yeSB7XG4gICAgU2VjdXJpdHkgPSAnU0VDVVJJVFknLFxuICAgIE1haW50ZW5hbmNlID0gJ01BSU5URU5BTkNFJyxcbiAgICBGcmF1ZCA9ICdGUkFVRCcsXG4gICAgQ29uc2VudCA9ICdDT05TRU5UJyxcbiAgICBOZXdEYXRhID0gJ05FV19EQVRBJ1xufVxuXG4vKipcbiAqIEN1c3RvbSBrZXktdmFsdWUgcGFpcnMgcGF5bG9hZCBmb3IgYSBub3RpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWE5vdGlmaWNhdGlvblBheWxvYWQge1xuICAgIC8qKlxuICAgICAqIElEIGZvciB0aGUgb3JpZ2luYXRpb24gZW50aXR5IHJlbGF0ZWQgdG8gdGhlIG5vdGlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWE5vdGlmaWNhdGlvblBheWxvYWRcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGlkVHlwZT86IEZEWE5vdGlmaWNhdGlvblBheWxvYWRJZFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEZEWEZpQXR0cmlidXRlPn1cbiAgICAgKiBAbWVtYmVyb2YgRkRYTm90aWZpY2F0aW9uUGF5bG9hZFxuICAgICAqL1xuICAgIGN1c3RvbUZpZWxkcz86IEFycmF5PEZEWEZpQXR0cmlidXRlPjtcbn1cbi8qKlxuICogVHlwZSBvZiBlbnRpdHkgY2F1c2luZyBvcmlnaW5hdGlvbiBvZiBhIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uUGF5bG9hZElkVHlwZSB7XG4gICAgQWNjb3VudCA9ICdBQ0NPVU5UJyxcbiAgICBDdXN0b21lciA9ICdDVVNUT01FUicsXG4gICAgUGFydHkgPSAnUEFSVFknLFxuICAgIE1haW50ZW5hbmNlID0gJ01BSU5URU5BTkNFJyxcbiAgICBDb25zZW50ID0gJ0NPTlNFTlQnXG59XG5cbi8qKlxuICogUHJpb3JpdHkgb2Ygbm90aWZpY2F0aW9uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhOb3RpZmljYXRpb25Qcmlvcml0eSB7XG4gICAgSGlnaCA9ICdISUdIJyxcbiAgICBNZWRpdW0gPSAnTUVESVVNJyxcbiAgICBMb3cgPSAnTE9XJ1xufVxuXG4vKipcbiAqIFNldmVyaXR5IGxldmVsIG9mIG5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uU2V2ZXJpdHkge1xuICAgIEVtZXJnZW5jeSA9ICdFTUVSR0VOQ1knLFxuICAgIEFsZXJ0ID0gJ0FMRVJUJyxcbiAgICBXYXJuaW5nID0gJ1dBUk5JTkcnLFxuICAgIE5vdGljZSA9ICdOT1RJQ0UnLFxuICAgIEluZm8gPSAnSU5GTydcbn1cblxuLyoqXG4gKiBUeXBlIG9mIE5vdGlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYTm90aWZpY2F0aW9uVHlwZSB7XG4gICAgQ29uc2VudFJldm9rZWQgPSAnQ09OU0VOVF9SRVZPS0VEJyxcbiAgICBDb25zZW50VXBkYXRlZCA9ICdDT05TRU5UX1VQREFURUQnLFxuICAgIEN1c3RvbSA9ICdDVVNUT00nLFxuICAgIFNlcnZpY2UgPSAnU0VSVklDRScsXG4gICAgQmFsYW5jZSA9ICdCQUxBTkNFJyxcbiAgICBQbGFubmVkT3V0YWdlID0gJ1BMQU5ORURfT1VUQUdFJ1xufVxuXG4vKipcbiAqIEZEWCBQYXJ0aWNpcGFudCAtIGFuIGVudGl0eSBvciBwZXJzb24gdGhhdCBpcyBhIHBhcnQgb2YgYSBGRFggQVBJIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZEWFBhcnR5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRkRYUGFydHkge1xuICAgIC8qKlxuICAgICAqIEh1bWFuIHJlY29nbml6YWJsZSBjb21tb24gbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgdHlwZTogRkRYUGFydHlUeXBlO1xuICAgIC8qKlxuICAgICAqIFVSSSBmb3IgcGFydHksIHdoZXJlIGFuIGVuZCB1c2VyIGNvdWxkIGxlYXJuIG1vcmUgYWJvdXQgdGhlIGNvbXBhbnkgb3IgYXBwbGljYXRpb24gaW52b2x2ZWQgaW4gdGhlIGRhdGEgc2hhcmluZyBjaGFpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZEWFBhcnR5XG4gICAgICovXG4gICAgaG9tZVVyaT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkkgZm9yIGEgbG9nbyBhc3NldCB0byBiZSBkaXNwbGF5ZWQgdG8gdGhlIGVuZCB1c2VyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUGFydHlcbiAgICAgKi9cbiAgICBsb2dvVXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGRFhQYXJ0eVJlZ2lzdHJ5fVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdHJ5PzogRkRYUGFydHlSZWdpc3RyeTtcbiAgICAvKipcbiAgICAgKiBSZWdpc3RlcmVkIG5hbWUgb2YgcGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdGVyZWRFbnRpdHlOYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlZ2lzdGVyZWQgaWQgb2YgcGFydHlcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhQYXJ0eVxuICAgICAqL1xuICAgIHJlZ2lzdGVyZWRFbnRpdHlJZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlZ2lzdHJ5IGNvbnRhaW5pbmcgdGhlIHBhcnR54oCZcyByZWdpc3RyYXRpb24gd2l0aCBuYW1lIGFuZCBpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gRkRYUGFydHlSZWdpc3RyeSB7XG4gICAgRmR4ID0gJ0ZEWCcsXG4gICAgR2xlaWYgPSAnR0xFSUYnLFxuICAgIEljYW5uID0gJ0lDQU5OJyxcbiAgICBQcml2YXRlID0gJ1BSSVZBVEUnXG59XG5cbi8qKlxuICogSWRlbnRpZmllcyB0aGUgdHlwZSBvZiBhIHBhcnR5XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGRFhQYXJ0eVR5cGUge1xuICAgIERhdGFBY2Nlc3NQbGF0Zm9ybSA9ICdEQVRBX0FDQ0VTU19QTEFURk9STScsXG4gICAgRGF0YVByb3ZpZGVyID0gJ0RBVEFfUFJPVklERVInLFxuICAgIERhdGFSZWNpcGllbnQgPSAnREFUQV9SRUNJUElFTlQnLFxuICAgIEluZGl2aWR1YWwgPSAnSU5ESVZJRFVBTCcsXG4gICAgTWVyY2hhbnQgPSAnTUVSQ0hBTlQnLFxuICAgIFZlbmRvciA9ICdWRU5ET1InXG59XG5cbi8qKlxuICogUmVjaXBpZW50IG1ldGFkYXRhIGZpZWxkcyB0aGF0IGFyZSBkZWZpbmVkIGJ5IEZEWFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZEWFJlY2lwaWVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWNpcGllbnQgbmFtZSBkaXNwbGF5ZWQgYnkgdGhlIERhdGEgUHJvdmlkZXIgZHVyaW5nIHRoZSBjb25zZW50IGZsb3dcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGNsaWVudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0YSBSZWNpcGllbnQgTG9nbyBVUkwgbG9jYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGRFhSZWNpcGllbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxvZ29fdXJpPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRkRYUmVjaXBpZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9sZWdhbF9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVzIHdoZW4gYW4gYWNjb3VudCBpcyBhdXRvbWF0aWNhbGx5IHZlcmlmaWVkIHVzaW5nIG1pY3JvLWRlcG9zaXRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEFVVE9NQVRJQ0FMTFlfVkVSSUZJRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRBdXRvVmVyaWZpZWRXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHRlcm5hbCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWljcm8tZGVwb3NpdFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdEF1dG9WZXJpZmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0QXV0b1ZlcmlmaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVzIHdoZW4gYW4gYWNjb3VudCBoYXMgYW4gZXhwaXJlZCB2ZXJpZmljYXRpb24gd2hlbiB1c2luZyBtaWNyby1kZXBvc2l0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhbGxiYWNrQXV0aE1pY3JvZGVwb3NpdFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pY3JvLWRlcG9zaXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGYWxsYmFja0F1dGhNaWNyb2RlcG9zaXRWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgRmFsbGJhY2tBdXRoTWljcm9kZXBvc2l0VmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJbnNpZ2h0cyBzdXJyb3VuZGluZyBleHRlcm5hbCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY291bnRlcnBhcnRpZXMgYXNzb2NpYXRlZCB3aXRoIGEgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbmFuY2lhbEluc3RpdHV0aW9uSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSwgc3RhYmxlLCBQbGFpZC1nZW5lcmF0ZWQgaWQgdGhhdCBtYXBzIHRvIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRmluYW5jaWFsSW5zdGl0dXRpb25JbnNpZ2h0c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXNzb2NpYXRlZCBhY2NvdW50cywgZGV0ZWN0ZWQgYmFzZWQgb24gdGhlIG5hdHVyZSBvZiB0cmFuc2ZlcnMgdG8vZnJvbSB0aGlzIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxEZXRlY3RlZEFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBGaW5hbmNpYWxJbnN0aXR1dGlvbkluc2lnaHRzXG4gICAgICovXG4gICAgZGV0ZWN0ZWRfYWNjb3VudHM6IEFycmF5PERldGVjdGVkQWNjb3VudD47XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGZpeGVkIGluY29tZSBzZWN1cml0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRml4ZWRJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaXhlZEluY29tZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lpZWxkUmF0ZX1cbiAgICAgKiBAbWVtYmVyb2YgRml4ZWRJbmNvbWVcbiAgICAgKi9cbiAgICB5aWVsZF9yYXRlOiBZaWVsZFJhdGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXR1cml0eSBkYXRlIGZvciB0aGlzIGZpeGVkIGluY29tZSBzZWN1cml0eSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEZpeGVkSW5jb21lXG4gICAgICovXG4gICAgbWF0dXJpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaXNzdWUgZGF0ZSBmb3IgdGhpcyBmaXhlZCBpbmNvbWUgc2VjdXJpdHksIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBGaXhlZEluY29tZVxuICAgICAqL1xuICAgIGlzc3VlX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZhY2UgdmFsdWUgdGhhdCBpcyBwYWlkIHVwb24gbWF0dXJpdHkgb2YgdGhlIGZpeGVkIGluY29tZSBzZWN1cml0eSwgcGVyIHVuaXQgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgRml4ZWRJbmNvbWVcbiAgICAgKi9cbiAgICBmYWNlX3ZhbHVlOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBwcmVkaWN0ZWQgYXZlcmFnZSBtb250aGx5IG5ldCBpbmNvbWUgYW1vdW50LiBUaGlzIGFtb3VudCByZWZsZWN0cyB0aGUgZnVuZHMgZGVwb3NpdGVkIGludG8gdGhlIGFjY291bnQgYW5kIG1heSBub3QgaW5jbHVkZSBhbnkgd2l0aGhlbGQgaW5jb21lIHN1Y2ggYXMgdGF4ZXMgb3Igb3RoZXIgcGF5cm9sbCBkZWR1Y3Rpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yZWNhc3RlZE1vbnRobHlJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmb3JlY2FzdGVkIG1vbnRobHkgaW5jb21lIGF0IHRoZSB0aW1lIG9mIHN1YnNjcmlwdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gICAgICovXG4gICAgYmFzZWxpbmVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgZm9yZWNhc3RlZCBtb250aGx5IGluY29tZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZvcmVjYXN0ZWRNb250aGx5SW5jb21lXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogRm9ybSAxMDk5IFR5cGVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEZvcm0xMDk5VHlwZSB7XG4gICAgVW5rbm93biA9ICdGT1JNXzEwOTlfVFlQRV9VTktOT1dOJyxcbiAgICBNaXNjID0gJ0ZPUk1fMTA5OV9UWVBFX01JU0MnLFxuICAgIEsgPSAnRk9STV8xMDk5X1RZUEVfSydcbn1cblxuLyoqXG4gKiBBbiBhcmJpdHJhcnkgSlNPTiBwYXlsb2FkIHNlbnQgdG8gb3IgcmVjZWl2ZWQgZnJvbSB0aGUgUGxhaWQgc2VydmVyLiBJbnRlcm5hbCB1c2Ugb25seS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRm9yd2FyZGVkSlNPTlJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9yd2FyZGVkSlNPTlJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgRm9yd2FyZGVkSlNPTlJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiB0aGUgZnJhdWQgb3IgYXR0ZW1wdGVkIGZyYXVkLiBgZnJhdWRfYW1vdW50YCBzaG91bGQgYmUgb21pdHRlZCB0byBpbmRpY2F0ZSBhbiB1bmtub3duIGZyYXVkIGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRnJhdWRBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcmF1ZEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogSVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdmFsdWUuIFRoaXMgdmFsdWUgY2FuIGJlIDAgdG8gaW5kaWNhdGUgbm8gbW9uZXkgd2FzIGxvc3QuIE11c3Qgbm90IGNvbnRhaW4gbW9yZSB0aGFuIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIChlLmcuLCBgMS4yM2ApLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW1vdW50XG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZnJhdWQgYW5hbHlzaXMgcGVyZm9ybWVkIG9uIHRoZSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGcmF1ZEFuYWx5c2lzRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ZyYXVkQ2hlY2tPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBGcmF1ZEFuYWx5c2lzRGV0YWlsc1xuICAgICAqL1xuICAgIHR5cGVfc3VwcG9ydGVkOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgcG9ydHJhaXRfcHJlc2VuY2VfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBwb3J0cmFpdF9kZXRhaWxzX2NoZWNrOiBGcmF1ZENoZWNrT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RnJhdWRDaGVja091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgaW1hZ2VfY29tcG9zaXRpb25fY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBpbnRlZ3JpdHlfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgRnJhdWRBbmFseXNpc0RldGFpbHNcbiAgICAgKi9cbiAgICBkZXRhaWxfY2hlY2s6IEZyYXVkQ2hlY2tPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGcmF1ZENoZWNrT3V0Y29tZVdpdGhOb0RhdGF9XG4gICAgICogQG1lbWJlcm9mIEZyYXVkQW5hbHlzaXNEZXRhaWxzXG4gICAgICovXG4gICAgaXNzdWVfZGF0ZV9jaGVjazogRnJhdWRDaGVja091dGNvbWVXaXRoTm9EYXRhO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiB0aGUgZnJhdWQgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGcmF1ZENoZWNrT3V0Y29tZSB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIHRoZSBmcmF1ZCBjaGVjaywgd2hlbiBhdmFpbGFibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBGcmF1ZENoZWNrT3V0Y29tZVdpdGhOb0RhdGEge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogQW5hbHl6ZWQgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdIaXRMb2NhdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEdlbmVyaWNTY3JlZW5pbmdIaXRMb2NhdGlvbkl0ZW1zXG4gICAgICovXG4gICAgZGF0YT86IFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9ucztcbn1cbi8qKlxuICogR2V0UmVjaXBpZW50UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ZkeC9yZWNpcGllbnQve3JlY2lwaWVudElkfWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRSZWNpcGllbnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJlY2lwaWVudCBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjaXBpZW50IG5hbWUgZGlzcGxheWVkIGJ5IHRoZSBEYXRhIFByb3ZpZGVyIGR1cmluZyB0aGUgY29uc2VudCBmbG93XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGEgUmVjaXBpZW50IExvZ28gVVJMIGxvY2F0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsb2dvX3VyaT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxlZ2FsIG5hbWUgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEdldFJlY2lwaWVudFJlc3BvbnNlXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfbGVnYWxfbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBHZXRSZWNpcGllbnRzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ZkeC9yZWNpcGllbnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBHZXRSZWNpcGllbnRzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXRSZWNpcGllbnRzUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxFeHRlbmRlZFJlY2lwaWVudE1ldGFkYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgR2V0UmVjaXBpZW50c1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50czogQXJyYXk8RXh0ZW5kZWRSZWNpcGllbnRNZXRhZGF0YT47XG59XG4vKipcbiAqIEEgc3RhdHVzIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIZWFsdGhJbmNpZGVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhlYWx0aEluY2lkZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBvZiB0aGUgaW5jaWRlbnQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRlIG9mIHRoZSBpbmNpZGVudCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAyMC0xMC0zMFQxNToyNjo0OFpcXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdGl0bGUgb2YgdGhlIGluY2lkZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGVhbHRoSW5jaWRlbnRcbiAgICAgKi9cbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgb24gdGhlIGhlYWx0aCBpbmNpZGVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jaWRlbnRVcGRhdGU+fVxuICAgICAqIEBtZW1iZXJvZiBIZWFsdGhJbmNpZGVudFxuICAgICAqL1xuICAgIGluY2lkZW50X3VwZGF0ZXM6IEFycmF5PEluY2lkZW50VXBkYXRlPjtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gZGF0YSBwcm92aWRlZCBieSB1c2VyIGFuZCBkYXRhIGNoZWNrZWQgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZS4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuICBgcGFydGlhbF9tYXRjaGAgaW5kaWNhdGVzIHRoZSBkYXRhIGFwcHJveGltYXRlbHkgbWF0Y2hlZCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuIEZvciBleGFtcGxlLCBcXFwiS25vcGVcXFwiIHZzLiBcXFwiS25vcGUtV3lhdHRcXFwiIGZvciBsYXN0IG5hbWUuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyBhYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gZmluZCBleHRlcm5hbCBkYXRhIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19pbnB1dGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYmVjYXVzZSBubyBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgZmllbGQgYnkgdGhlIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YScsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBoaXN0b3JpY2FsIGFubnVhbCBpbmNvbWUgYW1vdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsQW5udWFsSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbEFubnVhbEluY29tZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGhpc3RvcmljYWwgYW5udWFsIGluY29tZSBhdCB0aGUgdGltZSBvZiBzdWJzY3JpcHRpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQW5udWFsSW5jb21lXG4gICAgICovXG4gICAgYmFzZWxpbmVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgaGlzdG9yaWNhbCBhbm51YWwgaW5jb21lXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEFubnVhbEluY29tZVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBiYWxhbmNlIGhlbGQgYnkgYW4gYWNjb3VudCBpbiB0aGUgcGFzdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIaXN0b3JpY2FsQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhpc3RvcmljYWxCYWxhbmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgY2FsY3VsYXRlZCBoaXN0b3JpY2FsIGJhbGFuY2UsIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsQmFsYW5jZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LCBjYWxjdWxhdGVkIGZyb20gdGhlIGBjdXJyZW50YCBiYWxhbmNlIGluIHRoZSBgYmFsYW5jZWAgb2JqZWN0IGJ5IHN1YnRyYWN0aW5nIGluZmxvd3MgYW5kIGFkZGluZyBiYWNrIG91dGZsb3dzIGFjY29yZGluZyB0byB0aGUgcG9zdGVkIGRhdGUgb2YgZWFjaCB0cmFuc2FjdGlvbi4gIElmIHRoZSBhY2NvdW50IGhhcyBhbnkgcGVuZGluZyB0cmFuc2FjdGlvbnMsIGhpc3RvcmljYWwgYmFsYW5jZSBhbW91bnRzIG9uIG9yIGFmdGVyIHRoZSBkYXRlIG9mIHRoZSBlYXJsaWVzdCBwZW5kaW5nIHRyYW5zYWN0aW9uIG1heSBkaWZmZXIgaWYgcmV0cmlldmVkIGluIHN1YnNlcXVlbnQgQXNzZXQgUmVwb3J0cyBhcyBhIHJlc3VsdCBvZiB0aG9zZSBwZW5kaW5nIHRyYW5zYWN0aW9ucyBwb3N0aW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgY3VycmVudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbEJhbGFuY2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhpc3RvcmljYWxCYWxhbmNlXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIFRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSElTVE9SSUNBTF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBhdmFpbGFibGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHNlY3VyaXRpZXMgaG9sZGluZyBhdCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSG9sZGluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvbGRpbmcge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBzZWN1cml0eV9pZGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBob2xkaW5nLiBTZWN1cml0eSBkYXRhIGlzIG5vdCBzcGVjaWZpYyB0byBhIHVzZXJcXCdzIGFjY291bnQ7IGFueSB1c2VyIHdobyBoZWxkIHRoZSBzYW1lIHNlY3VyaXR5IGF0IHRoZSBzYW1lIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhdCB0aGUgc2FtZSB0aW1lIHdvdWxkIGhhdmUgaWRlbnRpY2FsIHNlY3VyaXR5IGRhdGEuIFRoZSBgc2VjdXJpdHlfaWRgIGZvciB0aGUgc2FtZSBzZWN1cml0eSB3aWxsIHR5cGljYWxseSBiZSB0aGUgc2FtZSBhY3Jvc3MgZGlmZmVyZW50IGluc3RpdHV0aW9ucywgYnV0IHRoaXMgaXMgbm90IGd1YXJhbnRlZWQuIFRoZSBgc2VjdXJpdHlfaWRgIGRvZXMgbm90IHR5cGljYWxseSBjaGFuZ2UsIGJ1dCBtYXkgY2hhbmdlIGlmIGluaGVyZW50IGRldGFpbHMgb2YgdGhlIHNlY3VyaXR5IGNoYW5nZSBkdWUgdG8gYSBjb3Jwb3JhdGUgYWN0aW9uLCBmb3IgZXhhbXBsZSwgaW4gdGhlIGV2ZW50IG9mIGEgdGlja2VyIHN5bWJvbCBjaGFuZ2Ugb3IgQ1VTSVAgY2hhbmdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHByaWNlIGdpdmVuIGJ5IHRoZSBpbnN0aXR1dGlvbiBmb3IgdGhpcyBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LCBpbiBJU08gODYwMSBmb3JtYXQgKFlZWVktTU0tRERUSEg6bW06c3NaKS4gIFRoaXMgZmllbGQgaXMgcmV0dXJuZWQgZm9yIHNlbGVjdCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBjb21lcyBhcyBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uIEl0IG1heSBjb250YWluIGRlZmF1bHQgdGltZSB2YWx1ZXMgKHN1Y2ggYXMgMDA6MDA6MDApLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2VfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaG9sZGluZywgYXMgcmVwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl92YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjb3N0IGJhc2lzIG9mIHRoZSBob2xkaW5nIChlLmcuLCB0aGUgdG90YWwgYW1vdW50IHNwZW50IHRvIGFjcXVpcmUgYWxsIGFzc2V0cyBjdXJyZW50bHkgaW4gdGhlIGhvbGRpbmcpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICBjb3N0X2Jhc2lzOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB0aGUgYXNzZXQgaGVsZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgdGhlIHNlY3VyaXR5IGlzIGFuIG9wdGlvbiwgYHF1YW50aXR5YCB3aWxsIHJlZmxlY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvcHRpb25zICh0eXBpY2FsbHkgdGhlIG51bWJlciBvZiBjb250cmFjdHMgbXVsdGlwbGllZCBieSAxMDApLCBub3QgdGhlIG51bWJlciBvZiBjb250cmFjdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ1xuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGhvbGRpbmcuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBxdWFudGl0eSBvZiB2ZXN0ZWQgYXNzZXRzIGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIFZlc3RlZCBhc3NldHMgYXJlIG9ubHkgYXNzb2NpYXRlZCB3aXRoIFtlcXVpdGllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzLWhvbGRpbmdzLWdldC1yZXNwb25zZS1zZWN1cml0aWVzLXR5cGUpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdcbiAgICAgKi9cbiAgICB2ZXN0ZWRfcXVhbnRpdHk/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgdmVzdGVkIGhvbGRpbmdzIGFzIHJlcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nXG4gICAgICovXG4gICAgdmVzdGVkX3ZhbHVlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBuZXcgb3IgdXBkYXRlZCBob2xkaW5ncyBoYXZlIGJlZW4gZGV0ZWN0ZWQgb24gYW4gaW52ZXN0bWVudCBhY2NvdW50LiBUaGUgd2ViaG9vayB0eXBpY2FsbHkgZmlyZXMgaW4gcmVzcG9uc2UgdG8gYW55IG5ld2x5IGFkZGVkIGhvbGRpbmdzIG9yIHByaWNlIGNoYW5nZXMgdG8gZXhpc3RpbmcgaG9sZGluZ3MsIG1vc3QgY29tbW9ubHkgYWZ0ZXIgbWFya2V0IGNsb3NlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYEhPTERJTkdTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyBob2xkaW5ncyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19ob2xkaW5nczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdXBkYXRlZCBob2xkaW5ncyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHVwZGF0ZWRfaG9sZGluZ3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU3BlY2lmeSB0aGUgaG9sZGluZ3Mgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvbGRpbmdzT3ZlcnJpZGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb2xkaW5nc092ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBwcmljZSBnaXZlbiBieSB0aGUgaW5zdGl0dXRpb24gZm9yIHRoaXMgc2VjdXJpdHlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhdCB3aGljaCBgaW5zdGl0dXRpb25fcHJpY2VgIHdhcyBjdXJyZW50LiBNdXN0IGJlIGZvcm1hdHRlZCBhcyBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9wcmljZV9hc19vZj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgY29zdCBiYXNpcyBvZiB0aGUgaG9sZGluZyAoZS5nLiwgdGhlIHRvdGFsIGFtb3VudCBzcGVudCB0byBhY3F1aXJlIGFsbCBhc3NldHMgY3VycmVudGx5IGluIHRoZSBob2xkaW5nKS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgY29zdF9iYXNpcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgcXVhbnRpdHkgb2YgdGhlIGFzc2V0IGhlbGQsIGFzIHJlcG9ydGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSG9sZGluZ3NPdmVycmlkZVxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogRWl0aGVyIGEgdmFsaWQgYGlzb19jdXJyZW5jeV9jb2RlYCBvciBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvbGRpbmdzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWN1cml0eU92ZXJyaWRlfVxuICAgICAqIEBtZW1iZXJvZiBIb2xkaW5nc092ZXJyaWRlXG4gICAgICovXG4gICAgc2VjdXJpdHk6IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEhvdyBQbGFpZCBzaG91bGQgZGVsaXZlciB0aGUgUGxhaWQgTGluayBzZXNzaW9uIHRvIHRoZSBjdXN0b21lci4gT25seSBhdmFpbGFibGUgdG8gY3VzdG9tZXJzIGVuYWJsZWQgZm9yIExpbmsgRGVsaXZlcnkgKGJldGEpLiBUbyByZXF1ZXN0IExpbmsgRGVsaXZlcnkgYWNjZXNzLCBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyLiBcXCdzbXNcXCcgd2lsbCBkZWxpdmVyIHZpYSBTTVMuIE11c3QgcGFzcyBgdXNlci5waG9uZV9udW1iZXJgLiBcXCdlbWFpbFxcJyB3aWxsIGRlbGl2ZXIgdmlhIGVtYWlsLiBNdXN0IHBhc3MgYHVzZXIuZW1haWxfYWRkcmVzc2AuIEluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCB0aGlzIGZpZWxkIHdpbGwgYmUgaWdub3JlZDsgdXNlIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IHRvIHRlc3QgTGluayBEZWxpdmVyeSBpbnN0ZWFkLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEhvc3RlZExpbmtEZWxpdmVyeU1ldGhvZCB7XG4gICAgU21zID0gJ3NtcycsXG4gICAgRW1haWwgPSAnZW1haWwnXG59XG5cbi8qKlxuICogQ29udGFpbnMgdGhlIHN0YXRlIG9mIGEgU01TIHNhbWUtZGF5IG1pY3JvZGVwb3NpdHMgdmVyaWZpY2F0aW9uIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBIb3N0ZWRNTURWZXJpZmljYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZpbmFsIHN0YXR1cyBvZiB0aGUgc2FtZS1kYXkgbWljcm9kZXBvc2l0cyB2ZXJpZmljYXRpb24uIFdpbGwgYWx3YXlzIGJlIGBNQU5VQUxMWV9WRVJJRklFRGAgb3IgYFZFUklGSUNBVElPTl9GQUlMRURgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBvZiB0aGUgYWZmZWN0ZWQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEhvc3RlZE1NRFZlcmlmaWNhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSG9zdGVkTU1EVmVyaWZpY2F0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50PzogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIGdsb2JhbGx5IHVuaXF1ZSBhbmQgaHVtYW4gcmVhZGFibGUgSUQgdHlwZSwgc3BlY2lmaWMgdG8gdGhlIGNvdW50cnkgYW5kIGRvY3VtZW50IGNhdGVnb3J5LiBGb3IgbW9yZSBjb250ZXh0IG9uIHRoaXMgZmllbGQsIHNlZSBbSHlicmlkIElucHV0IFZhbGlkYXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElETnVtYmVyVHlwZSB7XG4gICAgQXJEbmkgPSAnYXJfZG5pJyxcbiAgICBBdURyaXZlcnNMaWNlbnNlID0gJ2F1X2RyaXZlcnNfbGljZW5zZScsXG4gICAgQXVQYXNzcG9ydCA9ICdhdV9wYXNzcG9ydCcsXG4gICAgQnJDcGYgPSAnYnJfY3BmJyxcbiAgICBDYVNpbiA9ICdjYV9zaW4nLFxuICAgIENsUnVuID0gJ2NsX3J1bicsXG4gICAgQ25SZXNpZGVudENhcmQgPSAnY25fcmVzaWRlbnRfY2FyZCcsXG4gICAgQ29OaXQgPSAnY29fbml0JyxcbiAgICBEa0NwciA9ICdka19jcHInLFxuICAgIEVnTmF0aW9uYWxJZCA9ICdlZ19uYXRpb25hbF9pZCcsXG4gICAgRXNEbmkgPSAnZXNfZG5pJyxcbiAgICBFc05pZSA9ICdlc19uaWUnLFxuICAgIEhrSGtpZCA9ICdoa19oa2lkJyxcbiAgICBJblBhbiA9ICdpbl9wYW4nLFxuICAgIEl0Q2YgPSAnaXRfY2YnLFxuICAgIEpvQ2l2aWxJZCA9ICdqb19jaXZpbF9pZCcsXG4gICAgSnBNeU51bWJlciA9ICdqcF9teV9udW1iZXInLFxuICAgIEtlSHVkdW1hTmFtYmEgPSAna2VfaHVkdW1hX25hbWJhJyxcbiAgICBLd0NpdmlsSWQgPSAna3dfY2l2aWxfaWQnLFxuICAgIE14Q3VycCA9ICdteF9jdXJwJyxcbiAgICBNeFJmYyA9ICdteF9yZmMnLFxuICAgIE15TnJpYyA9ICdteV9ucmljJyxcbiAgICBOZ05pbiA9ICduZ19uaW4nLFxuICAgIE56RHJpdmVyc0xpY2Vuc2UgPSAnbnpfZHJpdmVyc19saWNlbnNlJyxcbiAgICBPbUNpdmlsSWQgPSAnb21fY2l2aWxfaWQnLFxuICAgIFBoUHNuID0gJ3BoX3BzbicsXG4gICAgUGxQZXNlbCA9ICdwbF9wZXNlbCcsXG4gICAgUm9DbnAgPSAncm9fY25wJyxcbiAgICBTYU5hdGlvbmFsSWQgPSAnc2FfbmF0aW9uYWxfaWQnLFxuICAgIFNlUGluID0gJ3NlX3BpbicsXG4gICAgU2dOcmljID0gJ3NnX25yaWMnLFxuICAgIFRyVGNLaW1saWsgPSAndHJfdGNfa2ltbGlrJyxcbiAgICBVc1NzbiA9ICd1c19zc24nLFxuICAgIFVzU3NuTGFzdDQgPSAndXNfc3NuX2xhc3RfNCcsXG4gICAgWmFTbWFydElkID0gJ3phX3NtYXJ0X2lkJ1xufVxuXG4vKipcbiAqIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJU09DdXJyZW5jeUNvZGUge1xuICAgIFVzZCA9ICdVU0QnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhIGNoYW5nZSB0byBpZGVudGl0eSBkYXRhIGhhcyBiZWVuIGRldGVjdGVkIG9uIGFuIEl0ZW0uIEl0ZW1zIGFyZSBjaGVja2VkIGZvciBpZGVudGl0eSB1cGRhdGVzIGV2ZXJ5IDMwLTkwIGRheXMuIFdlIHJlY29tbWVuZCB0aGF0IHVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vayB5b3UgbWFrZSBhbm90aGVyIGNhbGwgdG8gYC9pZGVudGl0eS9nZXRgIHRvIGZldGNoIHRoZSB1c2VyXFwncyBsYXRlc3QgaWRlbnRpdHkgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYERFRkFVTFRfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBvYmplY3Qgd2l0aCBrZXlzIG9mIGBhY2NvdW50X2lkYFxcJ3MgdGhhdCBhcmUgbWFwcGVkIHRvIHRoZWlyIHJlc3BlY3RpdmUgaWRlbnRpdHkgYXR0cmlidXRlcyB0aGF0IGNoYW5nZWQuICBFeGFtcGxlOiBgeyBcXFwiWE1CdnZ5TUdRMVVvTGJLQnlvTXFIM25YTWo4NEFMU2RFNUI1OFxcXCI6IFtcXFwiUEhPTkVTXFxcIl0gfWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogQXJyYXk8SWRlbnRpdHlVcGRhdGVUeXBlcz47IH19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfaWRlbnRpdHk6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8SWRlbnRpdHlVcGRhdGVUeXBlcz47IH07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluIGNsb3NlZCBiZXRhLiBPYmplY3QgcmVwcmVzZW50aW5nIG1ldGFkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmllbGQgaW5kaWNhdGluZyBpZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcXCdzIGFjY291bnQgbnVtYmVyIG1hdGNoZXMgdGhlIGFjY291bnQgbnVtYmVyIHdlIGhhdmUgb24gZmlsZVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X251bWJlcl9tYXRjaD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbGFzdF91cGRhdGVkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHVwbG9hZGVkX2F0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEb2N1bWVudCBvYmplY3Qgd2l0aCBtZXRhZGF0YSBvZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWQge1xuICAgIC8qKlxuICAgICAqIEEgVVVJRCBpZGVudGlmeWluZyB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eURvY3VtZW50VXBsb2FkTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFxuICAgICAqL1xuICAgIHJpc2tfaW5zaWdodHM/OiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzO1xufVxuLyoqXG4gKiBNZXRhZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3VibWl0dGVkIGRvY3VtZW50IHR5cGUuIEN1cnJlbnRseSwgdGhpcyB3aWxsIGFsd2F5cyBiZSBgQkFOS19TVEFURU1FTlRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIGRvY3VtZW50X3R5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEJvb2xlYW4gZmllbGQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB1cGxvYWRlZCBkb2N1bWVudFxcJ3MgYWNjb3VudCBudW1iZXIgbWF0Y2hlcyB0aGUgYWNjb3VudCBudW1iZXIgd2UgaGF2ZSBvbiBmaWxlLiBJZiBgZmFsc2VgLCBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gYWNjZXB0IHRoZSB1cGxvYWRlZCBpZGVudGl0eSBkYXRhIGFzIGFjY3VyYXRlIHdpdGhvdXQgZnVydGhlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIGlzX2FjY291bnRfbnVtYmVyX21hdGNoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZE1ldGFkYXRhXG4gICAgICovXG4gICAgcGFnZV9jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRpbWVzdGFtcCB3aGVuIHRoZSBkb2N1bWVudCB3YXMgbGFzdCB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxhc3RfdXBkYXRlZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGRvY3VtZW50IHdhcyBvcmlnaW5hbGx5IHVwbG9hZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRNZXRhZGF0YVxuICAgICAqL1xuICAgIHVwbG9hZGVkX2F0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgcmVwcmVzZW50aW5nIGZyYXVkIHJpc2sgZGF0YSBvZiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQuIE9ubHkgcHJvdmlkZWQgd2hlbiB1c2luZyBJZGVudGl0eSBEb2N1bWVudCBVcGxvYWQgd2l0aCBGcmF1ZCBSaXNrIGVuYWJsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzXG4gICAgICovXG4gICAgcmlza19zdW1tYXJ5PzogSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHJpc2sgc2lnbmFscy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza0luc2lnaHRzXG4gICAgICovXG4gICAgcmlza19zaWduYWxzPzogQXJyYXk8SWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWw+O1xufVxuLyoqXG4gKiBSaXNrIHNpZ25hbHMgdGllZCB0byB0aGUgZG9jdW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbCB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcmlzayBmb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbFxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGZyYXVkIHJpc2sgd2FzIGRldGVjdGVkIG9uIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudFVwbG9hZFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICBoYXNfZnJhdWRfcmlzaz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZXhwbGFuYXRpb24gcHJvdmlkaW5nIG1vcmUgZGV0YWlsIGFib3V0IHRoZSBzcGVjaWZpYyByaXNrIHNpZ25hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1NpZ25hbFxuICAgICAqL1xuICAgIHNpZ25hbF9kZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IHBhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByaXNrIHNpZ25hbC4gSWYgdGhlIHJpc2sgc2lnbmFsIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBwYWdlLCB0aGUgdmFsdWUgd2lsbCBiZSAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU2lnbmFsXG4gICAgICovXG4gICAgcGFnZV9udW1iZXI/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBSaXNrIHN1bW1hcnkgb2YgYW4gdXBsb2FkZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRVcGxvYWRSaXNrU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogQSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAsIGluY2x1c2l2ZSwgd2hlcmUgYSBzY29yZSBjbG9zZXIgdG8gMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgdHJ1c3R3b3J0aHkgYW5kIGEgc2NvcmUgY2xvc2VyIHRvIDEwMCBpbmRpY2F0ZXMgYSBkb2N1bWVudCBpcyBsaWtlbHkgdG8gYmUgZnJhdWR1bGVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50VXBsb2FkUmlza1N1bW1hcnlcbiAgICAgKi9cbiAgICByaXNrX3Njb3JlPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHlEb2N1bWVudFVwbG9hZD59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eURvY3VtZW50VXBsb2FkPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pZGVudGl0eS9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5R2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eUdldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSWRlbnRpdHlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBJZGVudGl0eSBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50SWRlbnRpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRJZGVudGl0eT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtOiBJdGVtO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJZGVudGl0eU1hdGNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5TWF0Y2hVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eU1hdGNoVXNlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJZGVudGl0eU1hdGNoUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgL2lkZW50aXR5L21hdGNoIHJlc3VsdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHBlcmZvcm0gZnV6enkgbWF0Y2hcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJZGVudGl0eU1hdGNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L21hdGNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eU1hdGNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50cyBmb3Igd2hpY2ggSWRlbnRpdHkgbWF0Y2ggaGFzIGJlZW4gcmVxdWVzdGVkXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRJZGVudGl0eU1hdGNoU2NvcmU+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudElkZW50aXR5TWF0Y2hTY29yZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW19XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUsIHBob25lIG51bWJlciwgZW1haWwgYWRkcmVzcyBhbmQgYWRkcmVzcyB1c2VkIHRvIHBlcmZvcm0gZnV6enkgbWF0Y2guIElmIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIGlzIGVuYWJsZWQgaW4gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0LCBsZWF2ZSB0aGlzIGZpZWxkIGVtcHR5IHRvIGF1dG9tYXRpY2FsbHkgbWF0Y2ggYWdhaW5zdCBQSUkgY29sbGVjdGVkIGZyb20gdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBjaGVja3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5TWF0Y2hVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlNYXRjaFVzZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBmdWxsIGxlZ2FsIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLCBpbiBFLjE2NCBmb3JtYXQ6ICt7Y291bnRyeWNvZGV9e251bWJlcn0uIEZvciBleGFtcGxlOiBcXFwiKzE0MTU3NDUyMTMwXFxcIi4gUGhvbmUgbnVtYmVycyBwcm92aWRlZCBpbiBvdGhlciBmb3JtYXRzIHdpbGwgYmUgcGFyc2VkIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuIFBob25lIG51bWJlciBpbnB1dCBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB2YWxpZCBudW1iZXIgcmFuZ2VzOyBudW1iZXIgc3RyaW5ncyB0aGF0IGRvIG5vdCBtYXRjaCBhIHJlYWwtd29ybGQgcGhvbmUgbnVtYmVyaW5nIHNjaGVtZSBtYXkgY2F1c2UgdGhlIHJlcXVlc3QgdG8gZmFpbCwgZXZlbiBpbiB0aGUgU2FuZGJveCB0ZXN0IGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5TWF0Y2hVc2VyXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eU1hdGNoVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBZGRyZXNzRGF0YU51bGxhYmxlTm9SZXF1aXJlZEZpZWxkc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlNYXRjaFVzZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogQWRkcmVzc0RhdGFOdWxsYWJsZU5vUmVxdWlyZWRGaWVsZHMgfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lkZW50aXR5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2lkZW50aXR5L3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5UmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVJlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHBvc3NpYmxlIHR5cGVzIG9mIGlkZW50aXR5IGRhdGEgdGhhdCBtYXkgaGF2ZSBjaGFuZ2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlVcGRhdGVUeXBlcyB7XG4gICAgUGhvbmVzID0gJ1BIT05FUycsXG4gICAgQWRkcmVzc2VzID0gJ0FERFJFU1NFUycsXG4gICAgRW1haWxzID0gJ0VNQUlMUycsXG4gICAgTmFtZXMgPSAnTkFNRVMnXG59XG5cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmeVNNU0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogVmVyaWZ5U01TRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBFdmVuIGlmIGFuIGFkZHJlc3MgaGFzIGJlZW4gYXV0b2ZpbGxlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSBmb3IgdGhlIGFzc29jaWF0ZWQgYWRkcmVzcy4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BPQm94U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQWRkcmVzc1xuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzXG4gICAgICovXG4gICAgdHlwZTogQWRkcmVzc1B1cnBvc2VMYWJlbDtcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eV92ZXJpZmljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogQXV0b2ZpbGwgcmVwcmVzZW50cyB1bnZlcmlmaWVkIGN1c3RvbWVyIGluZm9ybWF0aW9uLiBUaGlzIG5lZWRzIHRvIGJlIGNvbmZpcm1lZCBieSB0aGUgY3VzdG9tZXIgYmVmb3JlIHVzaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXR1cyBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhdXRvZmlsbCBzdWNjZWVkZWQgb3IgZmFpbGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gdGhhdCB3YXMgYXV0b2ZpbGxlZC4gQWxsIHRoaXMgaW5mb3JtYXRpb24gc2hvdWxkIGJlIGNvbmZpcm1lZCBieSB0aGUgdXNlciBiZWZvcmUgdXNpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbFVzZXJEYXRhXG4gICAgICovXG4gICAgbmFtZTogSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxVc2VyRGF0YVxuICAgICAqL1xuICAgIGFkZHJlc3M6IElkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsVXNlckRhdGFcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IFVzZXJJRE51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBcXCcvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZVxcJ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBleHBvc2UgYSBzaGFyZWFibGUgVVJMIGZvciB0aGUgdmVyaWZpY2F0aW9uIGJlaW5nIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3NoYXJlYWJsZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZsYWcgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBlbmQgdXNlciBoYXMgYWxyZWFkeSBhZ3JlZWQgdG8gYSBwcml2YWN5IHBvbGljeSBzcGVjaWZ5aW5nIHRoYXQgdGhlaXIgZGF0YSB3aWxsIGJlIHNoYXJlZCB3aXRoIFBsYWlkIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMuICBJZiBgZ2F2ZV9jb25zZW50YCBpcyBzZXQgdG8gYHRydWVgLCB0aGUgYGFjY2VwdF90b3NgIHN0ZXAgd2lsbCBiZSBtYXJrZWQgYXMgYHNraXBwZWRgIGFuZCB0aGUgZW5kIHVzZXJcXCdzIHNlc3Npb24gd2lsbCBzdGFydCBhdCB0aGUgbmV4dCBzdGVwIHJlcXVpcmVtZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBnYXZlX2NvbnNlbnQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGZsYWcgc3BlY2lmeWluZyBob3cgeW91IHdvdWxkIGxpa2UgUGxhaWQgdG8gaGFuZGxlIGF0dGVtcHRzIHRvIGNyZWF0ZSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gd2hlbiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYWxyZWFkeSBleGlzdHMgZm9yIHRoZSBwcm92aWRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBpZGVtcG90ZW5jeSBpcyBlbmFibGVkLCBQbGFpZCB3aWxsIHJldHVybiB0aGUgZXhpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLiBJZiBpZGVtcG90ZW5jeSBpcyBkaXNhYmxlZCwgUGxhaWQgd2lsbCByZWplY3QgdGhlIHJlcXVlc3Qgd2l0aCBhIGA0MDAgQmFkIFJlcXVlc3RgIHN0YXR1cyBjb2RlIGlmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhbHJlYWR5IGV4aXN0cyBmb3IgdGhlIHN1cHBsaWVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2lkZW1wb3RlbnQ/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogVXNlciBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgb3V0c2lkZSBvZiBMaW5rLCBtb3N0IGxpa2VseSB2aWEgeW91ciBvd24gb25ib2FyZGluZyBwcm9jZXNzLiAgRWFjaCBvZiB0aGUgZm9sbG93aW5nIGlkZW50aXR5IGZpZWxkcyBhcmUgb3B0aW9uYWw6ICBgZW1haWxfYWRkcmVzc2AgIGBwaG9uZV9udW1iZXJgICBgZGF0ZV9vZl9iaXJ0aGAgIGBuYW1lYCAgYGFkZHJlc3NgICBgaWRfbnVtYmVyYCAgU3BlY2lmaWNhbGx5LCB0aGVzZSBmaWVsZHMgYXJlIG9wdGlvbmFsIGluIHRoYXQgdGhleSBjYW4gZWl0aGVyIGJlIGZ1bGx5IHByb3ZpZGVkIChzYXRpc2Z5aW5nIGV2ZXJ5IHJlcXVpcmVkIGZpZWxkIGluIHRoZWlyIHN1YnNjaGVtYSkgb3Igb21pdHRlZCBmcm9tIHRoZSByZXF1ZXN0IGVudGlyZWx5IGJ5IG5vdCBwcm92aWRpbmcgdGhlIGtleSBvciB2YWx1ZS4gUHJvdmlkaW5nIHRoZXNlIGZpZWxkcyB2aWEgdGhlIEFQSSB3aWxsIHJlc3VsdCBpbiBMaW5rIHNraXBwaW5nIHRoZSBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcyBmb3IgdGhlIGFzc29jaWF0ZWQgdXNlci4gQWxsIHZlcmlmaWNhdGlvbiBzdGVwcyBlbmFibGVkIGluIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBUZW1wbGF0ZSB3aWxsIHN0aWxsIGJlIHJ1bi4gVmVyaWZpY2F0aW9uIHN0ZXBzIHdpbGwgZWl0aGVyIGJlIHJ1biBpbW1lZGlhdGVseSwgb3Igb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIGBhY2NlcHRfdG9zYCBzdGVwLCBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIHByb3ZpZGVkIHRvIHRoZSBgZ2F2ZV9jb25zZW50YCBmaWVsZC4gSWYgeW91IGFyZSBub3QgdXNpbmcgdGhlIHNoYXJlYWJsZSBVUkwgZmVhdHVyZSwgeW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgdGhlc2UgZmllbGRzIHZpYSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpbnN0ZWFkOyBib3RoIGAvaWRlbnRpdHlfdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYW5kIGAvbGluay90b2tlbi9jcmVhdGVgIGFyZSB2YWxpZCB3YXlzIHRvIHByb3ZpZGUgdGhpcyBpbmZvcm1hdGlvbi4gTm90ZSB0aGF0IGlmIHlvdSBwcm92aWRlIGEgbm9uLWBudWxsYCB1c2VyIGRhdGEgb2JqZWN0IHZpYSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgLCBhbnkgdXNlciBkYXRhIGZpZWxkcyBlbnRlcmVkIHZpYSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBmb3IgdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCB3aWxsIGJlIGlnbm9yZWQgd2hlbiBwcmVmaWxsaW5nIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5aW5nIGB1c2VyLmNsaWVudF91c2VyX2lkYCBpcyBkZXByZWNhdGVkLiBQbGVhc2UgcHJvdmlkZSBgY2xpZW50X3VzZXJfaWRgIGF0IHRoZSByb290IGxldmVsIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBhdHRlbXB0IHJlcHJlc2VudHMgYSBjdXN0b21lclxcJ3MgYXR0ZW1wdCB0byB2ZXJpZnkgdGhlaXIgaWRlbnRpdHksIHJlZmxlY3RpbmcgdGhlIHJlcXVpcmVkIHN0ZXBzIGZvciBjb21wbGV0aW5nIHRoZSBzZXNzaW9uLCB0aGUgcmVzdWx0cyBmb3IgZWFjaCBzdGVwLCBhbmQgaW5mb3JtYXRpb24gY29sbGVjdGVkIGluIHRoZSBwcm9jZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJlY2VkaW5nIHRoaXMgc2Vzc2lvbi4gVGhpcyBmaWVsZCB3aWxsIG9ubHkgYmUgZmlsbGVkIGlmIHRoZSBjdXJyZW50IElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBhIHJldHJ5IG9mIGEgcHJldmlvdXMgYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2hhcmVhYmxlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRlbXBsYXRlOiBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RlcHM6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50YXJ5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VsZmllX2NoZWNrOiBTZWxmaWVDaGVjayB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGt5Y19jaGVjazogS1lDQ2hlY2tEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogVmVyaWZ5U01TRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIEJlYWNvbiBVc2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZGFjdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIFRoZSBhZGRyZXNzIG11c3QgYXQgbGVhc3QgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkcyB0byBiZSBhIHZhbGlkIGFkZHJlc3M6IGBzdHJlZXRgLCBgY2l0eWAsIGBjb3VudHJ5YC4gSWYgYW55IGFyZSBtaXNzaW5nIG9yIHVuYWJsZSB0byBiZSBleHRyYWN0ZWQsIHRoZSBhZGRyZXNzIHdpbGwgYmUgbnVsbC4gIGByZWdpb25gLCBhbmQgYHBvc3RhbF9jb2RlYCBtYXkgYmUgbnVsbCBiYXNlZCBvbiB0aGUgYWRkcmVzc2luZyBzeXN0ZW0uIEZvciBleGFtcGxlOiAgQWRkcmVzc2VzIGZyb20gdGhlIFVuaXRlZCBLaW5nZG9tIHdpbGwgbm90IGluY2x1ZGUgYSByZWdpb24gIEFkZHJlc3NlcyBmcm9tIEhvbmcgS29uZyB3aWxsIG5vdCBpbmNsdWRlIHBvc3RhbCBjb2RlICBOb3RlOiBPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbiAoT0NSKSB0ZWNobm9sb2d5IG1heSBzb21ldGltZXMgZXh0cmFjdCBpbmNvcnJlY3QgZGF0YSBmcm9tIGEgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENpdHkgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudC4gQmV0d2VlbiAyIGFuZCAxMCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycy4gRm9yIFVTLWJhc2VkIGFkZHJlc3NlcyB0aGlzIG11c3QgYmUgNSBudW1lcmljIGRpZ2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50QWRkcmVzc1Jlc3BvbnNlXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBleHRyYWN0ZWQgZnJvbSB0aGUgZG9jdW1lbnQuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGluZGl2aWR1YWxcXCdzIG5hbWUgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50TmFtZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkRvY3VtZW50TmFtZVJlc3BvbnNlXG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudE5hbWVSZXNwb25zZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGZldGNoaW5nIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQgcmVwcmVzZW50cyBhIGN1c3RvbWVyXFwncyBhdHRlbXB0IHRvIHZlcmlmeSB0aGVpciBpZGVudGl0eSwgcmVmbGVjdGluZyB0aGUgcmVxdWlyZWQgc3RlcHMgZm9yIGNvbXBsZXRpbmcgdGhlIHNlc3Npb24sIHRoZSByZXN1bHRzIGZvciBlYWNoIHN0ZXAsIGFuZCBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgaW4gdGhlIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29tcGxldGVkX2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBmb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcmVjZWRpbmcgdGhpcyBzZXNzaW9uLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBmaWxsZWQgaWYgdGhlIGN1cnJlbnQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGEgcmV0cnkgb2YgYSBwcmV2aW91cyBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmV2aW91c19hdHRlbXB0X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2hhcmVhYmxlIFVSTCB0aGF0IGNhbiBiZSBzZW50IGRpcmVjdGx5IHRvIHRoZSB1c2VyIHRvIGNvbXBsZXRlIHZlcmlmaWNhdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdGVtcGxhdGU6IElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGF9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyOiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGVwczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnRhcnlWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IERvY3VtZW50YXJ5VmVyaWZpY2F0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQ2hlY2t9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAga3ljX2NoZWNrOiBLWUNDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmlza19jaGVjazogUmlza0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmeVNNU0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBWZXJpZnlTTVNEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgQmVhY29uIFVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJlYWNvbl91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdGVtcGxhdGVfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgUGxhaWQgc2Vzc2lvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgc2Vzc2lvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8SWRlbnRpdHlWZXJpZmljYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbnM6IEFycmF5PElkZW50aXR5VmVyaWZpY2F0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXIgaW5mb3JtYXRpb24gY29sbGVjdGVkIG91dHNpZGUgb2YgTGluaywgbW9zdCBsaWtlbHkgdmlhIHlvdXIgb3duIG9uYm9hcmRpbmcgcHJvY2Vzcy4gIEVhY2ggb2YgdGhlIGZvbGxvd2luZyBpZGVudGl0eSBmaWVsZHMgYXJlIG9wdGlvbmFsOiAgYGVtYWlsX2FkZHJlc3NgICBgcGhvbmVfbnVtYmVyYCAgYGRhdGVfb2ZfYmlydGhgICBgbmFtZWAgIGBhZGRyZXNzYCAgYGlkX251bWJlcmAgIFNwZWNpZmljYWxseSwgdGhlc2UgZmllbGRzIGFyZSBvcHRpb25hbCBpbiB0aGF0IHRoZXkgY2FuIGVpdGhlciBiZSBmdWxseSBwcm92aWRlZCAoc2F0aXNmeWluZyBldmVyeSByZXF1aXJlZCBmaWVsZCBpbiB0aGVpciBzdWJzY2hlbWEpIG9yIG9taXR0ZWQgZnJvbSB0aGUgcmVxdWVzdCBlbnRpcmVseSBieSBub3QgcHJvdmlkaW5nIHRoZSBrZXkgb3IgdmFsdWUuIFByb3ZpZGluZyB0aGVzZSBmaWVsZHMgdmlhIHRoZSBBUEkgd2lsbCByZXN1bHQgaW4gTGluayBza2lwcGluZyB0aGUgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MgZm9yIHRoZSBhc3NvY2lhdGVkIHVzZXIuIEFsbCB2ZXJpZmljYXRpb24gc3RlcHMgZW5hYmxlZCBpbiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gVGVtcGxhdGUgd2lsbCBzdGlsbCBiZSBydW4uIFZlcmlmaWNhdGlvbiBzdGVwcyB3aWxsIGVpdGhlciBiZSBydW4gaW1tZWRpYXRlbHksIG9yIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBwcm92aWRlZCB0byB0aGUgYGdhdmVfY29uc2VudGAgZmllbGQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMgYW5kIGFkZHJlc3MgbXVzdCBiZSBSRkMgY29tcGxpYW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtSRkMgMzY5Nl0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmMzNjk2KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlcklETnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogWW91IGNhbiB1c2UgdGhpcyBmaWVsZCB0byBwcmUtcG9wdWxhdGUgdGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWU7IGlmIGl0IGlzIHByb3ZpZGVkIGhlcmUsIHRoZXkgd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gZW50ZXIgdGhlaXIgbmFtZSBpbiB0aGUgaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWUge1xuICAgIC8qKlxuICAgICAqIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXF1ZXN0VXNlck5hbWVcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmdWxsIG5hbWUgcHJvdmlkZWQgYnkgdGhlIHVzZXIuIElmIHRoZSB1c2VyIGhhcyBub3Qgc3VibWl0dGVkIHRoZWlyIG5hbWUsIHRoaXMgZmllbGQgd2lsbCBiZSBudWxsLiBPdGhlcndpc2UsIGJvdGggZmllbGRzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXNwb25zZVVzZXJOYW1lIHtcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmVzcG9uc2VVc2VyTmFtZVxuICAgICAqL1xuICAgIGZhbWlseV9uYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gaWRlbnRpdHkgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHJldHJpZWQsIHdoaWNoIGNhbiBiZSB0cmlnZ2VyZWQgdmlhIHRoZSBkYXNoYm9hcmQgb3IgdGhlIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRVRSSUVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyaWVkV2ViaG9va1xuICAgICAqL1xuICAgIGlkZW50aXR5X3ZlcmlmaWNhdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cmllZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciByZXRyeWluZyBhbiBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHJhdGVneX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdHJhdGVneTogU3RyYXRlZ3k7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IElkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0fVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFxuICAgICAqL1xuICAgIHN0ZXBzPzogSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB5b3Ugd291bGQgbGlrZSBQbGFpZCB0byBleHBvc2UgYSBzaGFyZWFibGUgVVJMIGZvciB0aGUgdmVyaWZpY2F0aW9uIGJlaW5nIHJldHJpZWQuIElmIGEgdmFsdWUgZm9yIHRoaXMgZmxhZyBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgYGlzX3NoYXJlYWJsZWAgc2V0dGluZyBmcm9tIHRoZSBvcmlnaW5hbCB2ZXJpZmljYXRpb24gYXR0ZW1wdCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0XG4gICAgICovXG4gICAgaXNfc2hhcmVhYmxlPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluc3RydWN0aW9ucyBmb3IgdGhlIGBjdXN0b21gIHJldHJ5IHN0cmF0ZWd5IHNwZWNpZnlpbmcgd2hpY2ggc3RlcHMgc2hvdWxkIGJlIHJlcXVpcmVkIG9yIHNraXBwZWQuICAgTm90ZTogICBUaGlzIGZpZWxkIG11c3QgYmUgcHJvdmlkZWQgd2hlbiB0aGUgcmV0cnkgc3RyYXRlZ3kgaXMgYGN1c3RvbWAgYW5kIG11c3QgYmUgb21pdHRlZCBvdGhlcndpc2UuICBDdXN0b20gcmV0cmllcyBvdmVycmlkZSBzZXR0aW5ncyBpbiB5b3VyIFBsYWlkIFRlbXBsYXRlLiBGb3IgZXhhbXBsZSwgaWYgeW91ciBQbGFpZCBUZW1wbGF0ZSBoYXMgYHZlcmlmeV9zbXNgIGRpc2FibGVkLCBhIGN1c3RvbSByZXRyeSB3aXRoIGB2ZXJpZnlfc21zYCBlbmFibGVkIHdpbGwgc3RpbGwgcmVxdWlyZSB0aGUgc3RlcC4gIFRoZSBgc2VsZmllX2NoZWNrYCBzdGVwIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzYW5kYm94IHNlcnZlci4gU2FuZGJveCByZXF1ZXN0cyB3aWxsIHNpbGVudGx5IGRpc2FibGUgdGhlIGBzZWxmaWVfY2hlY2tgIHN0ZXAgd2hlbiBwcm92aWRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGB2ZXJpZnlfc21zYCBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIGJvb2xlYW4gZmllbGQgc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBuZXcgc2Vzc2lvbiBzaG91bGQgcmVxdWlyZSBvciBza2lwIHRoZSBga3ljX2NoZWNrYCAoRGF0YSBTb3VyY2UgVmVyaWZpY2F0aW9uKSBzdGVwLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdFN0ZXBzT2JqZWN0XG4gICAgICovXG4gICAga3ljX2NoZWNrOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgYm9vbGVhbiBmaWVsZCBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIG5ldyBzZXNzaW9uIHNob3VsZCByZXF1aXJlIG9yIHNraXAgdGhlIGBkb2N1bWVudGFyeV92ZXJpZmljYXRpb25gIHN0ZXAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0U3RlcHNPYmplY3RcbiAgICAgKi9cbiAgICBkb2N1bWVudGFyeV92ZXJpZmljYXRpb246IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBib29sZWFuIGZpZWxkIHNwZWNpZnlpbmcgd2hldGhlciB0aGUgbmV3IHNlc3Npb24gc2hvdWxkIHJlcXVpcmUgb3Igc2tpcCB0aGUgYHNlbGZpZV9jaGVja2Agc3RlcC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3RTdGVwc09iamVjdFxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogYm9vbGVhbjtcbn1cbi8qKlxuICogQSBpZGVudGl0eSB2ZXJpZmljYXRpb24gYXR0ZW1wdCByZXByZXNlbnRzIGEgY3VzdG9tZXJcXCdzIGF0dGVtcHQgdG8gdmVyaWZ5IHRoZWlyIGlkZW50aXR5LCByZWZsZWN0aW5nIHRoZSByZXF1aXJlZCBzdGVwcyBmb3IgY29tcGxldGluZyB0aGUgc2Vzc2lvbiwgdGhlIHJlc3VsdHMgZm9yIGVhY2ggc3RlcCwgYW5kIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBpbiB0aGUgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByZWNlZGluZyB0aGlzIHNlc3Npb24uIFRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGZpbGxlZCBpZiB0aGUgY3VycmVudCBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgYSByZXRyeSBvZiBhIHByZXZpb3VzIGF0dGVtcHQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJldmlvdXNfYXR0ZW1wdF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNoYXJlYWJsZSBVUkwgdGhhdCBjYW4gYmUgc2VudCBkaXJlY3RseSB0byB0aGUgdXNlciB0byBjb21wbGV0ZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzaGFyZWFibGVfdXJsOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZTogSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcjogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHN0ZXBzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEb2N1bWVudGFyeVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBEb2N1bWVudGFyeVZlcmlmaWNhdGlvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNoZWNrfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWxmaWVfY2hlY2s6IFNlbGZpZUNoZWNrIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IEtZQ0NoZWNrRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0RldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IFJpc2tDaGVja0RldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICB2ZXJpZnlfc21zOiBWZXJpZnlTTVNEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBCZWFjb24gVXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiZWFjb25fdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkYWN0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGlzIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LiAgIGBhY3RpdmVgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IGlzIGluY29tcGxldGUuIFRoZSB1c2VyIG1heSBoYXZlIGNvbXBsZXRlZCBwYXJ0IG9mIHRoZSBzZXNzaW9uLCBidXQgaGFzIG5laXRoZXIgZmFpbGVkIG9yIHBhc3NlZC4gIGBzdWNjZXNzYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBoYXMgY29tcGxldGVkLCBwYXNzaW5nIGFsbCBzdGVwcyBkZWZpbmVkIHRvIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiB0ZW1wbGF0ZSAgYGZhaWxlZGAgLSBUaGUgdXNlciBmYWlsZWQgb25lIG9yIG1vcmUgc3RlcHMgaW4gdGhlIHNlc3Npb24gYW5kIHdhcyB0b2xkIHRvIGNvbnRhY3Qgc3VwcG9ydC4gIGBleHBpcmVkYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCB3YXMgYWN0aXZlIGZvciBhIGxvbmcgcGVyaW9kIG9mIHRpbWUgd2l0aG91dCBiZWluZyBjb21wbGV0ZWQgYW5kIHdhcyBhdXRvbWF0aWNhbGx5IG1hcmtlZCBhcyBleHBpcmVkLiBOb3RlIHRoYXQgc2Vzc2lvbnMgY3VycmVudGx5IGRvIG5vdCBleHBpcmUuIEF1dG9tYXRpYyBleHBpcmF0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIGVuYWJsZWQgaW4gdGhlIGZ1dHVyZS4gIGBjYW5jZWxlZGAgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgd2FzIGNhbmNlbGVkLCBlaXRoZXIgdmlhIHRoZSBkYXNoYm9hcmQgYnkgYSB1c2VyLCBvciB2aWEgQVBJLiBUaGUgdXNlciBtYXkgaGF2ZSBjb21wbGV0ZWQgcGFydCBvZiB0aGUgc2Vzc2lvbiwgYnV0IGhhcyBuZWl0aGVyIGZhaWxlZCBvciBwYXNzZWQuICBgcGVuZGluZ19yZXZpZXdgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHRlbXBsYXRlIHdhcyBjb25maWd1cmVkIHRvIHBlcmZvcm0gYSBzY3JlZW5pbmcgdGhhdCBoYWQgb25lIG9yIG1vcmUgaGl0cyBuZWVkaW5nIHJldmlldy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIEV4cGlyZWQgPSAnZXhwaXJlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGFuIGlkZW50aXR5IHZlcmlmaWNhdGlvbiBoYXMgYmVlbiB1cGRhdGVkLCB3aGljaCBjYW4gYmUgdHJpZ2dlcmVkIHZpYSB0aGUgZGFzaGJvYXJkIG9yIHRoZSBBUEkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSURFTlRJVFlfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgYSBzdGVwIGluIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBBY3RpdmUgPSAnYWN0aXZlJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBXYWl0aW5nRm9yUHJlcmVxdWlzaXRlID0gJ3dhaXRpbmdfZm9yX3ByZXJlcXVpc2l0ZScsXG4gICAgTm90QXBwbGljYWJsZSA9ICdub3RfYXBwbGljYWJsZScsXG4gICAgU2tpcHBlZCA9ICdza2lwcGVkJyxcbiAgICBFeHBpcmVkID0gJ2V4cGlyZWQnLFxuICAgIENhbmNlbGVkID0gJ2NhbmNlbGVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBNYW51YWxseUFwcHJvdmVkID0gJ21hbnVhbGx5X2FwcHJvdmVkJyxcbiAgICBNYW51YWxseVJlamVjdGVkID0gJ21hbnVhbGx5X3JlamVjdGVkJ1xufVxuXG4vKipcbiAqIEVhY2ggc3RlcCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogICBgYWN0aXZlYCAtIFRoaXMgc3RlcCBpcyB0aGUgdXNlclxcJ3MgY3VycmVudCBzdGVwLiBUaGV5IGFyZSBlaXRoZXIgaW4gdGhlIHByb2Nlc3Mgb2YgY29tcGxldGluZyB0aGlzIHN0ZXAsIG9yIHRoZXkgcmVjZW50bHkgY2xvc2VkIHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdoaWxlIGluIHRoZSBtaWRkbGUgb2YgdGhpcyBzdGVwLiBPbmx5IG9uZSBzdGVwIHdpbGwgYmUgbWFya2VkIGFzIGBhY3RpdmVgIGF0IGFueSBnaXZlbiBwb2ludC4gIGBzdWNjZXNzYCAtIFRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBoYXMgY29tcGxldGVkIHRoaXMgc3RlcC4gIGBmYWlsZWRgIC0gVGhlIHVzZXIgZmFpbGVkIHRoaXMgc3RlcC4gVGhpcyBjYW4gZWl0aGVyIGNhbGwgdGhlIHVzZXIgdG8gZmFpbCB0aGUgc2Vzc2lvbiBhcyBhIHdob2xlLCBvciBjYXVzZSB0aGVtIHRvIGZhbGxiYWNrIHRvIGFub3RoZXIgc3RlcCBkZXBlbmRpbmcgb24gaG93IHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUgaXMgY29uZmlndXJlZC4gQSBmYWlsZWQgc3RlcCBkb2VzIG5vdCBpbXBseSBhIGZhaWxlZCBzZXNzaW9uLiAgYHdhaXRpbmdfZm9yX3ByZXJlcXVpc2l0ZWAgLSBUaGUgdXNlciBuZWVkcyB0byBjb21wbGV0ZSBhbm90aGVyIHN0ZXAgZmlyc3QsIGJlZm9yZSB0aGV5IHByb2dyZXNzIHRvIHRoaXMgc3RlcC4gVGhpcyBzdGVwIG1heSBuZXZlciBydW4sIGRlcGVuZGluZyBvbiBpZiB0aGUgdXNlciBmYWlscyBhbiBlYXJsaWVyIHN0ZXAgb3IgaWYgdGhlIHN0ZXAgaXMgb25seSBydW4gYXMgYSBmYWxsYmFjay4gIGBub3RfYXBwbGljYWJsZWAgLSBUaGlzIHN0ZXAgd2lsbCBub3QgYmUgcnVuIGZvciB0aGlzIHNlc3Npb24uICBgc2tpcHBlZGAgLSBUaGUgcmV0cnkgaW5zdHJ1Y3Rpb25zIHRoYXQgY3JlYXRlZCB0aGlzIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHNwZWNpZmllZCB0aGF0IHRoaXMgc3RlcCBzaG91bGQgYmUgc2tpcHBlZC4gIGBleHBpcmVkYCAtIFRoaXMgc3RlcCBoYWQgbm90IHlldCBiZWVuIGNvbXBsZXRlZCB3aGVuIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhcyBhIHdob2xlIGV4cGlyZWQuICBgY2FuY2VsZWRgIC0gVGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0IHdhcyBjYW5jZWxlZCBiZWZvcmUgdGhlIHVzZXIgY29tcGxldGVkIHRoaXMgc3RlcC4gIGBwZW5kaW5nX3Jldmlld2AgLSBUaGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHQgdGVtcGxhdGUgd2FzIGNvbmZpZ3VyZWQgdG8gcGVyZm9ybSBhIHNjcmVlbmluZyB0aGF0IGhhZCBvbmUgb3IgbW9yZSBoaXRzIG5lZWRpbmcgcmV2aWV3LiAgYG1hbnVhbGx5X2FwcHJvdmVkYCAtIFRoZSBzdGVwIHdhcyBtYW51YWxseSBvdmVycmlkZGVuIHRvIHBhc3MgYnkgYSB0ZWFtIG1lbWJlciBpbiB0aGUgZGFzaGJvYXJkLiAgYG1hbnVhbGx5X3JlamVjdGVkYCAtIFRoZSBzdGVwIHdhcyBtYW51YWxseSBvdmVycmlkZGVuIHRvIGZhaWwgYnkgYSB0ZWFtIG1lbWJlciBpbiB0aGUgZGFzaGJvYXJkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIGFjY2VwdF90b3M6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgdmVyaWZ5X3NtczogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICBreWNfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdW1tYXJ5XG4gICAgICovXG4gICAgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHNlbGZpZV9jaGVjazogSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN1bW1hcnlcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3VtbWFyeVxuICAgICAqL1xuICAgIHJpc2tfY2hlY2s6IElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFN0YXR1cztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgY29tcGxldGVkIGEgc3RlcCBvZiB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJREVOVElUWV9WRVJJRklDQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RFUF9VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uU3RlcFVwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25TdGVwVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgcmVzb3VyY2UgSUQgYW5kIHZlcnNpb24gbnVtYmVyIG9mIHRoZSB0ZW1wbGF0ZSBjb25maWd1cmluZyB0aGUgYmVoYXZpb3Igb2YgYSBnaXZlbiBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVGVtcGxhdGVSZWZlcmVuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblRlbXBsYXRlUmVmZXJlbmNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmVyc2lvbiBvZiB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gdGVtcGxhdGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25UZW1wbGF0ZVJlZmVyZW5jZVxuICAgICAqL1xuICAgIHZlcnNpb246IG51bWJlcjtcbn1cbi8qKlxuICogRXZlbiBpZiBhbiBhZGRyZXNzIGhhcyBiZWVuIGNvbGxlY3RlZCwgc29tZSBmaWVsZHMgbWF5IGJlIG51bGwgZGVwZW5kaW5nIG9uIHRoZSByZWdpb25cXCdzIGFkZHJlc3Npbmcgc3lzdGVtLiBGb3IgZXhhbXBsZTogIEFkZHJlc3NlcyBmcm9tIHRoZSBVbml0ZWQgS2luZ2RvbSB3aWxsIG5vdCBpbmNsdWRlIGEgcmVnaW9uICBBZGRyZXNzZXMgZnJvbSBIb25nIEtvbmcgd2lsbCBub3QgaW5jbHVkZSBwb3N0YWwgY29kZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gSWYgYW4gYWRkcmVzcyBpcyBwcm92aWRlZCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBiZSBmaWxsZWQuIEEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDgwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeHRyYSBzdHJlZXQgaW5mb3JtYXRpb24sIGxpa2UgYW4gYXBhcnRtZW50IG9yIHN1aXRlIG51bWJlci4gSWYgcHJvdmlkZWQsIGEgc3RyaW5nIHdpdGggYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgNTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gSVNPIDMxNjYtMiBzdWJkaXZpc2lvbiBjb2RlLiBSZWxhdGVkIHRlcm1zIHdvdWxkIGJlIFxcXCJzdGF0ZVxcXCIsIFxcXCJwcm92aW5jZVxcXCIsIFxcXCJwcmVmZWN0dXJlXFxcIiwgXFxcInpvbmVcXFwiLCBcXFwic3ViZGl2aXNpb25cXFwiLCBldGMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgZm9yIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MuIEJldHdlZW4gMiBhbmQgMTAgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuIEZvciBVUy1iYXNlZCBhZGRyZXNzZXMgdGhpcyBtdXN0IGJlIDUgbnVtZXJpYyBkaWdpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGlkZW50aXR5IGRhdGEgdGhhdCB3YXMgZWl0aGVyIGNvbGxlY3RlZCBmcm9tIHRoZSB1c2VyIG9yIHByb3ZpZGVkIHZpYSBBUEkgaW4gb3JkZXIgdG8gcGVyZm9ybSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhIHtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIHBob25lIG51bWJlciBpbiBFLjE2NCBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElQdjQgb3IgSVBWNiBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgZW1haWwgYWRkcmVzcy4gTXVzdCBub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyBhbmQgYWRkcmVzcyBtdXN0IGJlIFJGQyBjb21wbGlhbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW1JGQyAzNjk2XShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM2OTYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWV9XG4gICAgICogQG1lbWJlcm9mIElkZW50aXR5VmVyaWZpY2F0aW9uVXNlckRhdGFcbiAgICAgKi9cbiAgICBuYW1lOiBJZGVudGl0eVZlcmlmaWNhdGlvblJlc3BvbnNlVXNlck5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJZGVudGl0eVZlcmlmaWNhdGlvblVzZXJEYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJJRE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSWRlbnRpdHlWZXJpZmljYXRpb25Vc2VyRGF0YVxuICAgICAqL1xuICAgIGlkX251bWJlcjogVXNlcklETnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBoaWdoIGxldmVsIGRlc2NyaXB0aW9uIG9mIHRoZSBxdWFsaXR5IG9mIHRoZSBpbWFnZSB0aGUgdXNlciBzdWJtaXR0ZWQuICBGb3IgZXhhbXBsZSwgYW4gaW1hZ2UgdGhhdCBpcyBibHVycnksIGRpc3RvcnRlZCBieSBnbGFyZSBmcm9tIGEgbmVhcmJ5IGxpZ2h0IHNvdXJjZSwgb3IgaW1wcm9wZXJseSBmcmFtZWQgbWlnaHQgYmUgbWFya2VkIGFzIGxvdyBvciBtZWRpdW0gcXVhbGl0eS4gUG9vciBxdWFsaXR5IGltYWdlcyBhcmUgbW9yZSBsaWtlbHkgdG8gZmFpbCBPQ1IgYW5kL29yIHRlbXBsYXRlIGNvbmZvcm1pdHkgY2hlY2tzLiAgTm90ZTogQnkgZGVmYXVsdCwgUGxhaWQgd2lsbCBsZXQgYSB1c2VyIHJlY2FwdHVyZSBkb2N1bWVudCBpbWFnZXMgdHdpY2UgYmVmb3JlIGZhaWxpbmcgdGhlIGVudGlyZSBzZXNzaW9uIGlmIHdlIGF0dHJpYnV0ZSB0aGUgZmFpbHVyZSB0byBsb3cgaW1hZ2UgcXVhbGl0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlUXVhbGl0eSB7XG4gICAgSGlnaCA9ICdoaWdoJyxcbiAgICBNZWRpdW0gPSAnbWVkaXVtJyxcbiAgICBMb3cgPSAnbG93J1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGltYWdlIHF1YWxpdHkgb2YgdGhlIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbWFnZVF1YWxpdHlEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW1hZ2VRdWFsaXR5RGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eU91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEltYWdlUXVhbGl0eURldGFpbHNcbiAgICAgKi9cbiAgICBnbGFyZV9jaGVjazogSW1hZ2VRdWFsaXR5T3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW1hZ2VRdWFsaXR5T3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgSW1hZ2VRdWFsaXR5RGV0YWlsc1xuICAgICAqL1xuICAgIGRpbWVuc2lvbnNfY2hlY2s6IEltYWdlUXVhbGl0eU91dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ltYWdlUXVhbGl0eU91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIEltYWdlUXVhbGl0eURldGFpbHNcbiAgICAgKi9cbiAgICBibHVyX2NoZWNrOiBJbWFnZVF1YWxpdHlPdXRjb21lO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiB0aGUgaW1hZ2UgcXVhbGl0eSBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEltYWdlUXVhbGl0eU91dGNvbWUge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBBbiB1cGRhdGUgb24gdGhlIGhlYWx0aCBpbmNpZGVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNpZGVudFVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY2lkZW50VXBkYXRlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY29udGVudCBvZiB0aGUgdXBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY2lkZW50VXBkYXRlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXR1cyBvZiB0aGUgaW5jaWRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbmNpZGVudFVwZGF0ZVN0YXR1c0VudW07XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiB0aGUgdXBkYXRlIHdhcyBwdWJsaXNoZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMjAtMTAtMzBUMTU6MjY6NDhaXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jaWRlbnRVcGRhdGVcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gSW5jaWRlbnRVcGRhdGVTdGF0dXNFbnVtIHtcbiAgICBJbnZlc3RpZ2F0aW5nID0gJ0lOVkVTVElHQVRJTkcnLFxuICAgIElkZW50aWZpZWQgPSAnSURFTlRJRklFRCcsXG4gICAgU2NoZWR1bGVkID0gJ1NDSEVEVUxFRCcsXG4gICAgUmVzb2x2ZWQgPSAnUkVTT0xWRUQnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgYnJlYWtkb3duIG9mIHRoZSBkaWZmZXJlbnQgaW5jb21lIHR5cGVzIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVCcmVha2Rvd25UeXBlfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVCcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBJbmNvbWVCcmVha2Rvd25UeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaG91cmx5IHJhdGUgYXQgd2hpY2ggdGhlIGluY29tZSBpcyBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBob3VycyBsb2dnZWQgZm9yIHRoaXMgaW5jb21lIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lQnJlYWtkb3duXG4gICAgICovXG4gICAgaG91cnM6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIHBheSBmb3IgdGhpcyBwYXkgcGVyaW9kLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZUJyZWFrZG93blxuICAgICAqL1xuICAgIHRvdGFsOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBpbmNvbWUuIFBvc3NpYmxlIHZhbHVlcyBpbmNsdWRlOiAgIGBcXFwicmVndWxhclxcXCJgOiByZWd1bGFyIGluY29tZSAgIGBcXFwib3ZlcnRpbWVcXFwiYDogb3ZlcnRpbWUgaW5jb21lICAgYFxcXCJib251c1xcXCJgOiBib251cyBpbmNvbWVcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluY29tZUJyZWFrZG93blR5cGUge1xuICAgIEJvbnVzID0gJ2JvbnVzJyxcbiAgICBPdmVydGltZSA9ICdvdmVydGltZScsXG4gICAgUmVndWxhciA9ICdyZWd1bGFyJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogU3BlY2lmeSBwYXlyb2xsIGRhdGEgb24gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwYXlzdHVicyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZU92ZXJyaWRlXG4gICAgICovXG4gICAgcGF5c3R1YnM/OiBBcnJheTxQYXlzdHViT3ZlcnJpZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB3MnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxXMk92ZXJyaWRlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB3MnM/OiBBcnJheTxXMk92ZXJyaWRlPjtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgbnVtYmVyIG9mIGluY29tZSBzb3VyY2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVNvdXJjZXNDb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVTb3VyY2VzQ291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGluY29tZSBzb3VyY2VzIGRldGVjdGVkIGF0IHRoZSBzdWJzY3JpcHRpb24gZGF0ZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVNvdXJjZXNDb3VudHNcbiAgICAgKi9cbiAgICBiYXNlbGluZV9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgaW5jb21lIHNvdXJjZXMgY3VycmVudGx5IGRldGVjdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU291cmNlc0NvdW50c1xuICAgICAqL1xuICAgIGN1cnJlbnRfY291bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIHZlcmlmaWVkIGZpZWxkcyBmcm9tIGEgcGF5c3R1YiB2ZXJpZmljYXRpb24uIEFsbCBmaWVsZHMgYXJlIHByb3ZpZGVkIGFzIHJlcG9ydGVkIG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVySW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZXJfbmFtZTogRW1wbG95ZXJJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveWVlSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZW1wbG95ZWVfbmFtZTogRW1wbG95ZWVJbmNvbWVTdW1tYXJ5RmllbGRTdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5XG4gICAgICovXG4gICAgeXRkX2dyb3NzX2luY29tZTogWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1lURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHl0ZF9uZXRfaW5jb21lOiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IFBheUZyZXF1ZW5jeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHByb2plY3RlZF93YWdlOiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeVxuICAgICAqL1xuICAgIHZlcmlmaWVkX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkRhdGEgfCBudWxsO1xufVxuLyoqXG4gKiBGaWVsZCBudW1iZXIgZm9yIGluY29tZSBzdW1tYXJ5XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgaW5jb21lIHN1bW1hcnlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVN1bW1hcnlGaWVsZFN0cmluZ1xuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lU3VtbWFyeUZpZWxkU3RyaW5nXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZW5kcG9pbnQgdG8gd2hpY2ggUGxhaWQgc2hvdWxkIHNlbmQgd2ViaG9va3MgcmVsYXRlZCB0byB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiBhIHByZWNoZWNrIGNyZWF0ZWQgd2l0aCBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgLiBXaWxsIGJlIHVzZWQgdG8gaW1wcm92ZSBjb252ZXJzaW9uIG9mIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByZWNoZWNrX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogT3B0aW9uYWwgYXJndW1lbnRzIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2Nlc3MgdG9rZW5zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEl0ZW1zIHRoYXQgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlIHByb2R1Y3QgZGF0YS4gUGxhaWQgd2lsbCBhdHRlbXB0IHRvIGNvcnJlbGF0ZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gdGhlc2UgSXRlbXMgd2l0aCBkYXRhIGZyb20gdGhlIHVzZXJcXCdzIHBheXN0dWIsIHN1Y2ggYXMgZGF0ZSBhbmQgYW1vdW50LiBJZiB0aGUgYHRyYW5zYWN0aW9uc2AgcHJvZHVjdCB3YXMgbm90IGluaXRpYWxpemVkIGZvciB0aGUgSXRlbXMgZHVyaW5nIExpbmssIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhpcyBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uIFRoaXMgSUQgaXMgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvcHRpb25zIHRvIGVuYWJsZSBmb3IgZG9jdW1lbnQgcGFyc2luZ1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uRG9jUGFyc2luZ0NvbmZpZyB7XG4gICAgT2NyID0gJ29jcicsXG4gICAgUmlza1NpZ25hbHMgPSAncmlza19zaWduYWxzJ1xufVxuXG4vKipcbiAqIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkb2N1bWVudCBJRCB0byBkb3dubG9hZC4gSWYgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIHJldHVybmVkIGluIHRoZSByZXN1bHRpbmcgemlwIGZpbGUsIHJhdGhlciB0aGFuIGFsbCBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIGRvY3VtZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRmxvdyB0eXBlcyB0byByZXRyaWV2ZSBwYXlyb2xsIGluY29tZSBkYXRhXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsRmxvd1R5cGUge1xuICAgIERpZ2l0YWxJbmNvbWUgPSAncGF5cm9sbF9kaWdpdGFsX2luY29tZScsXG4gICAgRG9jdW1lbnRJbmNvbWUgPSAncGF5cm9sbF9kb2N1bWVudF9pbmNvbWUnXG59XG5cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgdmVyaWZpY2F0aW9uIGZvciB3aGljaCB0byBnZXQgcGF5c3R1YiBpbmZvcm1hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBNZXRhZGF0YSBmb3IgYW4gaW5jb21lIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudE1ldGFkYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRvY3VtZW50X21ldGFkYXRhPzogQXJyYXk8RG9jdW1lbnRNZXRhZGF0YT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWI+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5c3R1YnM6IEFycmF5PFBheXN0dWI+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGNvbmZpZGVuY2UgdGhhdCBQbGFpZCBjYW4gc3VwcG9ydCB0aGUgdXNlciBpbiB0aGUgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cgaW5zdGVhZCBvZiByZXF1aXJpbmcgYSBtYW51YWwgcGF5c3R1YiB1cGxvYWQuIE9uZSBvZiB0aGUgZm9sbG93aW5nOiAgYFxcXCJISUdIXFxcImA6IEl0IGlzIHZlcnkgbGlrZWx5IHRoYXQgdGhpcyB1c2VyIGNhbiB1c2UgdGhlIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiAgXFxcImBMT1dgXFxcIjogSXQgaXMgdW5saWtlbHkgdGhhdCB0aGlzIHVzZXIgY2FuIHVzZSB0aGUgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuICBgXFxcIlVOS05PV05cXFwiYDogSXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgaWYgdGhlIHVzZXIgaXMgc3VwcG9ydGFibGUgd2l0aCB0aGUgaW5mb3JtYXRpb24gcGFzc2VkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tDb25maWRlbmNlIHtcbiAgICBIaWdoID0gJ0hJR0gnLFxuICAgIExvdyA9ICdMT1cnLFxuICAgIFVua25vd24gPSAnVU5LTk9XTidcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXJcXCdzIGVtcGxveWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXJcXCdzIHRheCBpZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJcbiAgICAgKi9cbiAgICB0YXhfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgZm9yIHRoZSBlbXBsb3llclxcJ3MgcHVibGljIHdlYnNpdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgemlwYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUuIEluIEFQSSB2ZXJzaW9ucyAyMDE4LTA1LTIyIGFuZCBlYXJsaWVyLCB0aGlzIGZpZWxkIGlzIGNhbGxlZCBgc3RhdGVgLiBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlLiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhpcyBmaWVsZCBpcyBjYWxsZWQgYHppcGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tFbXBsb3llckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIERhdGEgYWJvdXQgbWlsaXRhcnkgaW5mbyBpbiB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcmVjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tNaWxpdGFyeUluZm9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mbyB7XG4gICAgLyoqXG4gICAgICogSXMgdGhlIHVzZXIgY3VycmVudGx5IGFjdGl2ZSBkdXR5IGluIHRoZSBVUyBtaWxpdGFyeVxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb1xuICAgICAqL1xuICAgIGlzX2FjdGl2ZV9kdXR5PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIHVzZXIgaXMgY3VycmVudGx5IHNlcnZpbmcgaW4gdGhlIFVTIG1pbGl0YXJ5LCB0aGUgYnJhbmNoIG9mIHRoZSBtaWxpdGFyeSBpbiB3aGljaCB0aGV5IGFyZSBzZXJ2aW5nIFZhbGlkIHZhbHVlczogXFwnQUlSIEZPUkNFXFwnLCBcXCdBUk1ZXFwnLCBcXCdDT0FTVCBHVUFSRFxcJywgXFwnTUFSSU5FU1xcJywgXFwnTkFWWVxcJywgXFwnVU5LTk9XTlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvXG4gICAgICovXG4gICAgYnJhbmNoPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBwYXlyb2xsIGluc3RpdHV0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tQYXlyb2xsSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHBheXJvbGwgaW5zdGl0dXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJ9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI/OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0VtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrRW1wbG95ZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1BheXJvbGxJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5cm9sbF9pbnN0aXR1dGlvbj86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUGF5cm9sbEluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjZXNzIHRva2VucyBjb3JyZXNwb25kaW5nIHRvIEl0ZW1zIGJlbG9uZ2luZyB0byB0aGUgdXNlciB3aG9zZSBlbGlnaWJpbGl0eSBpcyBiZWluZyBjaGVja2VkLiBOb3RlIHRoYXQgaWYgdGhlIEl0ZW1zIHNwZWNpZmllZCBoZXJlIGFyZSBub3QgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBwcm92aWRpbmcgdGhlbSBpbiB0aGlzIGZpZWxkIHdpbGwgY2F1c2UgdGhlc2UgSXRlbXMgdG8gYmUgaW5pdGlhbGl6ZWQgd2l0aCAoYW5kIGJpbGxlZCBmb3IpIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja01pbGl0YXJ5SW5mb31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNfbWlsaXRhcnlfaW5mbz86IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrTWlsaXRhcnlJbmZvIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9wcmVjaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgcHJlY2hlY2suIFByb3ZpZGUgdGhpcyB2YWx1ZSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaW4gb3JkZXIgdG8gb3B0aW1pemUgTGluayBjb252ZXJzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcmVjaGVja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2V9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25maWRlbmNlOiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja0NvbmZpZGVuY2U7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2VyIHdob3NlIGVsaWdpYmlsaXR5IGlzIGJlaW5nIGV2YWx1YXRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZmlyc3QgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrVXNlclxuICAgICAqL1xuICAgIGZpcnN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsYXN0IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBsYXN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tVc2VyXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEFkZHJlc3NEYXRhfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1VzZXJcbiAgICAgKi9cbiAgICBob21lX2FkZHJlc3M/OiBTaWduYWxBZGRyZXNzRGF0YSB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIGF0dGVtcHQgdG8gcmVmcmVzaCBQYXlyb2xsIEluY29tZSBkYXRhIGZvciBhIHVzZXIgdmlhIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgIGZhaWxlZCBiZWNhdXNlIHRoZSB1c2VyIG11c3QgcmUtY29ubmVjdCB0aGVpciBwYXlyb2xsIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblJlZnJlc2hSZWNvbm5lY3ROZWVkZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5DT01FX1ZFUklGSUNBVElPTl9SRUZSRVNIX1JFQ09OTkVDVF9ORUVERURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmVmcmVzaFJlY29ubmVjdE5lZWRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHVzZXJfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVzZXIgdGhlIHdlYmhvb2sgaGFzIGZpcmVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SZWZyZXNoUmVjb25uZWN0TmVlZGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gcmlzayBzaWduYWxzIGhhdmUgYmVlbiBwcm9jZXNzZWQgZm9yIGRvY3VtZW50cyB1cGxvYWRlZCB2aWEgRG9jdW1lbnQgSW5jb21lLiBJdCB3aWxsIHR5cGljYWxseSB0YWtlIGEgbWludXRlIG9yIHR3byBmb3IgdGhpcyB3ZWJob29rIHRvIGZpcmUgYWZ0ZXIgdGhlIGVuZCB1c2VyIGhhcyB1cGxvYWRlZCB0aGVpciBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBPbmNlIHRoaXMgd2ViaG9vayBoYXMgZmlyZWQsIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIG1heSB0aGVuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgZG9jdW1lbnRzIHdlcmUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBhbmQgdG8gcmV0cmlldmUgcmlzayBkYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiSU5DT01FXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25SaXNrU2lnbmFsc1N0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEl0ZW0gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUklTS19TSUdOQUxTX1BST0NFU1NJTkdfQ09NUExFVEVgOiBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmcmF1ZCBkZXRlY3Rpb24gcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkLiBJZiB0aGUgdXNlciB1cGxvYWRlZCBtdWx0aXBsZSBkb2N1bWVudHMsIHRoaXMgd2ViaG9vayB3aWxsIGZpcmUgd2hlbiBhbGwgZG9jdW1lbnRzIGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gQ2FsbCB0aGUgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGFsbCByaXNrIHNpZ25hbCBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblJpc2tTaWduYWxzU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHJpc2tfc2lnbmFsc19zdGF0dXM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uUmlza1NpZ25hbHNTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhlIHR5cGVzIG9mIHNvdXJjZSBpbmNvbWUgZGF0YSB0aGF0IHVzZXJzIHNob3VsZCBiZSBhYmxlIHRvIHNoYXJlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlIHtcbiAgICBCYW5rID0gJ2JhbmsnLFxuICAgIFBheXJvbGwgPSAncGF5cm9sbCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSBoYXMgY2hhbmdlZC4gVGhpcyB3ZWJob29rIGlzIGZpcmVkIGZvciBib3RoIHRoZSBEb2N1bWVudCBhbmQgUGF5cm9sbCBJbmNvbWUgZmxvd3MsIGJ1dCBub3QgdGhlIEJhbmsgSW5jb21lIGZsb3cuIEl0IHdpbGwgdHlwaWNhbGx5IHRha2Ugc2V2ZXJhbCBtaW51dGVzIGZvciB0aGlzIHdlYmhvb2sgdG8gZmlyZSBhZnRlciB0aGUgZW5kIHVzZXIgaGFzIHVwbG9hZGVkIHRoZWlyIGRvY3VtZW50cyBpbiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgXFxcIklOQ09NRVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTkNPTUVfVkVSSUZJQ0FUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSXRlbSBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgdXNlcl9pZGAgb2YgdGhlIFVzZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6ICBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGRvY3VtZW50cyBoYXZlIGJlZW4gcGFyc2VkIHN1Y2Nlc3NmdWxseSBvciB0aGF0IHRoZSBkb2N1bWVudHMgd2VyZSBub3QgcGFyc2FibGUuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGVuZHBvaW50IGFuZCBjaGVjayB0aGUgZG9jdW1lbnQgbWV0YWRhdGEgdG8gc2VlIHdoaWNoIGRvY3VtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQuICBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRGA6IEFuIHVuZXhwZWN0ZWQgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uU3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25TdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50TWV0YWRhdGE+fVxuICAgICAqIEBtZW1iZXJvZiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfbWV0YWRhdGE6IEFycmF5PERvY3VtZW50TWV0YWRhdGE+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmb3Jtcy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VGF4Zm9ybT59XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0YXhmb3JtczogQXJyYXk8VGF4Zm9ybT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBTdGF0dXMgb2YgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gd2ViaG9va1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmNvbWVWZXJpZmljYXRpb25XZWJob29rU3RhdHVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5jb21lVmVyaWZpY2F0aW9uV2ViaG9va1N0YXR1c1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBhcmVudCBjb250YWluZXIgZm9yIG5hbWUgdGhhdCBhbGxvd3MgZm9yIGNob2ljZSBncm91cCBiZXR3ZWVuIHBhcnNlZCBhbmQgdW5wYXJzZWQgY29udGFpbmVycy5QYXJlbnQgY29udGFpbmVyIGZvciBuYW1lIHRoYXQgYWxsb3dzIGZvciBjaG9pY2UgZ3JvdXAgYmV0d2VlbiBwYXJzZWQgYW5kIHVucGFyc2VkIGNvbnRhaW5lcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxOYW1lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbE5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmaXJzdCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIHJlcHJlc2VudGVkIGJ5IHRoZSBwYXJlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxOYW1lXG4gICAgICovXG4gICAgRmlyc3ROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCByZXByZXNlbnRlZCBieSB0aGUgcGFyZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsTmFtZVxuICAgICAqL1xuICAgIExhc3ROYW1lOiBzdHJpbmc7XG59XG4vKipcbiAqIE5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGluZGl2aWR1YWwgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXMge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGluZGl2aWR1YWwsIGluY2x1ZGluZyBhbGwgcGFydHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzXG4gICAgICovXG4gICAgZnVsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFByaW1hcnkgbmFtZXMgYXJlIHRob3NlIG1vc3QgY29tbW9ubHkgdXNlZCB0byByZWZlciB0byB0aGlzIHBlcnNvbi4gT25seSBvbmUgbmFtZSB3aWxsIGV2ZXIgYmUgbWFya2VkIGFzIHByaW1hcnkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIGlzX3ByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYWtBbGlhc0RldGVybWluYXRpb259XG4gICAgICogQG1lbWJlcm9mIEluZGl2aWR1YWxTY3JlZW5pbmdIaXROYW1lc1xuICAgICAqL1xuICAgIHdlYWtfYWxpYXNfZGV0ZXJtaW5hdGlvbjogV2Vha0FsaWFzRGV0ZXJtaW5hdGlvbjtcbn1cbi8qKlxuICogU2hvcnRoYW5kIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgc2NyZWVuaW5nIGxpc3QgZm9yIGluZGl2aWR1YWxzLiAgYEFVX0NPTmA6IEF1c3RyYWxpYSBEZXBhcnRtZW50IG9mIEZvcmVpZ24gQWZmYWlycyBhbmQgVHJhZGUgQ29uc29saWRhdGVkIExpc3QgIGBDQV9DT05gOiBHb3Zlcm5tZW50IG9mIENhbmFkYSBDb25zb2xpZGF0ZWQgTGlzdCBvZiBTYW5jdGlvbnMgIGBFVV9DT05gOiBFdXJvcGVhbiBFeHRlcm5hbCBBY3Rpb24gU2VydmljZSBDb25zb2xpZGF0ZWQgTGlzdCAgYElaX0NJQWA6IENJQSBMaXN0IG9mIENoaWVmcyBvZiBTdGF0ZSBhbmQgQ2FiaW5ldCBNZW1iZXJzICBgSVpfSVBMYDogSW50ZXJwb2wgUmVkIE5vdGljZXMgZm9yIFdhbnRlZCBQZXJzb25zIExpc3QgIGBJWl9QRVBgOiBQb2xpdGljYWxseSBFeHBvc2VkIFBlcnNvbnMgTGlzdCAgYElaX1VOQ2A6IFVuaXRlZCBOYXRpb25zIENvbnNvbGlkYXRlZCBTYW5jdGlvbnMgIGBJWl9XQktgOiBXb3JsZCBCYW5rIExpc3Rpbmcgb2YgSW5lbGlnaWJsZSBGaXJtcyBhbmQgSW5kaXZpZHVhbHMgIGBVS19ITUNgOiBVSyBITSBUcmVhc3VyeSBDb25zb2xpZGF0ZWQgTGlzdCAgYFVTX0RQTGA6IEJ1cmVhdSBvZiBJbmR1c3RyeSBhbmQgU2VjdXJpdHkgRGVuaWVkIFBlcnNvbnMgTGlzdCAgYFVTX0RUQ2A6IFVTIERlcGFydG1lbnQgb2YgU3RhdGUgQUVDQSBEZWJhcnJlZCAgYFVTX0ZCSWA6IFVTIERlcGFydG1lbnQgb2YgSnVzdGljZSBGQkkgV2FudGVkIExpc3QgIGBVU19GU0VgOiBVUyBPRkFDIEZvcmVpZ24gU2FuY3Rpb25zIEV2YWRlcnMgIGBVU19JU05gOiBVUyBEZXBhcnRtZW50IG9mIFN0YXRlIE5vbnByb2xpZmVyYXRpb24gU2FuY3Rpb25zICBgVVNfUExDYDogVVMgT0ZBQyBQYWxlc3RpbmlhbiBMZWdpc2xhdGl2ZSBDb3VuY2lsICBgVVNfU0ROYDogVVMgT0ZBQyBTcGVjaWFsbHkgRGVzaWduYXRlZCBOYXRpb25hbHMgTGlzdCAgYFVTX1NTSWA6IFVTIE9GQUMgU2VjdG9yYWwgU2FuY3Rpb25zIElkZW50aWZpY2F0aW9ucyAgYFNHX1NPRmA6IEdvdmVybm1lbnQgb2YgU2luZ2Fwb3JlIFRlcnJvcmlzdHMgYW5kIFRlcnJvcmlzdCBFbnRpdGllcyAgYFRSX1RXTGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IFRlcnJvcmlzdCBXYW50ZWQgTGlzdCAgYFRSX0RGRGA6IEdvdmVybm1lbnQgb2YgVHVya2V5IERvbWVzdGljIEZyZWV6aW5nIERlY2lzaW9ucyAgYFRSX0ZPUmA6IEdvdmVybm1lbnQgb2YgVHVya2V5IEZvcmVpZ24gRnJlZXppbmcgUmVxdWVzdHMgIGBUUl9XTURgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBXZWFwb25zIG9mIE1hc3MgRGVzdHJ1Y3Rpb24gIGBUUl9DTUJgOiBHb3Zlcm5tZW50IG9mIFR1cmtleSBDYXBpdGFsIE1hcmtldHMgQm9hcmRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlIHtcbiAgICBBdUNvbiA9ICdBVV9DT04nLFxuICAgIENhQ29uID0gJ0NBX0NPTicsXG4gICAgRXVDb24gPSAnRVVfQ09OJyxcbiAgICBJekNpYSA9ICdJWl9DSUEnLFxuICAgIEl6SXBsID0gJ0laX0lQTCcsXG4gICAgSXpQZXAgPSAnSVpfUEVQJyxcbiAgICBJelVuYyA9ICdJWl9VTkMnLFxuICAgIEl6V2JrID0gJ0laX1dCSycsXG4gICAgVWtIbWMgPSAnVUtfSE1DJyxcbiAgICBVc0RwbCA9ICdVU19EUEwnLFxuICAgIFVzRHRjID0gJ1VTX0RUQycsXG4gICAgVXNGYmkgPSAnVVNfRkJJJyxcbiAgICBVc0ZzZSA9ICdVU19GU0UnLFxuICAgIFVzSXNuID0gJ1VTX0lTTicsXG4gICAgVXNNYnMgPSAnVVNfTUJTJyxcbiAgICBVc1BsYyA9ICdVU19QTEMnLFxuICAgIFVzU2RuID0gJ1VTX1NETicsXG4gICAgVXNTc2kgPSAnVVNfU1NJJyxcbiAgICBTZ1NvZiA9ICdTR19TT0YnLFxuICAgIFRyVHdsID0gJ1RSX1RXTCcsXG4gICAgVHJEZmQgPSAnVFJfREZEJyxcbiAgICBUckZvciA9ICdUUl9GT1InLFxuICAgIFRyV21kID0gJ1RSX1dNRCcsXG4gICAgVHJDbWIgPSAnVFJfQ01CJ1xufVxuXG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgaW5kaXZpZHVhbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluZGl2aWR1YWxXYXRjaGxpc3RQcm9ncmFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW0ge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBwcm9ncmFtIGlzIGVuYWJsZWQgYW5kIHdpbGwgcGVyZm9ybSBkYWlseSByZXNjYW5zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEluZGl2aWR1YWxXYXRjaGxpc3RDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBJbmRpdmlkdWFsc1xcXCIsIFxcXCJVUyBDYXJkaG9sZGVyc1xcXCIsIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZ3JhbU5hbWVTZW5zaXRpdml0eX1cbiAgICAgKiBAbWVtYmVyb2YgSW5kaXZpZHVhbFdhdGNobGlzdFByb2dyYW1cbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbVxuICAgICAqL1xuICAgIGlzX2FyY2hpdmVkOiBib29sZWFuO1xufVxuLyoqXG4gKiBUaGUgYGluZmxvd19tb2RlbGAgYWxsb3dzIHlvdSB0byBtb2RlbCBhIHRlc3QgYWNjb3VudCB0aGF0IHJlY2VpdmVzIHJlZ3VsYXIgaW5jb21lIG9yIG1ha2UgcmVndWxhciBwYXltZW50cyBvbiBhIGxvYW4uIEFueSB0cmFuc2FjdGlvbnMgZ2VuZXJhdGVkIGJ5IHRoZSBgaW5mbG93X21vZGVsYCB3aWxsIGFwcGVhciBpbiBhZGRpdGlvbiB0byByYW5kb21seSBnZW5lcmF0ZWQgdGVzdCBkYXRhIG9yIHRyYW5zYWN0aW9ucyBzcGVjaWZpZWQgYnkgYG92ZXJyaWRlX2FjY291bnRzYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5mbG93TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmZsb3dNb2RlbCB7XG4gICAgLyoqXG4gICAgICogSW5mbG93IG1vZGVsLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBub25lYDogTm8gaW5jb21lICBgbW9udGhseS1pbmNvbWVgOiBJbmNvbWUgb2NjdXJzIG9uY2UgcGVyIG1vbnRoIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGA6IFBheXMgb2ZmIHRoZSBiYWxhbmNlIG9uIGEgbGlhYmlsaXR5IGFjY291bnQgYXQgdGhlIGdpdmVuIHN0YXRlbWVudCBkYXkgb2YgbW9udGguICBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgOiBNYWtlcyBhbiBpbnRlcmVzdC1vbmx5IHBheW1lbnQgb24gYSBsaWFiaWxpdHkgYWNjb3VudCBhdCB0aGUgZ2l2ZW4gc3RhdGVtZW50IGRheSBvZiBtb250aC4gIE5vdGUgdGhhdCBhY2NvdW50IHR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcyB3aWxsIGFjY3J1ZSBpbnRlcmVzdCBpbiB0aGUgU2FuZGJveC4gVGhlIHR5cGVzIGltcGFjdGVkIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBzdWJ0eXBlIGBjcmVkaXRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW1vdW50IG9mIGluY29tZSBwZXIgbW9udGguIFRoaXMgdmFsdWUgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBpbmNvbWVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIGJldHdlZW4gMSBhbmQgMjgsIG9yIGBsYXN0YCBtZWFuaW5nIHRoZSBsYXN0IGRheSBvZiB0aGUgbW9udGguIFRoZSBkYXkgb2YgdGhlIG1vbnRoIG9uIHdoaWNoIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24gd2lsbCBhcHBlYXIuIFRoZSBuYW1lIG9mIHRoZSBpbmNvbWUgdHJhbnNhY3Rpb24uIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYHR5cGVgIGlzIGBtb250aGx5LWluY29tZWAsIGBtb250aGx5LWJhbGFuY2UtcGF5bWVudGAgb3IgYG1vbnRobHktaW50ZXJlc3Qtb25seS1wYXltZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbmZsb3dNb2RlbFxuICAgICAqL1xuICAgIHBheW1lbnRfZGF5X29mX21vbnRoOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluY29tZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgdHlwZWAgaXMgYG1vbnRobHktaW5jb21lYCwgYG1vbnRobHktYmFsYW5jZS1wYXltZW50YCBvciBgbW9udGhseS1pbnRlcmVzdC1vbmx5LXBheW1lbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluZmxvd01vZGVsXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBiZXR3ZWVuIDEgYW5kIDI4LCBvciBgbGFzdGAgbWVhbmluZyB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLiBUaGUgZGF5IG9mIHRoZSBtb250aCBvbiB3aGljaCB0aGUgYmFsYW5jZSBpcyBjYWxjdWxhdGVkIGZvciB0aGUgbmV4dCBwYXltZW50LiBUaGUgbmFtZSBvZiB0aGUgaW5jb21lIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGB0eXBlYCBpcyBgbW9udGhseS1iYWxhbmNlLXBheW1lbnRgIG9yIGBtb250aGx5LWludGVyZXN0LW9ubHktcGF5bWVudGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5mbG93TW9kZWxcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRfZGF5X29mX21vbnRoOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgaW5pdGlhbCB0cmFuc2FjdGlvbiBwdWxsIGlzIGNvbXBsZXRlZC4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQsIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbS4gVGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTklUSUFMX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9vay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5ldyB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbml0aWFsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERldGFpbHMgcmVsYXRpbmcgdG8gYSBzcGVjaWZpYyBmaW5hbmNpYWwgaW5zdGl0dXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIG1heSBoYXZlIG11bHRpcGxlIHJlY29yZHMsIGVhY2ggd2l0aCBkaWZmZXJlbnQgaW5zdGl0dXRpb24gSURzOyBmb3IgZXhhbXBsZSwgaWYgdGhlIGluc3RpdHV0aW9uIGhhcyBtaWdyYXRlZCB0byBPQXV0aCwgdGhlcmUgbWF5IGJlIHNlcGFyYXRlIGBpbnN0aXR1dGlvbl9pZGBzIGZvciB0aGUgT0F1dGggYW5kIG5vbi1PQXV0aCB2ZXJzaW9ucyBvZiB0aGUgaW5zdGl0dXRpb24uIEluc3RpdHV0aW9ucyB0aGF0IG9wZXJhdGUgaW4gZGlmZmVyZW50IGNvdW50cmllcyBvciB3aXRoIG11bHRpcGxlIGxvZ2luIHBvcnRhbHMgbWF5IGFsc28gaGF2ZSBzZXBhcmF0ZSBgaW5zdGl0dXRpb25faWRgcyBmb3IgZWFjaCBjb3VudHJ5IG9yIHBvcnRhbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiB0aGUgUGxhaWQgcHJvZHVjdHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gTm90ZSB0aGF0IG9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IEF1dGggd2lsbCByZXR1cm4gYGF1dGhgIGluIHRoZSBwcm9kdWN0IGFycmF5OyBpbnN0aXR1dGlvbnMgdGhhdCBkbyBub3QgbGlzdCBgYXV0aGAgbWF5IHN0aWxsIHN1cHBvcnQgb3RoZXIgQXV0aCBtZXRob2RzIHN1Y2ggYXMgSW5zdGFudCBNYXRjaCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdCBWZXJpZmljYXRpb24uIFRvIGlkZW50aWZ5IGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UgbWV0aG9kcywgdXNlIHRoZSBgYXV0aF9tZXRhZGF0YWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0Z1bGwgQXV0aCBjb3ZlcmFnZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlLykuIFRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcHJvZHVjdCBoZXJlIGluZGljYXRlcyBzdXBwb3J0IGZvciBCYW5rIEluY29tZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBjb3VudHJ5IGNvZGVzIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PENvdW50cnlDb2RlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBmb3IgdGhlIGluc3RpdHV0aW9uXFwncyB3ZWJzaXRlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICB1cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmltYXJ5IGNvbG9yIHVzZWQgYnkgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBwcmltYXJ5X2NvbG9yPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQgZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5zdGl0dXRpb25cXCdzIGxvZ28sIHJldHVybmVkIGFzIGEgYmFzZTY0IGVuY29kZWQgMTUyeDE1MiBQTkcuIE5vdCBhbGwgaW5zdGl0dXRpb25zXFwnIGxvZ29zIGFyZSBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGtub3duIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24uIFRoaXMgbGlzdCBpcyBwcm92aWRlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgbG9va2luZyB1cCBpbnN0aXR1dGlvbnMgYnkgcm91dGluZyBudW1iZXIuIEl0IGlzIGdlbmVyYWxseSBjb21wcmVoZW5zaXZlIGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBhIGNvbXBsZXRlIGxpc3Qgb2Ygcm91dGluZyBudW1iZXJzIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBwYXJ0aWFsIGxpc3Qgb2YgRFRDIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBkdGNfbnVtYmVycz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGluc3RpdHV0aW9uIGhhcyBhbiBPQXV0aCBsb2dpbiBmbG93LiBUaGlzIHdpbGwgYmUgYHRydWVgIGlmIE9BdXRoIGlzIHN1cHBvcnRlZCBmb3IgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5zdGl0dXRpb24sIGV2ZW4gaWYgdGhlIGluc3RpdHV0aW9uIGFsc28gc3VwcG9ydHMgbm9uLU9BdXRoIGNvbm5lY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG9hdXRoOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBJbnN0aXR1dGlvblN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0F1dGhNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBhdXRoX21ldGFkYXRhPzogQXV0aE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhbiBpbnN0aXR1dGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBoZWFsdGggb2YgaXRzIEl0ZW0gbG9naW5zLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgQXV0aCByZXF1ZXN0cywgQmFsYW5jZSByZXF1ZXN0cywgSWRlbnRpdHkgcmVxdWVzdHMsIEludmVzdG1lbnRzIHJlcXVlc3RzLCBhbmQgTGlhYmlsaXRpZXMgcmVxdWVzdHMuIEEgbG9naW4gYXR0ZW1wdCBpcyBjb25kdWN0ZWQgZHVyaW5nIHRoZSBpbml0aWFsIEl0ZW0gYWRkIGluIExpbmsuIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggdHJhZmZpYyB0byBhY2N1cmF0ZWx5IGNhbGN1bGF0ZSBhbiBpbnN0aXR1dGlvblxcJ3Mgc3RhdHVzLCBQbGFpZCB3aWxsIHJldHVybiBudWxsIHJhdGhlciB0aGFuIHBvdGVudGlhbGx5IGluYWNjdXJhdGUgZGF0YS4gIEluc3RpdHV0aW9uIHN0YXR1cyBpcyBhY2Nlc3NpYmxlIGluIHRoZSBEYXNoYm9hcmQgYW5kIHZpYSB0aGUgQVBJIHVzaW5nIHRoZSBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgIGVuZHBvaW50IHdpdGggdGhlIGBpbmNsdWRlX3N0YXR1c2Agb3B0aW9uIHNldCB0byB0cnVlLiBOb3RlIHRoYXQgaW5zdGl0dXRpb24gc3RhdHVzIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvblN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBpdGVtX2xvZ2lucz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uc191cGRhdGVzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgYXV0aD86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGlkZW50aXR5PzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHNfdXBkYXRlcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzX3VwZGF0ZXM/OiBQcm9kdWN0U3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdGF0dXNcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllcz86IFByb2R1Y3RTdGF0dXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogUHJvZHVjdFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGV0YWlscyBvZiByZWNlbnQgaGVhbHRoIGluY2lkZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxIZWFsdGhJbmNpZGVudD59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzXG4gICAgICovXG4gICAgaGVhbHRoX2luY2lkZW50cz86IEFycmF5PEhlYWx0aEluY2lkZW50PiB8IG51bGw7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gaW5zdGl0dXRpb24gc3RhdHVzIG1lZXRzIHRoZSBjb25kaXRpb25zIGNvbmZpZ3VyZWQgaW4gdGhlIGRldmVsb3BlciBkYXNoYm9hcmQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdGF0dXNBbGVydFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBEQVNIQk9BUkRfQ09ORklHVVJFRF9BTEVSVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJTlNUSVRVVElPTl9TVEFUVVNfQUxFUlRfVFJJR0dFUkVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhc3NvY2lhdGVkIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZ2xvYmFsIHN1Y2Nlc3MgcmF0ZSBvZiB0aGUgaW5zdGl0dXRpb24sIGNhbGN1bGF0ZWQgYmFzZWQgb24gaXRlbSBhZGQgaGVhbHRoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uU3RhdHVzQWxlcnRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fb3ZlcmFsbF9zdWNjZXNzX3JhdGU6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN0YXR1c0FsZXJ0V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBSVFAgYW5kIFJmUCBuZXR3b3JrIGFuZCB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGxpbmtlZCBJdGVtXFwncyBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3Jrc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3Mge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUH1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25TdXBwb3J0ZWROZXR3b3Jrc1xuICAgICAqL1xuICAgIHJ0cDogVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSVFA7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmZQfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvblN1cHBvcnRlZE5ldHdvcmtzXG4gICAgICovXG4gICAgcmZwOiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJmUDtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBpbnN0aXR1dGlvbiB0byBnZXQgZGV0YWlscyBhYm91dFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGNvdW50cnkgb3IgY291bnRyaWVzIHRvIGluY2x1ZGUgaW5zdGl0dXRpb25zIGZyb20sIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBJbiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciwgdGhlIGBjb3VudHJ5X2NvZGVzYCBwYXJhbWV0ZXIgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHdpdGhpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBhbmQgd2lsbCBkZWZhdWx0IHRvIGBbVVNdYCBpZiBpdCBpcyBub3Qgc3VwcGxpZWQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGAuIElmIHByb3ZpZGVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybiBhbiBpbnN0aXR1dGlvblxcJ3MgbG9nbywgYnJhbmQgY29sb3IsIGFuZCBVUkwuIFdoZW4gYXZhaWxhYmxlLCB0aGUgYmFua1xcJ3MgbG9nbyBpcyByZXR1cm5lZCBhcyBhIGJhc2U2NCBlbmNvZGVkIDE1MngxNTIgUE5HLCB0aGUgYnJhbmQgY29sb3IgaXMgaW4gaGV4YWRlY2ltYWwgZm9ybWF0LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBgZmFsc2VgLiAgTm90ZSB0aGF0IFBsYWlkIGRvZXMgbm90IG93biBhbnkgb2YgdGhlIGxvZ29zIHNoYXJlZCBieSB0aGUgQVBJIGFuZCB0aGF0IGJ5IGFjY2Vzc2luZyBvciB1c2luZyB0aGVzZSBsb2dvcywgeW91IGFncmVlIHRoYXQgeW91IGFyZSBkb2luZyBzbyBhdCB5b3VyIG93biByaXNrIGFuZCB3aWxsLCBpZiBuZWNlc3NhcnksIG9idGFpbiBhbGwgcmVxdWlyZWQgcGVybWlzc2lvbnMgZnJvbSB0aGUgYXBwcm9wcmlhdGUgcmlnaHRzIGhvbGRlcnMgYW5kIGFkaGVyZSB0byBhbnkgYXBwbGljYWJsZSB1c2FnZSBndWlkZWxpbmVzLiBQbGFpZCBkaXNjbGFpbXMgYWxsIGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50aWVzIHdpdGggcmVzcGVjdCB0byB0aGUgbG9nb3MuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgdGhlIHJlc3BvbnNlIHdpbGwgaW5jbHVkZSBzdGF0dXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc3RpdHV0aW9uLiBEZWZhdWx0IHZhbHVlIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfc3RhdHVzPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBBdXRoIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBhdXRoIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9hdXRoX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBQYXltZW50IEluaXRpYXRpb24gcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9wYXltZW50X2luaXRpYXRpb25fbWV0YWRhdGE/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRfYnlfaWRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRCeUlkUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogSW5zdGl0dXRpb247XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pbnN0aXR1dGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgSW5zdGl0dXRpb25zIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIEluc3RpdHV0aW9ucyB0byBza2lwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGNvdW50cnkgb3IgY291bnRyaWVzIHRvIGluY2x1ZGUgaW5zdGl0dXRpb25zIGZyb20sIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiAgSW4gQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIsIHRoZSBgY291bnRyeV9jb2Rlc2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB3aXRoaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgYW5kIHdpbGwgZGVmYXVsdCB0byBgW1VTXWAgaWYgaXQgaXMgbm90IHN1cHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2luc3RpdHV0aW9ucy9nZXRgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0aGUgSW5zdGl0dXRpb25zIGJhc2VkIG9uIHdoaWNoIHByb2R1Y3RzIHRoZXkgc3VwcG9ydC4gV2lsbCBvbmx5IHJldHVybiBpbnN0aXR1dGlvbnMgdGhhdCBzdXBwb3J0IGFsbCBsaXN0ZWQgcHJvZHVjdHMuIFdoZW4gZmlsdGVyaW5nIGJhc2VkIG9uIGBhdXRoYCwgYW4gaW5zdGl0dXRpb24gbXVzdCBzdXBwb3J0IEluc3RhbnQgQXV0aCB0byBtYXRjaCB0aGUgY3JpdGVyaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgYW4gYXJyYXkgb2Ygcm91dGluZyBudW1iZXJzIHRvIGZpbHRlciBpbnN0aXR1dGlvbnMuIFRoZSByZXNwb25zZSB3aWxsIG9ubHkgcmV0dXJuIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIGFsbCBvZiB0aGUgcm91dGluZyBudW1iZXJzIGluIHRoZSBhcnJheS4gUm91dGluZyBudW1iZXIgcmVjb3JkcyB1c2VkIGZvciB0aGlzIG1hdGNoaW5nIGFyZSBnZW5lcmFsbHkgY29tcHJlaGVuc2l2ZTsgaG93ZXZlciwgZmFpbHVyZSB0byBtYXRjaCBhIGdpdmVuIHJvdXRpbmcgbnVtYmVyIHRvIGFuIGluc3RpdHV0aW9uIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhhdCB0aGUgaW5zdGl0dXRpb24gaXMgdW5zdXBwb3J0ZWQgYnkgUGxhaWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXJzPzogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGltaXQgcmVzdWx0cyB0byBpbnN0aXR1dGlvbnMgd2l0aCBvciB3aXRob3V0IE9BdXRoIGxvZ2luIGZsb3dzLiBOb3RlIHRoYXQgaW5zdGl0dXRpb25zIHdpbGwgaGF2ZSBgb2F1dGhgIHNldCB0byBgdHJ1ZWAgaWYgc29tZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhhdCBpbnN0aXR1dGlvbiBhcmUgcmVxdWlyZWQgdG8gdXNlIE9BdXRoIGZsb3dzOyBpbnN0aXR1dGlvbnMgaW4gYSBzdGF0ZSBvZiBtaWdyYXRpb24gdG8gT0F1dGggd2lsbCBoYXZlIHRoZSBgb2F1dGhgIGF0dHJpYnV0ZSBzZXQgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9hdXRoPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHJldHVybiB0aGUgaW5zdGl0dXRpb25cXCdzIGhvbWVwYWdlIFVSTCwgbG9nbyBhbmQgcHJpbWFyeSBicmFuZCBjb2xvci4gTm90IGFsbCBpbnN0aXR1dGlvbnNcXCcgbG9nb3MgYXJlIGF2YWlsYWJsZS4gIE5vdGUgdGhhdCBQbGFpZCBkb2VzIG5vdCBvd24gYW55IG9mIHRoZSBsb2dvcyBzaGFyZWQgYnkgdGhlIEFQSSwgYW5kIHRoYXQgYnkgYWNjZXNzaW5nIG9yIHVzaW5nIHRoZXNlIGxvZ29zLCB5b3UgYWdyZWUgdGhhdCB5b3UgYXJlIGRvaW5nIHNvIGF0IHlvdXIgb3duIHJpc2sgYW5kIHdpbGwsIGlmIG5lY2Vzc2FyeSwgb2J0YWluIGFsbCByZXF1aXJlZCBwZXJtaXNzaW9ucyBmcm9tIHRoZSBhcHByb3ByaWF0ZSByaWdodHMgaG9sZGVycyBhbmQgYWRoZXJlIHRvIGFueSBhcHBsaWNhYmxlIHVzYWdlIGd1aWRlbGluZXMuIFBsYWlkIGRpc2NsYWltcyBhbGwgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnRpZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBsb2dvcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29wdGlvbmFsX21ldGFkYXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgcmV0dXJucyBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBBdXRoIHByb2R1Y3QgaW5kaWNhdGluZyB3aGljaCBhdXRoIG1ldGhvZHMgYXJlIHN1cHBvcnRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX2F1dGhfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogSW5zdGl0dXRpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBQbGFpZCBpbnN0aXR1dGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uczogQXJyYXk8SW5zdGl0dXRpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgaW5zdGl0dXRpb25zIGF2YWlsYWJsZSB2aWEgdGhpcyBlbmRwb2ludFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWw6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIGFjY291bnQgZmlsdGVyIHRvIGFwcGx5IHRvIGluc3RpdHV0aW9ucyBzZWFyY2ggcmVxdWVzdHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBsb2FuPzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBkZXBvc2l0b3J5PzogQXJyYXk8QWNjb3VudFN1YnR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaEFjY291bnRGaWx0ZXJcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoQWNjb3VudEZpbHRlclxuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBBcnJheTxBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgaW5zdGl0dXRpb25zIGJ5IHZhcmlvdXMgUGF5bWVudCBJbml0aWF0aW9uIGNvbmZpZ3VyYXRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUGF5bWVudEluaXRpYXRpb25PcHRpb25zXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHBheW1lbnQgY29uc2VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc1xuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlYXJjaCBxdWVyeS4gSW5zdGl0dXRpb25zIHdpdGggbmFtZXMgbWF0Y2hpbmcgdGhlIHF1ZXJ5IGFyZSByZXR1cm5lZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBxdWVyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciB0aGUgSW5zdGl0dXRpb25zIGJhc2VkIG9uIHdoZXRoZXIgdGhleSBzdXBwb3J0IGFsbCBwcm9kdWN0cyBsaXN0ZWQgaW4gYHByb2R1Y3RzYC4gUHJvdmlkZSBgbnVsbGAgdG8gZ2V0IGluc3RpdHV0aW9ucyByZWdhcmRsZXNzIG9mIHN1cHBvcnRlZCBwcm9kdWN0cy4gTm90ZSB0aGF0IHdoZW4gYGF1dGhgIGlzIHNwZWNpZmllZCBhcyBhIHByb2R1Y3QsIGlmIHlvdSBhcmUgZW5hYmxlZCBmb3IgSW5zdGFudCBNYXRjaCBvciBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMsIGluc3RpdHV0aW9ucyB0aGF0IHN1cHBvcnQgdGhvc2UgcHJvZHVjdHMgd2lsbCBiZSByZXR1cm5lZCBldmVuIGlmIGBhdXRoYCBpcyBub3QgcHJlc2VudCBpbiB0aGVpciBwcm9kdWN0IGFycmF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBjb3VudHJ5IG9yIGNvdW50cmllcyB0byBpbmNsdWRlIGluc3RpdHV0aW9ucyBmcm9tLCB1c2luZyB0aGUgSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC4gSW4gQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIsIHRoZSBgY291bnRyeV9jb2Rlc2AgcGFyYW1ldGVyIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB3aXRoaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgYW5kIHdpbGwgZGVmYXVsdCB0byBgW1VTXWAgaWYgaXQgaXMgbm90IHN1cHBsaWVkLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2luc3RpdHV0aW9ucy9zZWFyY2hgIHJlc3VsdHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIExpbWl0IHJlc3VsdHMgdG8gaW5zdGl0dXRpb25zIHdpdGggb3Igd2l0aG91dCBPQXV0aCBsb2dpbiBmbG93cy4gTm90ZSB0aGF0IGluc3RpdHV0aW9ucyB3aWxsIGhhdmUgYG9hdXRoYCBzZXQgdG8gYHRydWVgIGlmIHNvbWUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaW5zdGl0dXRpb24gYXJlIHJlcXVpcmVkIHRvIHVzZSBPQXV0aCBmbG93czsgaW5zdGl0dXRpb25zIGluIGEgc3RhdGUgb2YgbWlncmF0aW9uIHRvIE9BdXRoIHdpbGwgaGF2ZSB0aGUgYG9hdXRoYCBhdHRyaWJ1dGUgc2V0IHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvYXV0aD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgcmV0dXJuIHRoZSBpbnN0aXR1dGlvblxcJ3MgaG9tZXBhZ2UgVVJMLCBsb2dvIGFuZCBwcmltYXJ5IGJyYW5kIGNvbG9yLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfb3B0aW9uYWxfbWV0YWRhdGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIEF1dGggcHJvZHVjdCBpbmRpY2F0aW5nIHdoaWNoIGF1dGggbWV0aG9kcyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfYXV0aF9tZXRhZGF0YT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCByZXR1cm5zIG1ldGFkYXRhIHJlbGF0ZWQgdG8gdGhlIFBheW1lbnQgSW5pdGlhdGlvbiBwcm9kdWN0IGluZGljYXRpbmcgd2hpY2ggcGF5bWVudCBjb25maWd1cmF0aW9ucyBhcmUgc3VwcG9ydGVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGluY2x1ZGVfcGF5bWVudF9pbml0aWF0aW9uX21ldGFkYXRhPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uc1NlYXJjaFBheW1lbnRJbml0aWF0aW9uT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBwYXltZW50X2luaXRpYXRpb24/OiBJbnN0aXR1dGlvbnNTZWFyY2hQYXltZW50SW5pdGlhdGlvbk9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaW5zdGl0dXRpb25zL3NlYXJjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW5zdGl0dXRpb25zU2VhcmNoUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgaW5zdGl0dXRpb25zIG1hdGNoaW5nIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uczogQXJyYXk8SW5zdGl0dXRpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3IgaW52ZXN0bWVudCBhY2NvdW50cy4gRm9yIGEgbGlzdCBjb250YWluaW5nIGRlc2NyaXB0aW9ucyBvZiBlYWNoIHN1YnR5cGUsIHNlZSBbQWNjb3VudCBzY2hlbWFzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cy8jU3RhbmRhbG9uZUFjY291bnRUeXBlLWludmVzdG1lbnQpLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gSW52ZXN0bWVudEFjY291bnRTdWJ0eXBlIHtcbiAgICBfNTI5ID0gJzUyOScsXG4gICAgXzQwMWEgPSAnNDAxYScsXG4gICAgXzQwMWsgPSAnNDAxaycsXG4gICAgXzQwM0IgPSAnNDAzQicsXG4gICAgXzQ1N2IgPSAnNDU3YicsXG4gICAgQnJva2VyYWdlID0gJ2Jyb2tlcmFnZScsXG4gICAgQ2FzaElzYSA9ICdjYXNoIGlzYScsXG4gICAgQ3J5cHRvRXhjaGFuZ2UgPSAnY3J5cHRvIGV4Y2hhbmdlJyxcbiAgICBFZHVjYXRpb25TYXZpbmdzQWNjb3VudCA9ICdlZHVjYXRpb24gc2F2aW5ncyBhY2NvdW50JyxcbiAgICBGaXhlZEFubnVpdHkgPSAnZml4ZWQgYW5udWl0eScsXG4gICAgR2ljID0gJ2dpYycsXG4gICAgSGVhbHRoUmVpbWJ1cnNlbWVudEFycmFuZ2VtZW50ID0gJ2hlYWx0aCByZWltYnVyc2VtZW50IGFycmFuZ2VtZW50JyxcbiAgICBIc2EgPSAnaHNhJyxcbiAgICBJcmEgPSAnaXJhJyxcbiAgICBJc2EgPSAnaXNhJyxcbiAgICBLZW9naCA9ICdrZW9naCcsXG4gICAgTGlmID0gJ2xpZicsXG4gICAgTGlmZUluc3VyYW5jZSA9ICdsaWZlIGluc3VyYW5jZScsXG4gICAgTGlyYSA9ICdsaXJhJyxcbiAgICBMcmlmID0gJ2xyaWYnLFxuICAgIExyc3AgPSAnbHJzcCcsXG4gICAgTXV0dWFsRnVuZCA9ICdtdXR1YWwgZnVuZCcsXG4gICAgTm9uQ3VzdG9kaWFsV2FsbGV0ID0gJ25vbi1jdXN0b2RpYWwgd2FsbGV0JyxcbiAgICBOb25UYXhhYmxlQnJva2VyYWdlQWNjb3VudCA9ICdub24tdGF4YWJsZSBicm9rZXJhZ2UgYWNjb3VudCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIE90aGVyQW5udWl0eSA9ICdvdGhlciBhbm51aXR5JyxcbiAgICBPdGhlckluc3VyYW5jZSA9ICdvdGhlciBpbnN1cmFuY2UnLFxuICAgIFBlbnNpb24gPSAncGVuc2lvbicsXG4gICAgUHJpZiA9ICdwcmlmJyxcbiAgICBQcm9maXRTaGFyaW5nUGxhbiA9ICdwcm9maXQgc2hhcmluZyBwbGFuJyxcbiAgICBRc2hyID0gJ3FzaHInLFxuICAgIFJkc3AgPSAncmRzcCcsXG4gICAgUmVzcCA9ICdyZXNwJyxcbiAgICBSZXRpcmVtZW50ID0gJ3JldGlyZW1lbnQnLFxuICAgIFJsaWYgPSAncmxpZicsXG4gICAgUm90aCA9ICdyb3RoJyxcbiAgICBSb3RoNDAxayA9ICdyb3RoIDQwMWsnLFxuICAgIFJyaWYgPSAncnJpZicsXG4gICAgUnJzcCA9ICdycnNwJyxcbiAgICBTYXJzZXAgPSAnc2Fyc2VwJyxcbiAgICBTZXBJcmEgPSAnc2VwIGlyYScsXG4gICAgU2ltcGxlSXJhID0gJ3NpbXBsZSBpcmEnLFxuICAgIFNpcHAgPSAnc2lwcCcsXG4gICAgU3RvY2tQbGFuID0gJ3N0b2NrIHBsYW4nLFxuICAgIFRmc2EgPSAndGZzYScsXG4gICAgVHJ1c3QgPSAndHJ1c3QnLFxuICAgIFVnbWEgPSAndWdtYScsXG4gICAgVXRtYSA9ICd1dG1hJyxcbiAgICBWYXJpYWJsZUFubnVpdHkgPSAndmFyaWFibGUgYW5udWl0eScsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzOiBBcnJheTxJbnZlc3RtZW50QWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gZmlsdGVyIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCByZXN1bHRzLiBJZiBwcm92aWRlZCwgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZGBzIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS4gQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogQSB0cmFuc2FjdGlvbiB3aXRoaW4gYW4gaW52ZXN0bWVudCBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50VHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSW52ZXN0bWVudCB0cmFuc2FjdGlvbiwgdW5pcXVlIGFjcm9zcyBhbGwgUGxhaWQgdHJhbnNhY3Rpb25zLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsZWdhY3kgZmllbGQgZm9ybWVybHkgdXNlZCBpbnRlcm5hbGx5IGJ5IFBsYWlkIHRvIGlkZW50aWZ5IGNlcnRhaW4gY2FuY2VsZWQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2FuY2VsX3RyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFnYWluc3Qgd2hpY2ggdGhpcyB0cmFuc2FjdGlvbiBwb3N0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgc2VjdXJpdHlfaWRgIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gaXMgcmVsYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgcG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbuKAmXMgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZSBzZWN1cml0eSBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBQb3NpdGl2ZSBmb3IgYnV5IHRyYW5zYWN0aW9uczsgbmVnYXRpdmUgZm9yIHNlbGwgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHF1YW50aXR5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbXBsZXRlIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbi4gUG9zaXRpdmUgdmFsdWVzIHdoZW4gY2FzaCBpcyBkZWJpdGVkLCBlLmcuIHB1cmNoYXNlcyBvZiBzdG9jazsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gY2FzaCBpcyBjcmVkaXRlZCwgZS5nLiBzYWxlcyBvZiBzdG9jay4gVHJlYXRtZW50IHJlbWFpbnMgdGhlIHNhbWUgZm9yIGNhc2gtb25seSBtb3ZlbWVudHMgdW5hc3NvY2lhdGVkIHdpdGggc2VjdXJpdGllcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgY29tYmluZWQgdmFsdWUgb2YgYWxsIGZlZXMgYXBwbGllZCB0byB0aGlzIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgZmVlczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc3VidHlwZTogSW52ZXN0bWVudFRyYW5zYWN0aW9uU3VidHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZy4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBGb3IgZGVzY3JpcHRpb25zIG9mIHBvc3NpYmxlIHRyYW5zYWN0aW9uIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbSW52ZXN0bWVudCB0cmFuc2FjdGlvbiB0eXBlcyBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNpbnZlc3RtZW50LXRyYW5zYWN0aW9uLXR5cGVzLXNjaGVtYSkuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJbnZlc3RtZW50VHJhbnNhY3Rpb25TdWJ0eXBlIHtcbiAgICBBY2NvdW50RmVlID0gJ2FjY291bnQgZmVlJyxcbiAgICBBZGp1c3RtZW50ID0gJ2FkanVzdG1lbnQnLFxuICAgIEFzc2lnbm1lbnQgPSAnYXNzaWdubWVudCcsXG4gICAgQnV5ID0gJ2J1eScsXG4gICAgQnV5VG9Db3ZlciA9ICdidXkgdG8gY292ZXInLFxuICAgIENvbnRyaWJ1dGlvbiA9ICdjb250cmlidXRpb24nLFxuICAgIERlcG9zaXQgPSAnZGVwb3NpdCcsXG4gICAgRGlzdHJpYnV0aW9uID0gJ2Rpc3RyaWJ1dGlvbicsXG4gICAgRGl2aWRlbmQgPSAnZGl2aWRlbmQnLFxuICAgIERpdmlkZW5kUmVpbnZlc3RtZW50ID0gJ2RpdmlkZW5kIHJlaW52ZXN0bWVudCcsXG4gICAgRXhlcmNpc2UgPSAnZXhlcmNpc2UnLFxuICAgIEV4cGlyZSA9ICdleHBpcmUnLFxuICAgIEZ1bmRGZWUgPSAnZnVuZCBmZWUnLFxuICAgIEludGVyZXN0ID0gJ2ludGVyZXN0JyxcbiAgICBJbnRlcmVzdFJlY2VpdmFibGUgPSAnaW50ZXJlc3QgcmVjZWl2YWJsZScsXG4gICAgSW50ZXJlc3RSZWludmVzdG1lbnQgPSAnaW50ZXJlc3QgcmVpbnZlc3RtZW50JyxcbiAgICBMZWdhbEZlZSA9ICdsZWdhbCBmZWUnLFxuICAgIExvYW5QYXltZW50ID0gJ2xvYW4gcGF5bWVudCcsXG4gICAgTG9uZ1Rlcm1DYXBpdGFsR2FpbiA9ICdsb25nLXRlcm0gY2FwaXRhbCBnYWluJyxcbiAgICBMb25nVGVybUNhcGl0YWxHYWluUmVpbnZlc3RtZW50ID0gJ2xvbmctdGVybSBjYXBpdGFsIGdhaW4gcmVpbnZlc3RtZW50JyxcbiAgICBNYW5hZ2VtZW50RmVlID0gJ21hbmFnZW1lbnQgZmVlJyxcbiAgICBNYXJnaW5FeHBlbnNlID0gJ21hcmdpbiBleHBlbnNlJyxcbiAgICBNZXJnZXIgPSAnbWVyZ2VyJyxcbiAgICBNaXNjZWxsYW5lb3VzRmVlID0gJ21pc2NlbGxhbmVvdXMgZmVlJyxcbiAgICBOb25RdWFsaWZpZWREaXZpZGVuZCA9ICdub24tcXVhbGlmaWVkIGRpdmlkZW5kJyxcbiAgICBOb25SZXNpZGVudFRheCA9ICdub24tcmVzaWRlbnQgdGF4JyxcbiAgICBQZW5kaW5nQ3JlZGl0ID0gJ3BlbmRpbmcgY3JlZGl0JyxcbiAgICBQZW5kaW5nRGViaXQgPSAncGVuZGluZyBkZWJpdCcsXG4gICAgUXVhbGlmaWVkRGl2aWRlbmQgPSAncXVhbGlmaWVkIGRpdmlkZW5kJyxcbiAgICBSZWJhbGFuY2UgPSAncmViYWxhbmNlJyxcbiAgICBSZXR1cm5PZlByaW5jaXBhbCA9ICdyZXR1cm4gb2YgcHJpbmNpcGFsJyxcbiAgICBSZXF1ZXN0ID0gJ3JlcXVlc3QnLFxuICAgIFNlbGwgPSAnc2VsbCcsXG4gICAgU2VsbFNob3J0ID0gJ3NlbGwgc2hvcnQnLFxuICAgIFNlbmQgPSAnc2VuZCcsXG4gICAgU2hvcnRUZXJtQ2FwaXRhbEdhaW4gPSAnc2hvcnQtdGVybSBjYXBpdGFsIGdhaW4nLFxuICAgIFNob3J0VGVybUNhcGl0YWxHYWluUmVpbnZlc3RtZW50ID0gJ3Nob3J0LXRlcm0gY2FwaXRhbCBnYWluIHJlaW52ZXN0bWVudCcsXG4gICAgU3Bpbk9mZiA9ICdzcGluIG9mZicsXG4gICAgU3BsaXQgPSAnc3BsaXQnLFxuICAgIFN0b2NrRGlzdHJpYnV0aW9uID0gJ3N0b2NrIGRpc3RyaWJ1dGlvbicsXG4gICAgVGF4ID0gJ3RheCcsXG4gICAgVGF4V2l0aGhlbGQgPSAndGF4IHdpdGhoZWxkJyxcbiAgICBUcmFkZSA9ICd0cmFkZScsXG4gICAgVHJhbnNmZXIgPSAndHJhbnNmZXInLFxuICAgIFRyYW5zZmVyRmVlID0gJ3RyYW5zZmVyIGZlZScsXG4gICAgVHJ1c3RGZWUgPSAndHJ1c3QgZmVlJyxcbiAgICBVbnF1YWxpZmllZEdhaW4gPSAndW5xdWFsaWZpZWQgZ2FpbicsXG4gICAgV2l0aGRyYXdhbCA9ICd3aXRoZHJhd2FsJ1xufVxuXG4vKipcbiAqIFZhbHVlIGlzIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBgYnV5YDogQnV5aW5nIGFuIGludmVzdG1lbnQgYHNlbGxgOiBTZWxsaW5nIGFuIGludmVzdG1lbnQgYGNhbmNlbGA6IEEgY2FuY2VsbGF0aW9uIG9mIGEgcGVuZGluZyB0cmFuc2FjdGlvbiBgY2FzaGA6IEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBjYXNoIHBvc2l0aW9uIGBmZWVgOiBBIGZlZSBvbiB0aGUgYWNjb3VudCBgdHJhbnNmZXJgOiBBY3Rpdml0eSB3aGljaCBtb2RpZmllcyBhIHBvc2l0aW9uLCBidXQgbm90IHRocm91Z2ggYnV5L3NlbGwgYWN0aXZpdHkgZS5nLiBvcHRpb25zIGV4ZXJjaXNlLCBwb3J0Zm9saW8gdHJhbnNmZXIgIEZvciBkZXNjcmlwdGlvbnMgb2YgcG9zc2libGUgdHJhbnNhY3Rpb24gdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtJbnZlc3RtZW50IHRyYW5zYWN0aW9uIHR5cGVzIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI2ludmVzdG1lbnQtdHJhbnNhY3Rpb24tdHlwZXMtc2NoZW1hKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEludmVzdG1lbnRUcmFuc2FjdGlvblR5cGUge1xuICAgIEJ1eSA9ICdidXknLFxuICAgIFNlbGwgPSAnc2VsbCcsXG4gICAgQ2FuY2VsID0gJ2NhbmNlbCcsXG4gICAgQ2FzaCA9ICdjYXNoJyxcbiAgICBGZWUgPSAnZmVlJyxcbiAgICBUcmFuc2ZlciA9ICd0cmFuc2Zlcidcbn1cblxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiBjb250cmlidXRpb24gdHJhbnNhY3Rpb25zIGZvciB0aGUgNDAxayBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdGhlIG1vc3QgcmVjZW50IGNvbnRyaWJ1dGlvbiB0cmFuc2FjdGlvbnMgZm9yIHRoZSA0MDFrIGFjY291bnQuIEluY2x1ZGVzIGFsbCBjb250cmlidXRpb25zIG1hZGUgb24gdGhlIHNhbWUgZGF5LlxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGxhc3RfY29udHJpYnV0aW9uX3RyYW5zYWN0aW9uczogQXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCBtb250aC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9jb3VudF8xbTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiB0aGUgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCBtb250aC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9hbW91bnRfMW06IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCA2IG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9jb3VudF82bTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiB0aGUgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCA2IG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9hbW91bnRfNm06IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgY29udHJpYnV0aW9uIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCAxMiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0NvbnRyaWJ1dGlvbkRldGFpbHNcbiAgICAgKi9cbiAgICBjb250cmlidXRpb25fY291bnRfMTJtOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIHRoZSBjb250cmlidXRpb24gdHJhbnNhY3Rpb25zIG9uIHRoaXMgYWNjb3VudCwgZm9yIHRoZSBwYXN0IDEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrQ29udHJpYnV0aW9uRGV0YWlsc1xuICAgICAqL1xuICAgIGNvbnRyaWJ1dGlvbl9hbW91bnRfMTJtOiBudW1iZXI7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIG9uIGFjY291bnQgZmVlIHRyYW5zYWN0aW9ucyBmb3IgdGhlIDQwMWsgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoNDAxa0ZlZURldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGg0MDFrRmVlRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGFjY291bnQgZmVlIHRyYW5zYWN0aW9ucyBvbiB0aGlzIGFjY291bnQsIGZvciB0aGUgcGFzdCAxMiBtb250aHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoNDAxa0ZlZURldGFpbHNcbiAgICAgKi9cbiAgICBhY2NvdW50X2ZlZV9jb3VudF8xMm06IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgYWNjb3VudCBmZWUgdHJhbnNhY3Rpb25zIG9uIHRoaXMgYWNjb3VudCwgZm9yIHRoZSBwYXN0IDEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGg0MDFrRmVlRGV0YWlsc1xuICAgICAqL1xuICAgIGFjY291bnRfZmVlX2Ftb3VudF8xMm06IG51bWJlcjtcbn1cbi8qKlxuICogQWRkaXRpb25hbCBhY2NvdW50IGZlZSBhbmQgY29udHJpYnV0aW9uIGluZm9ybWF0aW9uIGZvciA0MDFrIHR5cGUgYWNjb3VudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxa1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxayB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSA0MDFrIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoQWNjb3VudERldGFpbHM0MDFrXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoNDAxa0ZlZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxa1xuICAgICAqL1xuICAgIGZlZV9kZXRhaWxzPzogSW52ZXN0bWVudHNBdXRoNDAxa0ZlZURldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhBY2NvdW50RGV0YWlsczQwMWtcbiAgICAgKi9cbiAgICBjb250cmlidXRpb25fZGV0YWlscz86IEludmVzdG1lbnRzQXV0aDQwMWtDb250cmlidXRpb25EZXRhaWxzO1xufVxuLyoqXG4gKiBPYmplY3Qgd2l0aCBtZXRhZGF0YSBwZXJ0YWluaW5nIHRvIHRoZSBzb3VyY2Ugb2YgZGF0YSBmb3IgdGhlIGFjY291bnQgbnVtYmVycywgb3duZXJzLCBhbmQgaG9sZGluZ3MgdGhhdCBhcmUgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aERhdGFTb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXRhU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXNcbiAgICAgKi9cbiAgICBudW1iZXJzPzogRGF0YVNvdXJjZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RhdGFTb3VyY2VzfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlc1xuICAgICAqL1xuICAgIG93bmVycz86IERhdGFTb3VyY2VzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEYXRhU291cmNlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXNcbiAgICAgKi9cbiAgICBob2xkaW5ncz86IERhdGFTb3VyY2VzO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIGhvbGRpbmdzIHRvIGFuIGludmVzdG1lbnRzIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldE51bWJlcnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0FDQVRTPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIGFjYXRzPzogQXJyYXk8TnVtYmVyc0FDQVRTPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc0FUT04+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXROdW1iZXJzXG4gICAgICovXG4gICAgYXRvbj86IEFycmF5PE51bWJlcnNBVE9OPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TnVtYmVyc1JldGlyZW1lbnQ0MDFrPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVyc1xuICAgICAqL1xuICAgIHJldGlyZW1lbnRfNDAxaz86IEFycmF5PE51bWJlcnNSZXRpcmVtZW50NDAxaz47XG59XG4vKipcbiAqIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgcyB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9hdXRoL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCBkYXRhIGlzIGJlaW5nIHJldHJpZXZlZFxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudHM6IEFycmF5PEFjY291bnRCYXNlPjtcbiAgICAvKipcbiAgICAgKiBUaGUgaG9sZGluZ3MgYmVsb25naW5nIHRvIGludmVzdG1lbnQgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBEZXRhaWxzIG9mIHRoZSBzZWN1cml0aWVzIGluIHRoZSBob2xkaW5ncyBhcmUgcHJvdmlkZWQgaW4gdGhlIGBzZWN1cml0aWVzYCBmaWVsZC4gXG4gICAgICogQHR5cGUge0FycmF5PEhvbGRpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGhvbGRpbmdzOiBBcnJheTxIb2xkaW5nPjtcbiAgICAvKipcbiAgICAgKiBPYmplY3RzIGRlc2NyaWJpbmcgdGhlIHNlY3VyaXRpZXMgaGVsZCBpbiB0aGUgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VjdXJpdHk+fVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudCBvd25lcnMgZm9yIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50c0F1dGhPd25lcj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3duZXJzOiBBcnJheTxJbnZlc3RtZW50c0F1dGhPd25lcj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRzQXV0aEdldE51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbnVtYmVyczogSW52ZXN0bWVudHNBdXRoR2V0TnVtYmVycztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNBdXRoRGF0YVNvdXJjZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZGF0YV9zb3VyY2VzOiBJbnZlc3RtZW50c0F1dGhEYXRhU291cmNlcztcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBhY2NvdW50cyBvZiA0MDFrIHN1YnR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRzQXV0aEFjY291bnREZXRhaWxzNDAxaz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudF9kZXRhaWxzXzQwMWs/OiBBcnJheTxJbnZlc3RtZW50c0F1dGhBY2NvdW50RGV0YWlsczQwMWs+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0F1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBvbiB0aGUgb3duZXJzaGlwIG9mIGFuIGludmVzdG1lbnRzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNBdXRoT3duZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0F1dGhPd25lciB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBpZGVudGl0eSBpbmZvcm1hdGlvbiBwZXJ0YWlucyB0b1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aE93bmVyXG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEluIHRoZSBjYXNlIG9mIGEgam9pbnQgYWNjb3VudCwgUGxhaWQgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcmVwb3J0IHRoZSBuYW1lcyBvZiBhbGwgYWNjb3VudCBob2xkZXJzLiAgSWYgYW4gSXRlbSBjb250YWlucyBtdWx0aXBsZSBhY2NvdW50cyB3aXRoIGRpZmZlcmVudCBvd25lciBuYW1lcywgc29tZSBpbnN0aXR1dGlvbnMgd2lsbCByZXBvcnQgYWxsIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpbiBlYWNoIGFjY291bnRcXCdzIGBuYW1lc2AgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzQXV0aE93bmVyXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGRldGVjdGVkIG9uIGFuIGludmVzdG1lbnQgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG5ld19pbnZlc3RtZW50c190cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGNhbmNlbGVkIHRyYW5zYWN0aW9ucyByZXBvcnRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGNhbmNlbGVkX2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBGaXJlZCBhZnRlciBhbiBhc3luY2hyb25vdXMgZXh0cmFjdGlvbiBvbiBhbiBpbnZlc3RtZW50cyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYEhJU1RPUklDQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X2ludmVzdG1lbnRzX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgY2FuY2VsZWQgdHJhbnNhY3Rpb25zIHJlcG9ydGVkIHNpbmNlIHRoZSBsYXN0IHRpbWUgdGhpcyB3ZWJob29rIHdhcyBmaXJlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgY2FuY2VsZWRfaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0ludmVzdG1lbnRIb2xkaW5nc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBJbnZlc3RtZW50SG9sZGluZ3NHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbVxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdzIGJlbG9uZ2luZyB0byBpbnZlc3RtZW50IGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRGV0YWlscyBvZiB0aGUgc2VjdXJpdGllcyBpbiB0aGUgaG9sZGluZ3MgYXJlIHByb3ZpZGVkIGluIHRoZSBgc2VjdXJpdGllc2AgZmllbGQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaG9sZGluZ3M6IEFycmF5PEhvbGRpbmc+O1xuICAgIC8qKlxuICAgICAqIE9iamVjdHMgZGVzY3JpYmluZyB0aGUgc2VjdXJpdGllcyBoZWxkIGluIHRoZSBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gdHJ1ZSwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhhdCB0aGUgSXRlbVxcJ3MgcG9ydGZvbGlvIHdhcyBtYW51YWxseSBjcmVhdGVkIHdpdGggdGhlIEludmVzdG1lbnRzIEZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1JlZnJlc2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vc3QgcmVjZW50IGRhdGUgZm9yIHdoaWNoIHRvIGZldGNoIHRyYW5zYWN0aW9uIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGZpbHRlciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBtdXN0IGJlIG5vbi1gbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgYWNjb3VudF9pZHNgIHRvIHJldHJpZXZlIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaC4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIHNraXAgd2hlbiBmZXRjaGluZyB0cmFuc2FjdGlvbiBoaXN0b3J5XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdGhlIGludmVzdG1lbnRzIHByb2R1Y3QgdmlhIHRoZSBgcHJvZHVjdHNgLCBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCwgb3IgYG9wdGlvbmFsX3Byb2R1Y3RzYCBhcnJheSB3aGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAsIGFuZCBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGluaXRpYWwgSW52ZXN0bWVudHMgZXh0cmFjdGlvbiB3aWxsIGhhcHBlbiBhc3luY2hyb25vdXNseS4gUGxhaWQgd2lsbCBzdWJzZXF1ZW50bHkgZmlyZSBhIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vayB3aGVuIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy4gV2hlbiBgZmFsc2VgLCBQbGFpZCB3aWxsIHdhaXQgdG8gcmV0dXJuIGEgcmVzcG9uc2UgdW50aWwgZXh0cmFjdGlvbiBjb21wbGV0aW9uIGFuZCBubyBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2sgd2lsbCBmaXJlLiBOb3RlIHRoYXQgd2hpbGUgdGhlIGV4dHJhY3Rpb24gaXMgaGFwcGVuaW5nIGFzeW5jaHJvbm91c2x5LCBjYWxscyB0byBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIHdpbGwgcmV0dXJuIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3JzIHVudGlsIHRoZSBleHRyYWN0aW9uIGNvbXBsZXRlcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFzeW5jX3VwZGF0ZT86IGJvb2xlYW47XG59XG4vKipcbiAqIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRzIGZvciB3aGljaCB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIGJlaW5nIGZldGNoZWQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogQWxsIHNlY3VyaXRpZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9ucyBiZWluZyBmZXRjaGVkXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50X3RyYW5zYWN0aW9uczogQXJyYXk8SW52ZXN0bWVudFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhdmFpbGFibGUgd2l0aGluIHRoZSBkYXRlIHJhbmdlIHNwZWNpZmllZC4gSWYgYHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfaW52ZXN0bWVudHNfZmFsbGJhY2tfaXRlbT86IGJvb2xlYW47XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIGxpc3Qgb2YgaW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIG9uIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogUG9zdGluZyBkYXRlIGZvciB0aGUgdHJhbnNhY3Rpb24uIE11c3QgYmUgZm9ybWF0dGVkIGFzIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGRhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zdGl0dXRpb25cXCdzIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdW5pdHMgb2YgdGhlIHNlY3VyaXR5IGludm9sdmVkIGluIHRoaXMgdHJhbnNhY3Rpb24uIE11c3QgYmUgcG9zaXRpdmUgaWYgdGhlIHR5cGUgaXMgYSBidXkgYW5kIG5lZ2F0aXZlIGlmIHRoZSB0eXBlIGlzIGEgc2VsbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgcXVhbnRpdHk6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpY2Ugb2YgdGhlIHNlY3VyaXR5IGF0IHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHByaWNlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbWJpbmVkIHZhbHVlIG9mIGFsbCBmZWVzIGFwcGxpZWQgdG8gdGhpcyB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc092ZXJyaWRlXG4gICAgICovXG4gICAgZmVlcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgaW52ZXN0bWVudCB0cmFuc2FjdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogYGJ1eWA6IEJ1eWluZyBhbiBpbnZlc3RtZW50IGBzZWxsYDogU2VsbGluZyBhbiBpbnZlc3RtZW50IGBjYXNoYDogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb24gYGZlZWA6IEEgZmVlIG9uIHRoZSBhY2NvdW50IGB0cmFuc2ZlcmA6IEFjdGl2aXR5IHRoYXQgbW9kaWZpZXMgYSBwb3NpdGlvbiwgYnV0IG5vdCB0aHJvdWdoIGJ1eS9zZWxsIGFjdGl2aXR5IGUuZy4gb3B0aW9ucyBleGVyY2lzZSwgcG9ydGZvbGlvIHRyYW5zZmVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlY3VyaXR5T3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIEludmVzdG1lbnRzVHJhbnNhY3Rpb25zT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWN1cml0eT86IFNlY3VyaXR5T3ZlcnJpZGU7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIG9uIGFuIGlzc3VlIGVuY291bnRlcmVkIHdpdGggZmluYW5jaWFsIGluc3RpdHV0aW9ucyBpbnRlcmFjdGlvbnMgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGR1cmluZyBMaW5raW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3VlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGlzc3VlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgaXNzdWVfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFmZmVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWVzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgaWRzIG9mIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFmZmVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIHJlY29yZCB0cmFja2luZyB0aGlzIGlzc3VlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHNpbXBsZSBzdW1tYXJ5IG9mIHRoZSBlcnJvciBmb3IgdGhlIGVuZCB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgc3VtbWFyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gZm9yIHRoZSBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVxuICAgICAqL1xuICAgIGRldGFpbGVkX2Rlc2NyaXB0aW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJc3N1ZXNTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIElzc3VlXG4gICAgICovXG4gICAgc3RhdHVzPzogSXNzdWVzU3RhdHVzO1xufVxuLyoqXG4gKiBXZWJob29rIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQgb25seSB3aGVuIGEgc3Vic2NyaWJlZCBpc3N1ZSBpcyBtYXJrZWQgYXMgcmVzb2x2ZWQuIFRoZSBwYXlsb2FkIGNvbnRhaW5zIGRldGFpbHMgYWJvdXQgdGhlIGlzc3VlIGF0IHRoZSB0aW1lIG9mIGl0cyByZXNvbHV0aW9uLCBmb2N1c2luZyBvbiB0aGUgbW9zdCBlc3NlbnRpYWwgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVSZXNvbHZlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJU1NVRVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSVNTVUVfUkVTT0xWRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvbm5lY3Rpdml0eSBpc3N1ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZVJlc29sdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGlzc3VlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBzaW1wbGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yIGZvciB0aGUgZW5kIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpc3N1ZV9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIGlzc3VlIHdhcyBtYXJrZWQgYXMgcmVzb2x2ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVSZXNvbHZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpc3N1ZV9yZXNvbHZlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGludm9sdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGludm9sdmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3VlUmVzb2x2ZWRXZWJob29rXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xufVxuLyoqXG4gKiBJc3N1ZXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2lzc3Vlcy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJc3N1ZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgaXNzdWUgdG8gcmV0cmlldmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGlzc3VlX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIElzc3Vlc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pc3N1ZXMvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lzc3VlfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzc3VlPzogSXNzdWU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEFQSSByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogSXNzdWVzU2VhcmNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pc3N1ZXMvc2VhcmNoYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzU2VhcmNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIElzc3Vlc1NlYXJjaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgUGxhaWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTZWFyY2hSZXF1ZXN0XG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGByZXF1ZXN0X2lkYCBmb3IgdGhlIExpbmsgc2Vzc2lvbiB0aGF0IG1pZ2h0IGhhdmUgaGFkIGFuIGluc3RpdHV0aW9uIGNvbm5lY3Rpb24gaXNzdWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVxdWVzdFxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9yZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJc3N1ZXNTZWFyY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXNzdWVzL3NlYXJjaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3Vlc1NlYXJjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXNzdWVzU2VhcmNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBpc3N1ZXMgYWZmZWN0aW5nIHRoZSBJdGVtLCBzZXNzaW9uLCBvciByZXF1ZXN0IHBhc3NlZCBpbiwgY29uZm9ybWluZyB0byB0aGUgSXNzdWVzIGRhdGEgbW9kZWwuIEFuIGVtcHR5IGxpc3QgaW5kaWNhdGVzIHRoYXQgbm8gbWF0Y2hpbmcgaXNzdWVzIHdlcmUgZm91bmQuXG4gICAgICogQHR5cGUge0FycmF5PElzc3VlPn1cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU2VhcmNoUmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc3N1ZXM/OiBBcnJheTxJc3N1ZT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEFQSSByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1NlYXJjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBpc3N1ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIElzc3Vlc1N0YXR1cyB7XG4gICAgUmVwb3J0ZWQgPSAnUkVQT1JURUQnLFxuICAgIEF3YWl0aW5nUmVzb2x1dGlvbiA9ICdBV0FJVElOR19SRVNPTFVUSU9OJyxcbiAgICBGaXhJblByb2dyZXNzID0gJ0ZJWF9JTl9QUk9HUkVTUycsXG4gICAgRml4UGVuZGluZ1ZhbGlkYXRpb24gPSAnRklYX1BFTkRJTkdfVkFMSURBVElPTicsXG4gICAgQ2Fubm90Rml4ID0gJ0NBTk5PVF9GSVgnLFxuICAgIFJlc29sdmVkID0gJ1JFU09MVkVEJ1xufVxuXG4vKipcbiAqIElzc3Vlc1N1YnNjcmliZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXNzdWVzL3N1YnNjcmliZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIElzc3Vlc1N1YnNjcmliZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBpc3N1ZSB0byBzdWJzY3JpYmUgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzc3VlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYmhvb2sgVVJMIHdoZXJlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlIHNlbnQgd2hlbiB0aGUgaXNzdWUgc3RhdHVzIGNoYW5nZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXNzdWVzU3Vic2NyaWJlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pc3N1ZXMvc3Vic2NyaWJlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXNzdWVzU3Vic2NyaWJlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJc3N1ZXNTdWJzY3JpYmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIEFQSSByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGJpbmFyeSBtYXRjaCBpbmRpY2F0b3Igc3BlY2lmeWluZyB3aGV0aGVyIHRoZSBjb3VudHJ5IHRoYXQgaXNzdWVkIHRoZSBwcm92aWRlZCBkb2N1bWVudCBtYXRjaGVzIHRoZSBjb3VudHJ5IHRoYXQgdGhlIHVzZXIgc2VwYXJhdGVseSBwcm92aWRlZCB0byBQbGFpZC4gIE5vdGU6IFlvdSBjYW4gY29uZmlndXJlIHdoZXRoZXIgYSBgbm9fbWF0Y2hgIG9uIGBpc3N1aW5nX2NvdW50cnlgIGZhaWxzIHRoZSBgZG9jdW1lbnRhcnlfdmVyaWZpY2F0aW9uYCBieSBlZGl0aW5nIHlvdXIgUGxhaWQgVGVtcGxhdGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJc3N1aW5nQ291bnRyeSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIE5vTWF0Y2ggPSAnbm9fbWF0Y2gnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgYWJvdXQgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSXRlbSBJRC4gVGhlIGBpdGVtX2lkYCBpcyBhbHdheXMgdW5pcXVlOyBsaW5raW5nIHRoZSBzYW1lIGFjY291bnQgYXQgdGhlIHNhbWUgaW5zdGl0dXRpb24gdHdpY2Ugd2lsbCByZXN1bHQgaW4gdHdvIEl0ZW1zIHdpdGggZGlmZmVyZW50IGBpdGVtX2lkYCB2YWx1ZXMuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYGl0ZW1faWRgIGlzIGNhc2Utc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHdpdGhvdXQgYW4gaW5zdGl0dXRpb24gY29ubmVjdGlvbiwgc3VjaCBhcyBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lIERheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIEZpZWxkIGlzIGBudWxsYCBmb3IgSXRlbXMgY3JlYXRlZCB3aXRob3V0IGFuIGluc3RpdHV0aW9uIGNvbm5lY3Rpb24sIHN1Y2ggYXMgSXRlbXMgY3JlYXRlZCB2aWEgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgcmVnaXN0ZXJlZCB0byByZWNlaXZlIHdlYmhvb2tzIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUF1dGhNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBhdXRoX21ldGhvZD86IEl0ZW1BdXRoTWV0aG9kIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGFjY2Vzc2VkLiBUaGUgY29udGVudHMgb2YgdGhpcyBhcnJheSB3aWxsIGJlIG11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBiaWxsZWRfcHJvZHVjdHNgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBhdmFpbGFibGVfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGJlZW4gYmlsbGVkIGZvciB0aGUgSXRlbS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXZhaWxhYmxlX3Byb2R1Y3RzYC4gTm90ZSAtIGBiaWxsZWRfcHJvZHVjdHNgIGlzIHBvcHVsYXRlZCBpbiBhbGwgZW52aXJvbm1lbnRzIGJ1dCBvbmx5IHJlcXVlc3RzIGluIFByb2R1Y3Rpb24gYXJlIGJpbGxlZC4gQWxzbyBub3RlIHRoYXQgcHJvZHVjdHMgdGhhdCBhcmUgYmlsbGVkIG9uIGEgcGF5LXBlci1jYWxsIGJhc2lzIHJhdGhlciB0aGFuIGEgcGF5LXBlci1JdGVtIGJhc2lzLCBzdWNoIGFzIGBiYWxhbmNlYCwgd2lsbCBub3QgYXBwZWFyIGhlcmUuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBiaWxsZWRfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgYWRkZWQgdG8gdGhlIEl0ZW0uIEluIGFsbW9zdCBhbGwgY2FzZXMsIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgYGJpbGxlZF9wcm9kdWN0c2AgZmllbGQuIEZvciBzb21lIHByb2R1Y3RzLCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHByb2R1Y3QgdG8gYmUgYWRkZWQgdG8gYW4gSXRlbSBidXQgbm90IHlldCBiaWxsZWQgKGUuZy4gQXNzZXRzLCBiZWZvcmUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBoYXMgYmVlbiBjYWxsZWQsIG9yIEF1dGggb3IgSWRlbnRpdHkgd2hlbiBhZGRlZCBhcyBPcHRpb25hbCBQcm9kdWN0cyBidXQgYmVmb3JlIHRoZWlyIGVuZHBvaW50cyBoYXZlIGJlZW4gY2FsbGVkKSwgaW4gd2hpY2ggY2FzZSB0aGUgcHJvZHVjdCBtYXkgYXBwZWFyIGluIGBwcm9kdWN0c2AgYnV0IG5vdCBpbiBgYmlsbGVkX3Byb2R1Y3RzYC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVxuICAgICAqL1xuICAgIHByb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IHRoZSB1c2VyIGhhcyBjb25zZW50ZWQgdG8gZm9yIHRoZSBJdGVtIHZpYSBbRGF0YSBUcmFuc3BhcmVuY3kgTWVzc2FnaW5nXSgvZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUpLiBUaGlzIHdpbGwgY29uc2lzdCBvZiBhbGwgcHJvZHVjdHMgd2hlcmUgYm90aCBvZiB0aGUgZm9sbG93aW5nIGFyZSB0cnVlOiB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIHRoZSByZXF1aXJlZCBkYXRhIHNjb3BlcyBmb3IgdGhhdCBwcm9kdWN0IGFuZCB5b3UgaGF2ZSBQcm9kdWN0aW9uIGFjY2VzcyBmb3IgdGhhdCBwcm9kdWN0LiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgY29uc2VudGVkX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBJdGVtXFwncyBhY2Nlc3MgY29uc2VudCB3aWxsIGV4cGlyZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBoYXZlIGNvbnNlbnQgZXhwaXJhdGlvbiBzY2hlZHVsZWQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuIEN1cnJlbnRseSwgb25seSBpbnN0aXR1dGlvbnMgaW4gRXVyb3BlIGFuZCBhIHNtYWxsIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgaW4gdGhlIFVTIGhhdmUgZXhwaXJpbmcgY29uc2VudC4gQ2xvc2VyIHRvIHRoZSAxMDMzIGNvbXBsaWFuY2UgZGVhZGxpbmUgb2YgQXByaWwgMSwgMjAyNiwgZXhwaXJhdGlvbiB0aW1lcyB3aWxsIGJlIHBvcHVsYXRlZCBtb3JlIHdpZGVseS4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmcgY29uc2VudCBleHBpcmF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jY29uc2VudC1leHBpcmF0aW9uLWFuZC1yZWF1dGhvcml6YXRpb24uKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1cbiAgICAgKi9cbiAgICBjb25zZW50X2V4cGlyYXRpb25fdGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBhbiBJdGVtIHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24gdG8gYmUgdXBkYXRlZCwgd2hpY2ggY2FuIGJlIHRoZSBjYXNlIGZvciBJdGVtcyB3aXRoIHNvbWUgZm9ybXMgb2YgdHdvLWZhY3RvciBhdXRoZW50aWNhdGlvbi4gIGBiYWNrZ3JvdW5kYCAtIEl0ZW0gY2FuIGJlIHVwZGF0ZWQgaW4gdGhlIGJhY2tncm91bmQgIGB1c2VyX3ByZXNlbnRfcmVxdWlyZWRgIC0gSXRlbSByZXF1aXJlcyB1c2VyIGludGVyYWN0aW9uIHRvIGJlIHVwZGF0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtXG4gICAgICovXG4gICAgdXBkYXRlX3R5cGU6IEl0ZW1VcGRhdGVUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJdGVtVXBkYXRlVHlwZUVudW0ge1xuICAgIEJhY2tncm91bmQgPSAnYmFja2dyb3VuZCcsXG4gICAgVXNlclByZXNlbnRSZXF1aXJlZCA9ICd1c2VyX3ByZXNlbnRfcmVxdWlyZWQnXG59XG5cbi8qKlxuICogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbmV3X2FjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgdG8gbGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFjdGl2aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjdGl2aXRpZXMuXG4gICAgICogQHR5cGUge0FycmF5PEFjdGl2aXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFjdGl2aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgYWN0aXZpdGllczogQXJyYXk8QWN0aXZpdHk+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIG9iamVjdHMgY29udGFpbmluZyB0aW1lc3RhbXBzIGZvciB0aGUgbGFzdCB0aW1lIGVhY2ggZGF0YSB0eXBlIHdhcyBhY2Nlc3NlZCBwZXIgYXBwbGljYXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PExhc3REYXRhQWNjZXNzVGltZXM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X2RhdGFfYWNjZXNzX3RpbWVzOiBBcnJheTxMYXN0RGF0YUFjY2Vzc1RpbWVzPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYSB1c2VyIHN1Y2Nlc3NmdWxseSBhZGRzIGEgUGxhaWQgSXRlbSBkdXJpbmcgYSBMaW5rIHNlc3Npb24gd2hlbiB1c2luZyBIb3N0ZWQgTGluayBvciBNdWx0aS1JdGVtIExpbmsgc2Vzc2lvbnMuIENvbnRhaW5zIHRoZSBwdWJsaWMgdG9rZW4gZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BZGRSZXN1bHRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBJVEVNX0FERF9SRVNVTFRgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFkZFJlc3VsdFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQWRkUmVzdWx0V2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaW5rIHRva2VuIHVzZWQgdG8gY3JlYXRlIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFkZFJlc3VsdFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1YmxpYyB0b2tlbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBpdGVtIHRoYXQgd2FzIGFkZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BZGRSZXN1bHRXZWJob29rXG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFkZFJlc3VsdFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHRvIGxpc3QgY29ubmVjdGVkIGFwcGxpY2F0aW9ucyBmb3IgYSB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW4/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbm5lY3RlZCBhcHBsaWNhdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBjb25uZWN0ZWQgYXBwbGljYXRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb25uZWN0ZWRBcHBsaWNhdGlvbj59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uczogQXJyYXk8Q29ubmVjdGVkQXBwbGljYXRpb24+O1xufVxuLyoqXG4gKiBVc2VyIGF1dGhlbnRpY2F0aW9uIHBhcmFtZXRlcnMsIGZvciBjbGllbnRzIG1ha2luZyBhIHJlcXVlc3Qgd2l0aG91dCBhbiBgYWNjZXNzX3Rva2VuYC4gVGhpcyBpcyBvbmx5IGFsbG93ZWQgZm9yIHNlbGVjdCBjbGllbnRzIGFuZCB3aWxsIG5vdCBiZSBzdXBwb3J0ZWQgaW4gdGhlIGZ1dHVyZS4gTW9zdCBjbGllbnRzIHNob3VsZCBjYWxsIC9pdGVtL2ltcG9ydCB0byBvYnRhaW4gYW4gYWNjZXNzIHRva2VuIGJlZm9yZSBtYWtpbmcgYSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGhcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25MaXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIEFjY291bnQgdXNlcm5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWNjb3VudCB1c2VybmFtZSBoYXNoZWQgYnkgRkkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uTGlzdFVzZXJBdXRoXG4gICAgICovXG4gICAgZmlfdXNlcm5hbWVfaGFzaD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi9zY29wZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYXBwbGljYXRpb24gSUQgdGhhdCBpcyByZXR1cm5lZCBmcm9tIC9pdGVtL2FwcGxpY2F0aW9uL2xpc3QsIG9yIHByb3ZpZGVkIHRvIHRoZSBpbnN0aXR1dGlvbiBpbiBhbiBvYXV0aCByZWRpcmVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NvcGVzOiBTY29wZXM7XG4gICAgLyoqXG4gICAgICogV2hlbiBzY29wZXMgYXJlIHVwZGF0ZWQgZHVyaW5nIGVucm9sbG1lbnQsIHRoaXMgZmllbGQgbXVzdCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgc3RhdGUgc2VudCB0byB0aGUgcGFydG5lciBpbiB0aGUgT0F1dGggTG9naW4gVVJJLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIHdoZW4gdGhlIGNvbnRleHQgaXMgYEVOUk9MTE1FTlRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NvcGVzQ29udGV4dH1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnRleHQ6IFNjb3Blc0NvbnRleHQ7XG59XG4vKipcbiAqIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2FwcGxpY2F0aW9uL3VubGluay9gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBhcHBsaWNhdGlvbiBJRCB0aGF0IGlzIHJldHVybmVkIGZyb20gL2l0ZW0vYXBwbGljYXRpb24vbGlzdCwgb3IgcHJvdmlkZWQgdG8gdGhlIGluc3RpdHV0aW9uIGluIGFuIG9hdXRoIHJlZGlyZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3RcbiAgICAgKi9cbiAgICBhcHBsaWNhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9hcHBsaWNhdGlvbi91bmxpbmtgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIG1ldGhvZCB1c2VkIHRvIHBvcHVsYXRlIEF1dGggZGF0YSBmb3IgdGhlIEl0ZW0uIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgZm9yIEl0ZW1zIHRoYXQgaGF2ZSBoYWQgQXV0aCBudW1iZXJzIGRhdGEgc2V0IG9uIGF0IGxlYXN0IG9uZSBvZiBpdHMgYWNjb3VudHMsIGFuZCB3aWxsIGJlIGBudWxsYCBvdGhlcndpc2UuIEZvciBpbmZvIGFib3V0IHRoZSB2YXJpb3VzIGZsb3dzLCBzZWUgb3VyIFtBdXRoIGNvdmVyYWdlIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS8pLiAgYElOU1RBTlRfQVVUSGA6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IHRoZSB1c2VyXFwncyBpbnN0aXR1dGlvbiBjb25uZWN0aW9uLiAgYElOU1RBTlRfTUFUQ0hgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIHdhcyBwcm92aWRlZCB2aWEgdGhlIEluc3RhbnQgTWF0Y2ggZmFsbGJhY2sgZmxvdy4gIGBBVVRPTUFURURfTUlDUk9ERVBPU0lUU2A6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGZsb3cuICBgU0FNRV9EQVlfTUlDUk9ERVBPU0lUU2A6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvdy4gIGBJTlNUQU5UX01JQ1JPREVQT1NJVFNgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIHdhcyBwcm92aWRlZCB2aWEgdGhlIEluc3RhbnQgTWljcm8tZGVwb3NpdHMgZmxvdy4gIGBEQVRBQkFTRV9NQVRDSGA6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgRGF0YWJhc2UgTWF0Y2ggZmxvdy4gIGBEQVRBQkFTRV9JTlNJR0hUU2A6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSB0aGUgRGF0YWJhc2UgSW5zaWdodHMgZmxvdy4gIGBUUkFOU0ZFUl9NSUdSQVRFRGA6IFRoZSBJdGVtXFwncyBBdXRoIGRhdGEgd2FzIHByb3ZpZGVkIHZpYSBbYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2Zlci9hY2NvdW50LWxpbmtpbmcvI21pZ3JhdGUtYWNjb3VudC1pbnRvLXRyYW5zZmVycykuICBgSU5WRVNUTUVOVFNfRkFMTEJBQ0tgOiBUaGUgSXRlbVxcJ3MgQXV0aCBkYXRhIGZvciBJbnZlc3RtZW50cyBNb3ZlIHdhcyBwcm92aWRlZCB2aWEgYSBbZmFsbGJhY2sgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pbnZlc3RtZW50cy1tb3ZlLyNmYWxsYmFjay1mbG93cykuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJdGVtQXV0aE1ldGhvZCB7XG4gICAgSW5zdGFudEF1dGggPSAnSU5TVEFOVF9BVVRIJyxcbiAgICBJbnN0YW50TWF0Y2ggPSAnSU5TVEFOVF9NQVRDSCcsXG4gICAgQXV0b21hdGVkTWljcm9kZXBvc2l0cyA9ICdBVVRPTUFURURfTUlDUk9ERVBPU0lUUycsXG4gICAgU2FtZURheU1pY3JvZGVwb3NpdHMgPSAnU0FNRV9EQVlfTUlDUk9ERVBPU0lUUycsXG4gICAgSW5zdGFudE1pY3JvZGVwb3NpdHMgPSAnSU5TVEFOVF9NSUNST0RFUE9TSVRTJyxcbiAgICBEYXRhYmFzZU1hdGNoID0gJ0RBVEFCQVNFX01BVENIJyxcbiAgICBEYXRhYmFzZUluc2lnaHRzID0gJ0RBVEFCQVNFX0lOU0lHSFRTJyxcbiAgICBUcmFuc2Zlck1pZ3JhdGVkID0gJ1RSQU5TRkVSX01JR1JBVEVEJyxcbiAgICBJbnZlc3RtZW50c0ZhbGxiYWNrID0gJ0lOVkVTVE1FTlRTX0ZBTExCQUNLJ1xufVxuXG4vKipcbiAqIEEgZGF0YSBzY29wZSBmb3IgdGhlIHByb2R1Y3RzIHRoYXQgYSB1c2VyIGNhbiBjb25zZW50IHRvIGluIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSlcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIEl0ZW1Db25zZW50ZWREYXRhU2NvcGUge1xuICAgIEFjY291bnRBbmRCYWxhbmNlSW5mbyA9ICdhY2NvdW50X2FuZF9iYWxhbmNlX2luZm8nLFxuICAgIENvbnRhY3RJbmZvID0gJ2NvbnRhY3RfaW5mbycsXG4gICAgQWNjb3VudEFuZFJvdXRpbmdOdW1iZXJzID0gJ2FjY291bnRfYW5kX3JvdXRpbmdfbnVtYmVycycsXG4gICAgVHJhbnNhY3Rpb25zID0gJ3RyYW5zYWN0aW9ucycsXG4gICAgQ3JlZGl0QW5kTG9hbnMgPSAnY3JlZGl0X2FuZF9sb2FucycsXG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEJhbmtTdGF0ZW1lbnRzID0gJ2Jhbmtfc3RhdGVtZW50cycsXG4gICAgUmlza0luZm8gPSAncmlza19pbmZvJ1xufVxuXG4vKipcbiAqIEVudW0gcmVwcmVzZW50aW5nIHRoZSBlbnRpdHkgYXV0aGVudGljYXRpbmcgdGhlIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBJdGVtQ3JlYXRlQXV0aGVudGljYXRpb24ge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgRGF0YVBhcnRuZXIgPSAnREFUQV9QQVJUTkVSJyxcbiAgICBQbGFpZCA9ICdQTEFJRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGVycm9yIGlzIGVuY291bnRlcmVkIHdpdGggYW4gSXRlbS4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBoYXZpbmcgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5r4oCZcyB1cGRhdGUgbW9kZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUVycm9yV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1FcnJvcldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRVJST1JgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUVycm9yV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtRXJyb3JXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I6IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1FcnJvcldlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBJdGVtR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9pdGVtL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvaXRlbS9nZXRgIGFuZCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1XaXRoQ29uc2VudEZpZWxkc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbVdpdGhDb25zZW50RmllbGRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1cz86IEl0ZW1TdGF0dXNOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbUltcG9ydFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9pbXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHByb2R1Y3Qgc3RyaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aH1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX2F1dGg6IEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSXRlbUltcG9ydFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gY29uZmlndXJlIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIGEgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggYW4gSXRlbS4gUGxhaWQgZmlyZXMgYSB3ZWJob29rIGlmIGNyZWRlbnRpYWxzIGZhaWwuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1JbXBvcnRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCBvZiB1c2VyIElEIGFuZCBhdXRoIHRva2VuIHBhaXIsIHBlcm1pdHRpbmcgUGxhaWQgdG8gYWdncmVnYXRlIGEgdXNlcuKAmXMgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbUltcG9ydFJlcXVlc3RVc2VyQXV0aFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1JbXBvcnRSZXF1ZXN0VXNlckF1dGgge1xuICAgIC8qKlxuICAgICAqIE9wYXF1ZSB1c2VyIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEF1dGhvcml6YXRpb24gdG9rZW4gUGxhaWQgd2lsbCB1c2UgdG8gYWdncmVnYXRlIHRoaXMgdXNlcuKAmXMgYWNjb3VudHNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVxdWVzdFVzZXJBdXRoXG4gICAgICovXG4gICAgYXV0aF90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtSW1wb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vaW1wb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtSW1wb3J0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtSW1wb3J0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtSW1wb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUltcG9ydFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gaGFzIGV4aXRlZCB0aGUgYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIHdpdGhvdXQgdGhlIHVzZXIgaGF2aW5nIGdvbmUgdGhyb3VnaCB0aGUgdXBkYXRlIG1vZGUgZmxvdyBpbiB5b3VyIGFwcCAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZSB1c2VyIGNvbXBsZXRlZCB0aGUgdXBkYXRlIG1vZGUgaW4gYSBkaWZmZXJlbnQgYXBwKS4gSWYgeW91IGhhdmUgbWVzc2FnaW5nIHRoYXQgdGVsbHMgdGhlIHVzZXIgdG8gY29tcGxldGUgdGhlIHVwZGF0ZSBtb2RlIGZsb3csIHlvdSBzaG91bGQgc2lsZW5jZSB0aGlzIG1lc3NhZ2luZyB1cG9uIHJlY2VpdmluZyB0aGUgYExPR0lOX1JFUEFJUkVEYCB3ZWJob29rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBMT0dJTl9SRVBBSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtTG9naW5SZXBhaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbUxvZ2luUmVwYWlyZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Mb2dpblJlcGFpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIG9uY2UgUGxhaWQgY2FsY3VsYXRlcyBpbmNvbWUgZnJvbSBhbiBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSU5DT01FYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUkVBRFlgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVByb2R1Y3RSZWFkeVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1Qcm9kdWN0UmVhZHlXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHJvZHVjdFJlYWR5V2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYHB1YmxpY190b2tlbmAgZm9yIHRoZSBwYXJ0aWN1bGFyIEl0ZW0gY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGBhY2Nlc3NfdG9rZW5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGV4cGlyYXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIGBwdWJsaWNfdG9rZW5gLCBvYnRhaW5lZCBmcm9tIHRoZSBMaW5rIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9yIGAvc2FuZGJveC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCB2YWx1ZSBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybmVkIGBhY2Nlc3NfdG9rZW5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSXRlbVJlbW92ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvaXRlbS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVJlbW92ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBJdGVtUmVtb3ZlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0ludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM/OiBJdGVtU3RhdHVzSW52ZXN0bWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzVHJhbnNhY3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zPzogSXRlbVN0YXR1c1RyYW5zYWN0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNMYXN0V2ViaG9va31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIGxhc3Rfd2ViaG9vaz86IEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCBpbnZlc3RtZW50cyB1cGRhdGUgZm9yIHRoZSBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtU3RhdHVzSW52ZXN0bWVudHMge1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIHN1Y2Nlc3NmdWxseSBjb25uZWN0cyB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBsYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgZmFpbGVkIGludmVzdG1lbnRzIHVwZGF0ZSBmb3IgdGhlIEl0ZW0uIFRoZSBzdGF0dXMgd2lsbCB1cGRhdGUgZWFjaCB0aW1lIFBsYWlkIGZhaWxzIGFuIGF0dGVtcHQgdG8gY29ubmVjdCB3aXRoIHRoZSBpbnN0aXR1dGlvbiwgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGFueSBuZXcgZGF0YSBpcyBhdmFpbGFibGUgaW4gdGhlIHVwZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzSW52ZXN0bWVudHNcbiAgICAgKi9cbiAgICBsYXN0X2ZhaWxlZF91cGRhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCB3ZWJob29rIGZpcmVkIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c0xhc3RXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c0xhc3RXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgd2ViaG9vayB3YXMgZmlyZWQuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICAgICAqL1xuICAgIHNlbnRfYXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHdlYmhvb2sgY29kZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNMYXN0V2ViaG9va1xuICAgICAqL1xuICAgIGNvZGVfc2VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSXRlbVN0YXR1c051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbVN0YXR1c0ludmVzdG1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBpbnZlc3RtZW50cz86IEl0ZW1TdGF0dXNJbnZlc3RtZW50cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0l0ZW1TdGF0dXNUcmFuc2FjdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtU3RhdHVzTGFzdFdlYmhvb2t9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1TdGF0dXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGxhc3Rfd2ViaG9vaz86IEl0ZW1TdGF0dXNMYXN0V2ViaG9vayB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwgYW5kIGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVN0YXR1c1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1TdGF0dXNUcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIHRpbWVzdGFtcCBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHRyYW5zYWN0aW9ucyB1cGRhdGUgZm9yIHRoZSBJdGVtLiBUaGUgc3RhdHVzIHdpbGwgdXBkYXRlIGVhY2ggdGltZSBQbGFpZCBzdWNjZXNzZnVsbHkgY29ubmVjdHMgd2l0aCB0aGUgaW5zdGl0dXRpb24sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhbnkgbmV3IGRhdGEgaXMgYXZhaWxhYmxlIGluIHRoZSB1cGRhdGUuIFRoaXMgZmllbGQgZG9lcyBub3QgcmVmbGVjdCB0cmFuc2FjdGlvbnMgdXBkYXRlcyBwZXJmb3JtZWQgYnkgbm9uLVRyYW5zYWN0aW9ucyBwcm9kdWN0cyAoZS5nLiBTaWduYWwpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgbGFzdF9zdWNjZXNzZnVsX3VwZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGZhaWxlZCB0cmFuc2FjdGlvbnMgdXBkYXRlIGZvciB0aGUgSXRlbS4gVGhlIHN0YXR1cyB3aWxsIHVwZGF0ZSBlYWNoIHRpbWUgUGxhaWQgZmFpbHMgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHdpdGggdGhlIGluc3RpdHV0aW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYW55IG5ldyBkYXRhIGlzIGF2YWlsYWJsZSBpbiB0aGUgdXBkYXRlLiBUaGlzIGZpZWxkIGRvZXMgbm90IHJlZmxlY3QgdHJhbnNhY3Rpb25zIHVwZGF0ZXMgcGVyZm9ybWVkIGJ5IG5vbi1UcmFuc2FjdGlvbnMgcHJvZHVjdHMgKGUuZy4gU2lnbmFsKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtU3RhdHVzVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgbGFzdF9mYWlsZWRfdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgSXRlbS4gVG8gcmVtb3ZlIGEgd2ViaG9vayBmcm9tIGFuIEl0ZW0sIHNldCB0byBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2l0ZW0vd2ViaG9vay91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbX1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IHRoZSBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEl0ZW1XaXRoQ29uc2VudEZpZWxkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEluc3RpdHV0aW9uIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHdpdGhvdXQgYW4gaW5zdGl0dXRpb24gY29ubmVjdGlvbiwgc3VjaCBhcyBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lIERheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRmllbGQgaXMgYG51bGxgIGZvciBJdGVtcyBjcmVhdGVkIHdpdGhvdXQgYW4gaW5zdGl0dXRpb24gY29ubmVjdGlvbiwgc3VjaCBhcyBJdGVtcyBjcmVhdGVkIHZpYSBTYW1lIERheSBNaWNyby1kZXBvc2l0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHJlZ2lzdGVyZWQgdG8gcmVjZWl2ZSB3ZWJob29rcyBmb3IgdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXRlbUF1dGhNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGF1dGhfbWV0aG9kPzogSXRlbUF1dGhNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiBhY2Nlc3NlZC4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYmlsbGVkX3Byb2R1Y3RzYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBhdmFpbGFibGVfcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCBoYXZlIGJlZW4gYmlsbGVkIGZvciB0aGUgSXRlbS4gVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJyYXkgd2lsbCBiZSBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgYXZhaWxhYmxlX3Byb2R1Y3RzYC4gTm90ZSAtIGBiaWxsZWRfcHJvZHVjdHNgIGlzIHBvcHVsYXRlZCBpbiBhbGwgZW52aXJvbm1lbnRzIGJ1dCBvbmx5IHJlcXVlc3RzIGluIFByb2R1Y3Rpb24gYXJlIGJpbGxlZC4gQWxzbyBub3RlIHRoYXQgcHJvZHVjdHMgdGhhdCBhcmUgYmlsbGVkIG9uIGEgcGF5LXBlci1jYWxsIGJhc2lzIHJhdGhlciB0aGFuIGEgcGF5LXBlci1JdGVtIGJhc2lzLCBzdWNoIGFzIGBiYWxhbmNlYCwgd2lsbCBub3QgYXBwZWFyIGhlcmUuIFxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGJpbGxlZF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBwcm9kdWN0cyBhZGRlZCB0byB0aGUgSXRlbS4gSW4gYWxtb3N0IGFsbCBjYXNlcywgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBgYmlsbGVkX3Byb2R1Y3RzYCBmaWVsZC4gRm9yIHNvbWUgcHJvZHVjdHMsIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgcHJvZHVjdCB0byBiZSBhZGRlZCB0byBhbiBJdGVtIGJ1dCBub3QgeWV0IGJpbGxlZCAoZS5nLiBBc3NldHMsIGJlZm9yZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGhhcyBiZWVuIGNhbGxlZCwgb3IgQXV0aCBvciBJZGVudGl0eSB3aGVuIGFkZGVkIGFzIE9wdGlvbmFsIFByb2R1Y3RzIGJ1dCBiZWZvcmUgdGhlaXIgZW5kcG9pbnRzIGhhdmUgYmVlbiBjYWxsZWQpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm9kdWN0IG1heSBhcHBlYXIgaW4gYHByb2R1Y3RzYCBidXQgbm90IGluIGBiaWxsZWRfcHJvZHVjdHNgLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcHJvZHVjdHMgdGhhdCB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIGZvciB0aGUgSXRlbSB2aWEgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKS4gVGhpcyB3aWxsIGNvbnNpc3Qgb2YgYWxsIHByb2R1Y3RzIHdoZXJlIGJvdGggb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZTogdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byB0aGUgcmVxdWlyZWQgZGF0YSBzY29wZXMgZm9yIHRoYXQgcHJvZHVjdCBhbmQgeW91IGhhdmUgUHJvZHVjdGlvbiBhY2Nlc3MgZm9yIHRoYXQgcHJvZHVjdC4gXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudGVkX3Byb2R1Y3RzPzogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSBJdGVtXFwncyBhY2Nlc3MgY29uc2VudCB3aWxsIGV4cGlyZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBoYXZlIGNvbnNlbnQgZXhwaXJhdGlvbiBzY2hlZHVsZWQsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuIEN1cnJlbnRseSwgb25seSBpbnN0aXR1dGlvbnMgaW4gRXVyb3BlIGFuZCBhIHNtYWxsIG51bWJlciBvZiBpbnN0aXR1dGlvbnMgaW4gdGhlIFVTIGhhdmUgZXhwaXJpbmcgY29uc2VudC4gQ2xvc2VyIHRvIHRoZSAxMDMzIGNvbXBsaWFuY2UgZGVhZGxpbmUgb2YgQXByaWwgMSwgMjAyNiwgZXhwaXJhdGlvbiB0aW1lcyB3aWxsIGJlIHBvcHVsYXRlZCBtb3JlIHdpZGVseS4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmcgY29uc2VudCBleHBpcmF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZS8jY29uc2VudC1leHBpcmF0aW9uLWFuZC1yZWF1dGhvcml6YXRpb24uKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIGNvbnNlbnRfZXhwaXJhdGlvbl90aW1lOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIGFuIEl0ZW0gcmVxdWlyZXMgdXNlciBpbnRlcmFjdGlvbiB0byBiZSB1cGRhdGVkLCB3aGljaCBjYW4gYmUgdGhlIGNhc2UgZm9yIEl0ZW1zIHdpdGggc29tZSBmb3JtcyBvZiB0d28tZmFjdG9yIGF1dGhlbnRpY2F0aW9uLiAgYGJhY2tncm91bmRgIC0gSXRlbSBjYW4gYmUgdXBkYXRlZCBpbiB0aGUgYmFja2dyb3VuZCAgYHVzZXJfcHJlc2VudF9yZXF1aXJlZGAgLSBJdGVtIHJlcXVpcmVzIHVzZXIgaW50ZXJhY3Rpb24gdG8gYmUgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc1xuICAgICAqL1xuICAgIHVwZGF0ZV90eXBlOiBJdGVtV2l0aENvbnNlbnRGaWVsZHNVcGRhdGVUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSB3aGVuIHRoZSBJdGVtIHdhcyBjcmVhdGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdXNlIGNhc2VzIHRoYXQgdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0gdmlhIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuICAgWW91IGNhbiBzZWUgdGhlIGZ1bGwgbGlzdCBvZiB1c2UgY2FzZXMgb3IgdXBkYXRlIHRoZSBsaXN0IG9mIHVzZSBjYXNlcyB0byByZXF1ZXN0IGF0IGFueSB0aW1lIHZpYSB0aGUgTGluayBDdXN0b21pemF0aW9uIHNlY3Rpb24gb2YgdGhlIFtQbGFpZCBEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LXY1KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzXG4gICAgICovXG4gICAgY29uc2VudGVkX3VzZV9jYXNlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGRhdGEgc2NvcGVzIHRoYXQgdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0gdmlhIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuIFRoZXNlIGFyZSBiYXNlZCBvbiB0aGUgYGNvbnNlbnRlZF9wcm9kdWN0c2A7IHNlZSB0aGUgW2Z1bGwgbWFwcGluZ10oL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlLyNkYXRhLXNjb3Blcy1ieS1wcm9kdWN0KSBvZiBkYXRhIHNjb3BlcyBhbmQgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge0FycmF5PEl0ZW1Db25zZW50ZWREYXRhU2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBJdGVtV2l0aENvbnNlbnRGaWVsZHNcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfZGF0YV9zY29wZXM/OiBBcnJheTxJdGVtQ29uc2VudGVkRGF0YVNjb3BlPjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBJdGVtV2l0aENvbnNlbnRGaWVsZHNVcGRhdGVUeXBlRW51bSB7XG4gICAgQmFja2dyb3VuZCA9ICdiYWNrZ3JvdW5kJyxcbiAgICBVc2VyUHJlc2VudFJlcXVpcmVkID0gJ3VzZXJfcHJlc2VudF9yZXF1aXJlZCdcbn1cblxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSXRlbVdpdGhDb25zZW50RmllbGRzQWxsT2ZcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVtV2l0aENvbnNlbnRGaWVsZHNBbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgSXRlbSB3YXMgY3JlYXRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc0FsbE9mXG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgdXNlIGNhc2VzIHRoYXQgdGhlIHVzZXIgaGFzIGNvbnNlbnRlZCB0byBmb3IgdGhlIEl0ZW0gdmlhIFtEYXRhIFRyYW5zcGFyZW5jeSBNZXNzYWdpbmddKC9kb2NzL2xpbmsvZGF0YS10cmFuc3BhcmVuY3ktbWVzc2FnaW5nLW1pZ3JhdGlvbi1ndWlkZSkuICAgWW91IGNhbiBzZWUgdGhlIGZ1bGwgbGlzdCBvZiB1c2UgY2FzZXMgb3IgdXBkYXRlIHRoZSBsaXN0IG9mIHVzZSBjYXNlcyB0byByZXF1ZXN0IGF0IGFueSB0aW1lIHZpYSB0aGUgTGluayBDdXN0b21pemF0aW9uIHNlY3Rpb24gb2YgdGhlIFtQbGFpZCBEYXNoYm9hcmRdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LXY1KS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgSXRlbVdpdGhDb25zZW50RmllbGRzQWxsT2ZcbiAgICAgKi9cbiAgICBjb25zZW50ZWRfdXNlX2Nhc2VzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZGF0YSBzY29wZXMgdGhhdCB0aGUgdXNlciBoYXMgY29uc2VudGVkIHRvIGZvciB0aGUgSXRlbSB2aWEgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oL2RvY3MvbGluay9kYXRhLXRyYW5zcGFyZW5jeS1tZXNzYWdpbmctbWlncmF0aW9uLWd1aWRlKS4gVGhlc2UgYXJlIGJhc2VkIG9uIHRoZSBgY29uc2VudGVkX3Byb2R1Y3RzYDsgc2VlIHRoZSBbZnVsbCBtYXBwaW5nXSgvZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvI2RhdGEtc2NvcGVzLWJ5LXByb2R1Y3QpIG9mIGRhdGEgc2NvcGVzIGFuZCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT59XG4gICAgICogQG1lbWJlcm9mIEl0ZW1XaXRoQ29uc2VudEZpZWxkc0FsbE9mXG4gICAgICovXG4gICAgY29uc2VudGVkX2RhdGFfc2NvcGVzPzogQXJyYXk8SXRlbUNvbnNlbnRlZERhdGFTY29wZT47XG59XG4vKipcbiAqIEEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBbSldUIGxpYnJhcmllc10oaHR0cHM6Ly9qd3QuaW8vI2xpYnJhcmllcy1pbykgdG8gdmVyaWZ5IFBsYWlkIHdlYmhvb2tzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEpXS1B1YmxpY0tleVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEpXS1B1YmxpY0tleSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFsZyBtZW1iZXIgaWRlbnRpZmllcyB0aGUgY3J5cHRvZ3JhcGhpYyBhbGdvcml0aG0gZmFtaWx5IHVzZWQgd2l0aCB0aGUga2V5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGFsZzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcnYgbWVtYmVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgY3VydmUgdXNlZCB3aXRoIHRoZSBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgY3J2OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGtpZCAoS2V5IElEKSBtZW1iZXIgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggYSBzcGVjaWZpYyBrZXkuIFRoaXMgY2FuIGJlIHVzZWQsIGZvciBpbnN0YW5jZSwgdG8gY2hvb3NlIGFtb25nIGEgc2V0IG9mIGtleXMgd2l0aGluIHRoZSBKV0sgZHVyaW5nIGtleSByb2xsb3Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV0tQdWJsaWNLZXlcbiAgICAgKi9cbiAgICBraWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga3R5IChrZXkgdHlwZSkgcGFyYW1ldGVyIGlkZW50aWZpZXMgdGhlIGNyeXB0b2dyYXBoaWMgYWxnb3JpdGhtIGZhbWlseSB1c2VkIHdpdGggdGhlIGtleSwgc3VjaCBhcyBSU0Egb3IgRUMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAga3R5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZSAocHVibGljIGtleSB1c2UpIHBhcmFtZXRlciBpZGVudGlmaWVzIHRoZSBpbnRlbmRlZCB1c2Ugb2YgdGhlIHB1YmxpYyBrZXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgdXNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHggbWVtYmVyIGNvbnRhaW5zIHRoZSB4IGNvb3JkaW5hdGUgZm9yIHRoZSBlbGxpcHRpYyBjdXJ2ZSBwb2ludCwgcHJvdmlkZWQgYXMgYSBiYXNlNjR1cmwtZW5jb2RlZCBzdHJpbmcgb2YgdGhlIGNvb3JkaW5hdGVcXCdzIGJpZyBlbmRpYW4gcmVwcmVzZW50YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgeDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB5IG1lbWJlciBjb250YWlucyB0aGUgeSBjb29yZGluYXRlIGZvciB0aGUgZWxsaXB0aWMgY3VydmUgcG9pbnQsIHByb3ZpZGVkIGFzIGEgYmFzZTY0dXJsLWVuY29kZWQgc3RyaW5nIG9mIHRoZSBjb29yZGluYXRlXFwncyBiaWcgZW5kaWFuIHJlcHJlc2VudGF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSB3YXMgY3JlYXRlZCwgaW4gVW5peCB0aW1lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIEpXS1B1YmxpY0tleVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIHdoZW4gdGhlIGtleSBleHBpcmVkLCBpbiBVbml4IHRpbWUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgSldLUHVibGljS2V5XG4gICAgICovXG4gICAgZXhwaXJlZF9hdDogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQSBKV1QgSGVhZGVyLCB1c2VkIGZvciB3ZWJob29rIHZhbGlkYXRpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgSldUSGVhZGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSldUSGVhZGVyIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBKV1RIZWFkZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXVEhlYWRlclxuICAgICAqL1xuICAgIGtpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEpXVEhlYWRlclxuICAgICAqL1xuICAgIGFsZzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBhZGRyZXNzYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQT0JveFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHBvX2JveDogUE9Cb3hTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3NQdXJwb3NlTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICB0eXBlOiBBZGRyZXNzUHVycG9zZUxhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgc3RyZWV0PzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIGNpdHk/OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5XG4gICAgICovXG4gICAgcmVnaW9uPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tBZGRyZXNzU3VtbWFyeVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7S1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrQWRkcmVzc1N1bW1hcnlcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2RldGFpbHM/OiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzcyB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYGRhdGVfb2ZfYmlydGhgIGZpZWxkIG1hdGNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnkge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeVxuICAgICAqL1xuICAgIHN1bW1hcnk6IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgZGF5PzogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnlcbiAgICAgKi9cbiAgICBtb250aD86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGF0ZU9mQmlydGhTdW1tYXJ5XG4gICAgICovXG4gICAgeWVhcj86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBga3ljX2NoZWNrYCAoRGF0YSBTb3VyY2UgVmVyaWZpY2F0aW9uKSBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgIHVubGVzcyBgc3RlcHMua3ljX2NoZWNrYCBoYXMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIG9mIGVpdGhlciBgc3VjY2Vzc2Agb3IgYGZhaWxlZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdFxcJ3MgYGt5Y19jaGVja2Agc3RlcC4gVGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGBzdGVwcy5reWNfY2hlY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0FkZHJlc3NTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBLWUNDaGVja0FkZHJlc3NTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja05hbWVTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBuYW1lOiBLWUNDaGVja05hbWVTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja0RhdGVPZkJpcnRoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aDogS1lDQ2hlY2tEYXRlT2ZCaXJ0aFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0tZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBpZF9udW1iZXI6IEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtLWUNDaGVja1Bob25lU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBLWUNDaGVja1Bob25lU3VtbWFyeTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgYWRkcmVzc2AgZmllbGQgbWF0Y2hlZCBmb3IgZmllbGRzIHRoYXQgYXJlIG9ubHkgcHJlc2VudCBvbiBhbiBpbnRlcm5hdGlvbmFsIEtZQyBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgS1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgYnVpbGRpbmc6IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrRGV0YWlsc0ludGVybmF0aW9uYWxBZGRyZXNzXG4gICAgICovXG4gICAgY291bnR5OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIGRpc3RyaWN0OiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIGhvdXNlX251bWJlcjogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tEZXRhaWxzSW50ZXJuYXRpb25hbEFkZHJlc3NcbiAgICAgKi9cbiAgICBzdWJwcmVtaXNlOiBIaWRkZW5NYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja0RldGFpbHNJbnRlcm5hdGlvbmFsQWRkcmVzc1xuICAgICAqL1xuICAgIHRob3JvdWdoZmFyZTogSGlkZGVuTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgaG93IHRoZSBgaWRfbnVtYmVyYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja0lETnVtYmVyU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrSUROdW1iZXJTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tJRE51bWJlclN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xufVxuLyoqXG4gKiBSZXN1bHQgc3VtbWFyeSBvYmplY3Qgc3BlY2lmeWluZyBob3cgdGhlIGBuYW1lYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja05hbWVTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS1lDQ2hlY2tOYW1lU3VtbWFyeSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIaWRkZW5NYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja05hbWVTdW1tYXJ5XG4gICAgICovXG4gICAgZ2l2ZW5fbmFtZT86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpZGRlbk1hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIEtZQ0NoZWNrTmFtZVN1bW1hcnlcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IEhpZGRlbk1hdGNoU3VtbWFyeUNvZGU7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIGhvdyB0aGUgYHBob25lYCBmaWVsZCBtYXRjaGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBLWUNDaGVja1Bob25lU3VtbWFyeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEtZQ0NoZWNrUGhvbmVTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgS1lDQ2hlY2tQaG9uZVN1bW1hcnlcbiAgICAgKi9cbiAgICBzdW1tYXJ5OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBLWUNDaGVja1Bob25lU3VtbWFyeVxuICAgICAqL1xuICAgIGFyZWFfY29kZTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBsYXN0IHRpbWUgZWFjaCBkYXRhdHlwZSB3YXMgYWNjZXNzZWQgYnkgYW4gYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExhc3REYXRhQWNjZXNzVGltZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMYXN0RGF0YUFjY2Vzc1RpbWVzIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXBwbGljYXRpb24gYWNjZXNzaW5nIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIGFwcGxpY2F0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBhY2NvdW50X2JhbGFuY2VfaW5mbyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBhY2NvdW50X2JhbGFuY2VfaW5mbzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGFjY291bnRfcm91dGluZ19udW1iZXIgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgYWNjb3VudF9yb3V0aW5nX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCB0aW1lIGNvbnRhY3RfZGV0YWlscyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBjb250YWN0X2RldGFpbHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSB0cmFuc2FjdGlvbnMgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgY3JlZGl0X2FuZF9sb2FucyB3YXMgYWNjZXNzZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgaW4gVVRDLiBudWxsIGlmIG5ldmVyIGFjY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExhc3REYXRhQWNjZXNzVGltZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfYW5kX2xvYW5zOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgaW52ZXN0bWVudHMgd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgaW52ZXN0bWVudHM6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgdGltZSBwYXlyb2xsX2luZm8gd2FzIGFjY2Vzc2VkIGJ5IHRoaXMgYXBwbGljYXRpb24gaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IGluIFVUQy4gbnVsbCBpZiBuZXZlciBhY2Nlc3NlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMYXN0RGF0YUFjY2Vzc1RpbWVzXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmZvOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb25fcmlza19pbmZvIHdhcyBhY2Nlc3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCBpbiBVVEMuIG51bGwgaWYgbmV2ZXIgYWNjZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGFzdERhdGFBY2Nlc3NUaW1lc1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX3Jpc2tfaW5mbzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHdlYmhvb2sgb2YgdHlwZSBgTElBQklMSVRJRVNgIGFuZCBjb2RlIGBERUZBVUxUX1VQREFURWAgd2lsbCBiZSBmaXJlZCB3aGVuIG5ldyBvciB1cGRhdGVkIGxpYWJpbGl0aWVzIGhhdmUgYmVlbiBkZXRlY3RlZCBvbiBhIGxpYWJpbGl0aWVzIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElBQklMSVRJRVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUZBVUxUX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRgXFwncyBmb3IgYWNjb3VudHMgdGhhdCBjb250YWluIG5ldyBsaWFiaWxpdGllcy5cXCdcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNEZWZhdWx0VXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWRzX3dpdGhfbmV3X2xpYWJpbGl0aWVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEFuIG9iamVjdCB3aXRoIGtleXMgb2YgYGFjY291bnRfaWRgXFwncyB0aGF0IGFyZSBtYXBwZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBsaWFiaWxpdGllcyBmaWVsZHMgdGhhdCBjaGFuZ2VkLiAgRXhhbXBsZTogYHsgXFxcIlhNQnZ2eU1HUTFVb0xiS0J5b01xSDNuWE1qODRBTFNkRTVCNThcXFwiOiBbXFxcInBhc3RfYW1vdW50X2R1ZVxcXCJdIH1gIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IEFycmF5PHN0cmluZz47IH19XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkc193aXRoX3VwZGF0ZWRfbGlhYmlsaXRpZXM6IHsgW2tleTogc3RyaW5nXTogQXJyYXk8c3RyaW5nPjsgfTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0RlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBmaWx0ZXIgYC9saWFiaWxpdGllcy9nZXRgIHJlc3VsdHMuIElmIHByb3ZpZGVkLCBgb3B0aW9uc2AgY2Fubm90IGJlIG51bGwuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaWFiaWxpdGllc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjb3VudHMgdG8gcmV0cmlldmUgZm9yIHRoZSBJdGVtLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIExpYWJpbGl0aWVzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbVxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdGllc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbTogSXRlbTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlhYmlsaXRpZXNPYmplY3R9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaWFiaWxpdGllczogTGlhYmlsaXRpZXNPYmplY3Q7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGxpYWJpbGl0eSBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaWFiaWxpdGllc09iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYWJpbGl0aWVzT2JqZWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgY3JlZGl0IGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRDYXJkTGlhYmlsaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBjcmVkaXQ6IEFycmF5PENyZWRpdENhcmRMaWFiaWxpdHk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbW9ydGdhZ2UgYWNjb3VudHMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PE1vcnRnYWdlTGlhYmlsaXR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXRpZXNPYmplY3RcbiAgICAgKi9cbiAgICBtb3J0Z2FnZTogQXJyYXk8TW9ydGdhZ2VMaWFiaWxpdHk+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3R1ZGVudCBsb2FuIGFjY291bnRzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTdHVkZW50TG9hbj59XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0aWVzT2JqZWN0XG4gICAgICovXG4gICAgc3R1ZGVudDogQXJyYXk8U3R1ZGVudExvYW4+IHwgbnVsbDtcbn1cbi8qKlxuICogVXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpYWJpbGl0eU92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlhYmlsaXR5T3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBsaWFiaWxpdHkgb2JqZWN0LCBlaXRoZXIgYGNyZWRpdGAgb3IgYHN0dWRlbnRgLiBNb3J0Z2FnZXMgYXJlIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkIGluIHRoZSBjdXN0b20gU2FuZGJveC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHVyY2hhc2UgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIEZvciBzaW1wbGljaXR5LCB0aGlzIGlzIHRoZSBvbmx5IGludGVyZXN0IHJhdGUgdXNlZCB0byBjYWxjdWxhdGUgaW50ZXJlc3QgY2hhcmdlcy4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHB1cmNoYXNlX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjYXNoIEFQUiBwZXJjZW50YWdlIHZhbHVlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBjcmVkaXRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgY2FzaF9hcHI6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgYmFsYW5jZSB0cmFuc2ZlciBBUFIgcGVyY2VudGFnZSB2YWx1ZS4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGJhbGFuY2VfdHJhbnNmZXJfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpYWwgQVBSIHBlcmNlbnRhZ2UgdmFsdWUuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzcGVjaWFsX2FwcjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgbGFzdF9wYXltZW50X2Ftb3VudGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYGNyZWRpdGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBtaW5pbXVtX3BheW1lbnRfYW1vdW50YCBmaWVsZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgY3JlZGl0YCBvciBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBtaW5pbXVtX3BheW1lbnRfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBpc19vdmVyZHVlYCBmaWVsZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzX292ZXJkdWU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGxvYW4gd2FzIGluaXRpYWxseSBsZW50LCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgbG9hbiBwcmluY2lwYWwuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcHJpbmNpcGFsOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGludGVyZXN0IHJhdGUgb24gdGhlIGxvYW4gYXMgYSBwZXJjZW50YWdlLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5vbWluYWxfYXByOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCBpbnRlcmVzdCBjYXBpdGFsaXphdGlvbiBiZWdpbnMgYXQgdGhlIGdpdmVuIG51bWJlciBvZiBtb250aHMgYWZ0ZXIgbG9hbiBvcmlnaW5hdGlvbi4gQnkgZGVmYXVsdCBpbnRlcmVzdCBpcyBuZXZlciBjYXBpdGFsaXplZC4gQ2FuIG9ubHkgYmUgc2V0IGlmIGB0eXBlYCBpcyBgc3R1ZGVudGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBpbnRlcmVzdF9jYXBpdGFsaXphdGlvbl9ncmFjZV9wZXJpb2RfbW9udGhzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRMb2FuUmVwYXltZW50TW9kZWx9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X21vZGVsOiBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgZXhwZWN0ZWRfcGF5b2ZmX2RhdGVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBndWFyYW50b3JgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlIHRoZSBgaXNfZmVkZXJhbGAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGlzX2ZlZGVyYWw6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBsb2FuX25hbWVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTdHVkZW50TG9hblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlhYmlsaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBsb2FuX3N0YXR1czogU3R1ZGVudExvYW5TdGF0dXM7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGBwYXltZW50X3JlZmVyZW5jZV9udW1iZXJgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHBheW1lbnRfcmVmZXJlbmNlX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGUgdGhlIGByZXBheW1lbnRfcGxhbi5kZXNjcmlwdGlvbmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgcmVwYXltZW50X3BsYW5fZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHJlcGF5bWVudF9wbGFuLnR5cGVgIGZpZWxkLiBDYW4gb25seSBiZSBzZXQgaWYgYHR5cGVgIGlzIGBzdHVkZW50YC4gUG9zc2libGUgdmFsdWVzIGFyZTogYFxcXCJleHRlbmRlZCBncmFkdWF0ZWRcXFwiYCwgYFxcXCJleHRlbmRlZCBzdGFuZGFyZFxcXCJgLCBgXFxcImdyYWR1YXRlZFxcXCJgLCBgXFxcImluY29tZS1jb250aW5nZW50IHJlcGF5bWVudFxcXCJgLCBgXFxcImluY29tZS1iYXNlZCByZXBheW1lbnRcXFwiYCwgYFxcXCJpbmNvbWUtc2Vuc2l0aXZlIHJlcGF5bWVudFxcXCJgLCBgXFxcImludGVyZXN0IG9ubHlcXFwiYCwgYFxcXCJvdGhlclxcXCJgLCBgXFxcInBheSBhcyB5b3UgZWFyblxcXCJgLCBgXFxcInJldmlzZWQgcGF5IGFzIHlvdSBlYXJuXFxcImAsIGBcXFwic3RhbmRhcmRcXFwiYCwgb3IgYFxcXCJzYXZpbmcgb24gYSB2YWx1YWJsZSBlZHVjYXRpb25cXFwiYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaWFiaWxpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBPdmVycmlkZSB0aGUgYHNlcXVlbmNlX251bWJlcmAgZmllbGQuIENhbiBvbmx5IGJlIHNldCBpZiBgdHlwZWAgaXMgYHN0dWRlbnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgc2VxdWVuY2VfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIExpYWJpbGl0eU92ZXJyaWRlXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogQWRkcmVzcztcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgY2FsbGJhY2sgZnJvbSB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rQ2FsbGJhY2tNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVdlYmhvb2tDYWxsYmFja1R5cGV9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgY2FsbGJhY2tfdHlwZT86IExpbmtEZWxpdmVyeVdlYmhvb2tDYWxsYmFja1R5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtFdmVudE5hbWV9XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgZXZlbnRfbmFtZT86IExpbmtFdmVudE5hbWU7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXJlIGluIHRoZSBmbG93IHRoZSBMaW5rIHVzZXIgZXhpdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggYSB1c2VyXFwncyBhY3Rpb25zIGFuZCBldmVudHMgdGhyb3VnaCB0aGUgTGluayBmbG93LiBJbmNsdWRlIHRoaXMgaWRlbnRpZmllciB3aGVuIG9wZW5pbmcgYSBzdXBwb3J0IHRpY2tldCBmb3IgZmFzdGVyIHR1cm5hcm91bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBsaW5rX3Nlc3Npb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJlcXVlc3QgSUQgZm9yIHRoZSBsYXN0IHJlcXVlc3QgbWFkZSBieSBMaW5rLiBUaGlzIGNhbiBiZSBzaGFyZWQgd2l0aCBQbGFpZCBTdXBwb3J0IHRvIGV4cGVkaXRlIGludmVzdGlnYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0NhbGxiYWNrTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbj86IExpbmtEZWxpdmVyeUluc3RpdHV0aW9uO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uIElmIEFjY291bnQgU2VsZWN0IGlzIGVuYWJsZWQgdmlhIHRoZSBkZXZlbG9wZXIgZGFzaGJvYXJkLCBhY2NvdW50cyB3aWxsIG9ubHkgaW5jbHVkZSBzZWxlY3RlZCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua0RlbGl2ZXJ5QWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtDYWxsYmFja01ldGFkYXRhXG4gICAgICovXG4gICAgYWNjb3VudHM/OiBBcnJheTxMaW5rRGVsaXZlcnlBY2NvdW50Pjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gcmVsYXRlZCB0byBhY2NvdW50IGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5QWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUFjY291bnRcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgYWNjb3VudCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cy4gSXQgbWF5IGFsc28gbm90IG1hdGNoIHRoZSBtYXNrIHRoYXQgdGhlIGJhbmsgZGlzcGxheXMgdG8gdGhlIHVzZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIG1hc2s/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgdHlwZS4gU2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIHR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgc3VidHlwZS4gU2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeVZlcmlmaWNhdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5QWNjb3VudFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBMaW5rRGVsaXZlcnlWZXJpZmljYXRpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogSWYgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gaXMgYmVpbmcgdXNlZCwgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjY291bnQgYmVpbmcgdmVyaWZpZWQgaXMgYSBgYnVzaW5lc3NgIG9yIGBwZXJzb25hbGAgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlBY2NvdW50XG4gICAgICovXG4gICAgY2xhc3NfdHlwZT86IHN0cmluZztcbn1cbi8qKlxuICogV2ViaG9vayBjb250YWluaW5nIG1ldGFkYXRhIHByb3hpZWQgb3ZlciBmcm9tIExpbmsgY2FsbGJhY2sgZS5nIGBvbkV2ZW50YCwgYG9uRXhpdGAsIGBvblN1Y2Nlc3NgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBMSU5LX0RFTElWRVJZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBMSU5LX0NBTExCQUNLYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNhbGxiYWNrV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDYWxsYmFja1dlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rQ2FsbGJhY2tNZXRhZGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q2FsbGJhY2tXZWJob29rXG4gICAgICovXG4gICAgbGlua19jYWxsYmFja19tZXRhZGF0YTogTGlua0NhbGxiYWNrTWV0YWRhdGE7XG59XG4vKipcbiAqIFRoZSBjb21tdW5pY2F0aW9uIG1ldGhvZCBjb250YWluaW5nIGJvdGggdGhlIHR5cGUgYW5kIGFkZHJlc3MgdG8gc2VuZCB0aGUgVVJMLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeURlbGl2ZXJ5TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kXG4gICAgICovXG4gICAgbWV0aG9kPzogTGlua0RlbGl2ZXJ5RGVsaXZlcnlNZXRob2Q7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlciAvIGVtYWlsIGFkZHJlc3MgdGhhdCBIb3N0ZWQgTGluayBzZXNzaW9ucyBhcmUgZGVsaXZlcmVkIHRvLiBQaG9uZSBudW1iZXJzIG11c3QgYmUgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNvbW11bmljYXRpb25NZXRob2RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gIGZyb20gYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGAvbGluay90b2tlbi9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeU9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogTGlua0RlbGl2ZXJ5T3B0aW9ucztcbn1cbi8qKlxuICogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLCB3aGljaCB3aWxsIGJlIGRlbGl2ZXJlZCBieSB0aGUgc3BlY2lmaWVkIGRlbGl2ZXJ5IG1ldGhvZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIGZvciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi4gU2FtZSBhcyB0aGUgYGxpbmtfdG9rZW5gIHN0cmluZyBleGNsdWRpbmcgdGhlIFxcXCJsaW5rLXtlbnZ9LVxcXCIgcHJlZml4LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua19kZWxpdmVyeV9zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGVsaXZlcnkgbWV0aG9kIHRvIGJlIHVzZWQgdG8gZGVsaXZlciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbiBVUkwuICBgU01TYDogVGhlIFVSTCB3aWxsIGJlIGRlbGl2ZXJlZCB0aHJvdWdoIFNNUyAgYEVNQUlMYDogVGhlIFVSTCB3aWxsIGJlIGRlbGl2ZXJlZCB0aHJvdWdoIGVtYWlsXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlEZWxpdmVyeU1ldGhvZCB7XG4gICAgU21zID0gJ1NNUycsXG4gICAgRW1haWwgPSAnRU1BSUwnXG59XG5cbi8qKlxuICogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rX2RlbGl2ZXJ5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtEZWxpdmVyeUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIGZyb20gYSBwcmV2aW91cyBpbnZvY2F0aW9uIG9mIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGlua19kZWxpdmVyeS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlTZXNzaW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogTGlua0RlbGl2ZXJ5U2Vzc2lvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBIb3N0ZWQgTGluayBzZXNzaW9uIHdhcyBjcmVhdGVkIGF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIEhvc3RlZCBMaW5rIHNlc3Npb24gd2FzIGNvbXBsZXRlZCBhdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbXBsZXRlZF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeUluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5SW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGluc3RpdHV0aW9uIG5hbWUsIHN1Y2ggYXMgXFwnV2VsbHMgRmFyZ29cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSByZWxhdGVkIHRvIHRoZSBkZWxpdmVyeSBvZiB0aGUgbGluayBzZXNzaW9uIHRvIHVzZXJzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeU1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0RlbGl2ZXJ5TWV0YWRhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlXZWJob29rQ29tbXVuaWNhdGlvbk1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5TWV0YWRhdGFcbiAgICAgKi9cbiAgICBjb21tdW5pY2F0aW9uX21ldGhvZD86IExpbmtEZWxpdmVyeVdlYmhvb2tDb21tdW5pY2F0aW9uTWV0aG9kO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rRGVsaXZlcnlXZWJob29rRGVsaXZlcnlTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtEZWxpdmVyeU1ldGFkYXRhXG4gICAgICovXG4gICAgZGVsaXZlcnlfc3RhdHVzPzogTGlua0RlbGl2ZXJ5V2ViaG9va0RlbGl2ZXJ5U3RhdHVzO1xufVxuLyoqXG4gKiBPcHRpb25hbCBtZXRhZGF0YSByZWxhdGVkIHRvIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtEZWxpdmVyeU9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua0RlbGl2ZXJ5UmVjaXBpZW50fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlPcHRpb25zXG4gICAgICovXG4gICAgcmVjaXBpZW50PzogTGlua0RlbGl2ZXJ5UmVjaXBpZW50O1xufVxuLyoqXG4gKiBNZXRhZGF0YSByZWxhdGVkIHRvIHRoZSByZWNpcGllbnQuIElmIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBwb3B1bGF0ZSB0aGlzIGZpZWxkIGlzIG5vdCBhdmFpbGFibGUsIGxlYXZlIGl0IGJsYW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rRGVsaXZlcnlSZWNpcGllbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBsaXN0IG9mIGNvbW11bmljYXRpb24gbWV0aG9kcyB0byBzZW5kIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIFVSTCB0by4gSWYgZGVsaXZlcnkgaXMgbm90IHJlcXVpcmVkLCBsZWF2ZSB0aGlzIGZpZWxkIGJsYW5rLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRGVsaXZlcnlDb21tdW5pY2F0aW9uTWV0aG9kPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua0RlbGl2ZXJ5UmVjaXBpZW50XG4gICAgICovXG4gICAgY29tbXVuaWNhdGlvbl9tZXRob2RzPzogQXJyYXk8TGlua0RlbGl2ZXJ5Q29tbXVuaWNhdGlvbk1ldGhvZD47XG4gICAgLyoqXG4gICAgICogRmlyc3QgbmFtZSBvZiB0aGUgcmVjaXBpZW50LiBXaWxsIGJlIHVzZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGVtYWlsIC8gdGV4dCAoaWYgY29uZmlndXJlZCkuIElmIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRGVsaXZlcnlSZWNpcGllbnRcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBnaXZlbiBIb3N0ZWQgTGluayBzZXNzaW9uLiAgYENSRUFURURgOiBUaGUgc2Vzc2lvbiBpcyBjcmVhdGVkIGJ1dCBub3QgeWV0IGFjY2Vzc2VkIGJ5IHRoZSB1c2VyICBgT1BFTkVEYDogVGhlIHNlc3Npb24gaXMgb3BlbmVkIGJ5IHRoZSB1c2VyIGJ1dCBub3QgeWV0IGNvbXBsZXRlZCAgYEVYSVRFRGA6IFRoZSBzZXNzaW9uIGhhcyBiZWVuIGV4aXRlZCBieSB0aGUgdXNlciAgYENPTVBMRVRFRGA6IFRoZSBzZXNzaW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBieSB0aGUgdXNlciAgYEVYUElSRURgOiBUaGUgc2Vzc2lvbiBoYXMgZXhwaXJlZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5U2Vzc2lvblN0YXR1cyB7XG4gICAgQ3JlYXRlZCA9ICdDUkVBVEVEJyxcbiAgICBPcGVuZWQgPSAnT1BFTkVEJyxcbiAgICBFeGl0ZWQgPSAnRVhJVEVEJyxcbiAgICBDb21wbGV0ZWQgPSAnQ09NUExFVEVEJyxcbiAgICBFeHBpcmVkID0gJ0VYUElSRUQnXG59XG5cbi8qKlxuICogSW5kaWNhdGVzIGFuIEl0ZW1cXCdzIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlWZXJpZmljYXRpb25TdGF0dXMge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBQZW5kaW5nQXV0b21hdGljVmVyaWZpY2F0aW9uID0gJ3BlbmRpbmdfYXV0b21hdGljX3ZlcmlmaWNhdGlvbicsXG4gICAgUGVuZGluZ01hbnVhbFZlcmlmaWNhdGlvbiA9ICdwZW5kaW5nX21hbnVhbF92ZXJpZmljYXRpb24nLFxuICAgIE1hbnVhbGx5VmVyaWZpZWQgPSAnbWFudWFsbHlfdmVyaWZpZWQnLFxuICAgIFZlcmlmaWNhdGlvbkV4cGlyZWQgPSAndmVyaWZpY2F0aW9uX2V4cGlyZWQnLFxuICAgIFZlcmlmaWNhdGlvbkZhaWxlZCA9ICd2ZXJpZmljYXRpb25fZmFpbGVkJyxcbiAgICBEYXRhYmFzZU1hdGNoZWQgPSAnZGF0YWJhc2VfbWF0Y2hlZCcsXG4gICAgRGF0YWJhc2VJbnNpZ2h0c1BlbmRpbmcgPSAnZGF0YWJhc2VfaW5zaWdodHNfcGVuZGluZydcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBMaW5rIGNhbGxiYWNrIGV2ZW50XG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rRGVsaXZlcnlXZWJob29rQ2FsbGJhY2tUeXBlIHtcbiAgICBTdWNjZXNzID0gJ09OX1NVQ0NFU1MnLFxuICAgIEV2ZW50ID0gJ09OX0VWRU5UJyxcbiAgICBFeGl0ID0gJ09OX0VYSVQnXG59XG5cbi8qKlxuICogVGhlIGNvbW11bmljYXRpb24gbWV0aG9kIHVzZWQgdG8gZGVsaXZlciB0aGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5V2ViaG9va0NvbW11bmljYXRpb25NZXRob2Qge1xuICAgIFNtcyA9ICdTTVMnLFxuICAgIEVtYWlsID0gJ0VNQUlMJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGRlbGl2ZXJ5IG9mIHRoZSBIb3N0ZWQgTGluayB0byB0aGUgdXNlclxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0RlbGl2ZXJ5V2ViaG9va0RlbGl2ZXJ5U3RhdHVzIHtcbiAgICBTdWNjZXNzID0gJ1NVQ0NFU1MnLFxuICAgIEZhaWx1cmUgPSAnRkFJTFVSRSdcbn1cblxuLyoqXG4gKiBBbiBldmVudCB0aGF0IG9jY3VycmVkIHdoaWxlIHRoZSB1c2VyIHdhcyBnb2luZyB0aHJvdWdoIExpbmtcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua0V2ZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0V2ZW50IHtcbiAgICAvKipcbiAgICAgKiBFdmVudCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50XG4gICAgICovXG4gICAgZXZlbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVVVJRCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlZHVwbGljYXRlIGV2ZW50c1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudFxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtFdmVudE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRcbiAgICAgKi9cbiAgICBldmVudF9tZXRhZGF0YTogTGlua0V2ZW50TWV0YWRhdGE7XG59XG4vKipcbiAqIE1ldGFkYXRhIGFib3V0IGFuIGV2ZW50IHRoYXQgb2NjdXJyZWQgd2hpbGUgdGhlIHVzZXIgd2FzIGdvaW5nIHRocm91Z2ggTGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudE1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgY29kZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5IGBFUlJPUmAsIGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGVycm9yX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIG1lc3NhZ2UgdGhhdCB0aGUgdXNlciBlbmNvdW50ZXJlZC4gRW1pdHRlZCBieTogYEVSUk9SYCwgYEVYSVRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXJyb3IgdHlwZSB0aGF0IHRoZSB1c2VyIGVuY291bnRlcmVkLiBFbWl0dGVkIGJ5OiBgRVJST1JgLCBgRVhJVGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMga2V5IGluZGljYXRlcyB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIEVtaXR0ZWQgYnk6IGBFWElUYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGV4aXRfc3RhdHVzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgc2VsZWN0ZWQgaW5zdGl0dXRpb24uIEVtaXR0ZWQgYnk6IGFsbCBldmVudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBxdWVyeSB1c2VkIHRvIHNlYXJjaCBmb3IgaW5zdGl0dXRpb25zLiBFbWl0dGVkIGJ5OiBgU0VBUkNIX0lOU1RJVFVUSU9OYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX3NlYXJjaF9xdWVyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi4gRW1pdHRlZCBieTogYWxsIGV2ZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgc2V0LCB0aGUgdXNlciBoYXMgZW5jb3VudGVyZWQgb25lIG9mIHRoZSBmb2xsb3dpbmcgTUZBIHR5cGVzOiBjb2RlLCBkZXZpY2UsIHF1ZXN0aW9ucywgc2VsZWN0aW9ucy4gRW1pdHRlZCBieTogYFNVQk1JVF9NRkFgIGFuZCBgVFJBTlNJVElPTl9WSUVXYCB3aGVuIGB2aWV3X25hbWVgIGlzIGBNRkFgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgbWZhX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHZpZXcgdGhhdCBpcyBiZWluZyB0cmFuc2l0aW9uZWQgdG8uIEVtaXR0ZWQgYnk6IGBUUkFOU0lUSU9OX1ZJRVdgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgdmlld19uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEVpdGhlciB0aGUgdmVyaWZpY2F0aW9uIG1ldGhvZCBmb3IgYSBtYXRjaGVkIGluc3RpdHV0aW9uIHNlbGVjdGVkIGJ5IHRoZSB1c2VyIG9yIHRoZSBBdXRoIFR5cGUgU2VsZWN0IGZsb3cgdHlwZSBzZWxlY3RlZCBieSB0aGUgdXNlci4gSWYgc2VsZWN0aW9uIGlzIHVzZWQgdG8gZGVzY3JpYmUgc2VsZWN0ZWQgdmVyaWZpY2F0aW9uIG1ldGhvZCwgdGhlbiBwb3NzaWJsZSB2YWx1ZXMgYXJlIGBwaG9uZW90cGAgb3IgYHBhc3N3b3JkYDsgIGlmIHNlbGVjdGlvbiBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBzZWxlY3RlZCBBdXRoIFR5cGUgU2VsZWN0IGZsb3csIHRoZW4gcG9zc2libGUgdmFsdWVzIGFyZSBgZmxvd190eXBlX21hbnVhbGAgb3IgYGZsb3dfdHlwZV9pbnN0YW50YC4gRW1pdHRlZCBieTogYE1BVENIRURfU0VMRUNUX1ZFUklGWV9NRVRIT0RgIGFuZCBgU0VMRUNUX0FVVEhfVFlQRWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBzZWxlY3Rpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHNlbGVjdGVkIGJyYW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgYnJhbmRfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVhc29uIHRoaXMgaW5zdGl0dXRpb24gd2FzIG1hdGNoZWQuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYHJldHVybmluZ191c2VyYCBvciBgcm91dGluZ19udW1iZXJgIGlmIGVtaXR0ZWQgYnkgYE1BVENIRURfU0VMRUNUX0lOU1RJVFVUSU9OYC4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgYmUgYFNBVkVEX0lOU1RJVFVUSU9OYCBvciBgQVVUT19TRUxFQ1RfU0FWRURfSU5TVElUVVRJT05gIGlmIGVtaXR0ZWQgYnkgYFNFTEVDVF9JTlNUSVRVVElPTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50TWV0YWRhdGFcbiAgICAgKi9cbiAgICBtYXRjaF9yZWFzb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIHN1Ym1pdHRlZCBieSB1c2VyIGF0IHRoZSBtaWNyby1kZXBvc2l0cyByb3V0aW5nIG51bWJlciBwYW5lLiBFbWl0dGVkIGJ5IGBTVUJNSVRfUk9VVElOR19OVU1CRVJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudE1ldGFkYXRhXG4gICAgICovXG4gICAgcm91dGluZ19udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIG1hc2sgZXh0cmFjdGVkIGZyb20gdGhlIHVzZXItcHJvdmlkZWQgYWNjb3VudCBudW1iZXIuIElmIHRoZSB1c2VyLWlucHV0dGVkIGFjY291bnQgbnVtYmVyIGlzIGZvdXIgZGlnaXRzIGxvbmcsIGBhY2NvdW50X251bWJlcl9tYXNrYCBpcyBlbXB0eS4gRW1pdHRlZCBieSBgU1VCTUlUX0FDQ09VTlRfTlVNQkVSYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyX21hc2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgdGhhdCBoYXMganVzdCBvY2N1cnJlZCBpbiB0aGUgTGluayBmbG93LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTGlua0V2ZW50TmFtZSB7XG4gICAgQmFua0luY29tZUluc2lnaHRzQ29tcGxldGVkID0gJ0JBTktfSU5DT01FX0lOU0lHSFRTX0NPTVBMRVRFRCcsXG4gICAgQ2xvc2VPYXV0aCA9ICdDTE9TRV9PQVVUSCcsXG4gICAgRXJyb3IgPSAnRVJST1InLFxuICAgIEV4aXQgPSAnRVhJVCcsXG4gICAgRmFpbE9hdXRoID0gJ0ZBSUxfT0FVVEgnLFxuICAgIEhhbmRvZmYgPSAnSEFORE9GRicsXG4gICAgSXNzdWVGb2xsb3dlZCA9ICdJU1NVRV9GT0xMT1dFRCcsXG4gICAgT3BlbiA9ICdPUEVOJyxcbiAgICBPcGVuTXlQbGFpZCA9ICdPUEVOX01ZX1BMQUlEJyxcbiAgICBPcGVuT2F1dGggPSAnT1BFTl9PQVVUSCcsXG4gICAgU2VhcmNoSW5zdGl0dXRpb24gPSAnU0VBUkNIX0lOU1RJVFVUSU9OJyxcbiAgICBTZWxlY3RBdXRoVHlwZSA9ICdTRUxFQ1RfQVVUSF9UWVBFJyxcbiAgICBTZWxlY3RCcmFuZCA9ICdTRUxFQ1RfQlJBTkQnLFxuICAgIFNlbGVjdERlZ3JhZGVkSW5zdGl0dXRpb24gPSAnU0VMRUNUX0RFR1JBREVEX0lOU1RJVFVUSU9OJyxcbiAgICBTZWxlY3REb3duSW5zdGl0dXRpb24gPSAnU0VMRUNUX0RPV05fSU5TVElUVVRJT04nLFxuICAgIFNlbGVjdEZpbHRlcmVkSW5zdGl0dXRpb24gPSAnU0VMRUNUX0ZJTFRFUkVEX0lOU1RJVFVUSU9OJyxcbiAgICBTZWxlY3RJbnN0aXR1dGlvbiA9ICdTRUxFQ1RfSU5TVElUVVRJT04nLFxuICAgIFN1Ym1pdEFjY291bnROdW1iZXIgPSAnU1VCTUlUX0FDQ09VTlRfTlVNQkVSJyxcbiAgICBTdWJtaXRDcmVkZW50aWFscyA9ICdTVUJNSVRfQ1JFREVOVElBTFMnLFxuICAgIFN1Ym1pdERvY3VtZW50cyA9ICdTVUJNSVRfRE9DVU1FTlRTJyxcbiAgICBTdWJtaXREb2N1bWVudHNFcnJvciA9ICdTVUJNSVRfRE9DVU1FTlRTX0VSUk9SJyxcbiAgICBTdWJtaXREb2N1bWVudHNTdWNjZXNzID0gJ1NVQk1JVF9ET0NVTUVOVFNfU1VDQ0VTUycsXG4gICAgU3VibWl0TWZhID0gJ1NVQk1JVF9NRkEnLFxuICAgIFN1Ym1pdFJvdXRpbmdOdW1iZXIgPSAnU1VCTUlUX1JPVVRJTkdfTlVNQkVSJyxcbiAgICBUcmFuc2l0aW9uVmlldyA9ICdUUkFOU0lUSU9OX1ZJRVcnLFxuICAgIFZpZXdEYXRhVHlwZXMgPSAnVklFV19EQVRBX1RZUEVTJ1xufVxuXG4vKipcbiAqIFRoaXMgd2ViaG9vayBjb250YWlucyBhIHN1bW1hcnkgb2YgdGhlIGV2ZW50cyBmcm9tIGEgTGluayBzZXNzaW9uIGFuZCB3aWxsIGJlIGZpcmVkIGFmdGVyIHRoZSB1c2VyIGZpbmlzaGVzIGdvaW5nIHRocm91Z2ggTGluay4gSWYgdGhlIHVzZXIgYWJhbmRvbnMgdGhlIExpbmsgZmxvdyAoaS5lLiwgY2xvc2VzIHRoZSBob3N0ZWQgbGluayB3ZWJwYWdlIG9yIGxlYXZlcyBMaW5rIG9wZW4gZm9yIHRvbyBsb25nIHdpdGhvdXQgdGFraW5nIGFueSBhY3Rpb24pLCB0aGUgd2ViaG9vayB3aWxsIGJlIGZpcmVkIDUtMTUgbWludXRlcyBhZnRlciB0aGUgbGFzdCB1c2VyIGludGVyYWN0aW9uLiBBIHNpbmdsZSBMaW5rIHNlc3Npb24gbWF5IG9jY2FzaW9uYWxseSBnZW5lcmF0ZSBtdWx0aXBsZSBgRVZFTlRTYCB3ZWJob29rcy4gSWYgdGhpcyBvY2N1cnMsIHRoZSBuZXcgd2ViaG9vayB3aWxsIGNvbnRhaW4gYWxsIHByZXZpb3VzIGV2ZW50cyBmb3IgdGhlIHNlc3Npb24sIGFzIHdlbGwgYXMgbmV3IGV2ZW50cyB0aGF0IG9jY3VycmVkIHNpbmNlIHRoZSBwcmV2aW91cyBgRVZFTlRTYCB3ZWJob29rIHdhcyBzZW50LiBJZiB0aGlzIG9jY3VycywgZXZlbnRzIGNhbiBiZSBncm91cGVkIHVzaW5nIHRoZSBgbGlua19zZXNzaW9uX2lkYCBmaWVsZCBhbmQsIGlmIG5lY2Vzc2FyeSwgZGUtZHVwbGljYXRlZCB1c2luZyB0aGUgYGV2ZW50X2lkYCBmaWVsZC4gIEJ5IGRlZmF1bHQsIHRoZSBgRVZFTlRTYCB3ZWJob29rIGlzIHNlbnQgb25seSBmb3Igc2Vzc2lvbnMgd2hlcmUgdGhlIGVuZCB1c2VyIGdvZXMgdGhyb3VnaCBhIEhvc3RlZCBMaW5rIGZsb3cgKGluY2x1ZGluZyBMaW5rIFJlY292ZXJ5IGZsb3dzKS4gSWYgeW91IHdvdWxkIGxpa2UgdG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2sgZm9yIHNlc3Npb25zIG5vdCB1c2luZyBIb3N0ZWQgTGluaywgY29udGFjdCB5b3VyIEFjY291bnQgTWFuYWdlciBvciBTdXBwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rRXZlbnRzV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtFdmVudHNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBFVkVOVFNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua0V2ZW50c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTGluayBldmVudHMgZW1pdHRlZCBkdXJpbmcgdGhlIExpbmsgc2Vzc2lvblxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGV2ZW50czogQXJyYXk8TGlua0V2ZW50PjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIGZvciB0aGUgTGluayBzZXNzaW9uIHRoZXNlIGV2ZW50cyBvY2N1cnJlZCBpblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtFdmVudHNXZWJob29rXG4gICAgICovXG4gICAgbGlua19zZXNzaW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExpbmsgdG9rZW4gdXNlZCB0byBjcmVhdGUgdGhlIExpbmsgc2Vzc2lvbiB0aGVzZSBldmVudHMgYXJlIGZyb21cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rRXZlbnRzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfY29ycmVsYXRpb25faWRgIGZyb20gYSByZWNlaXZlZCBPQXV0aCByZWRpcmVjdCBVUkkgY2FsbGJhY2tcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19jb3JyZWxhdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay9vYXV0aC9jb3JyZWxhdGlvbl9pZC9leGNoYW5nZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGBsaW5rX3Rva2VuYCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBgbGlua19jb3JyZWxhdGlvbl9pZGAsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlLWluaXRpYWxpemUgTGluay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgYmFuayBlbXBsb3ltZW50IHZlcmlmaWNhdGlvbiBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkJhbmtFbXBsb3ltZW50UmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25CYW5rRW1wbG95bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIHN0YXR1czogQ3JlZGl0U2Vzc2lvbkJhbmtFbXBsb3ltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25CYW5rRW1wbG95bWVudFJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIHN0YXR1czogQ3JlZGl0U2Vzc2lvbkJhbmtJbmNvbWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIEl0ZW0gSUQuIFRoZSBgaXRlbV9pZGAgaXMgYWx3YXlzIHVuaXF1ZTsgbGlua2luZyB0aGUgc2FtZSBhY2NvdW50IGF0IHRoZSBzYW1lIGluc3RpdHV0aW9uIHR3aWNlIHdpbGwgcmVzdWx0IGluIHR3byBJdGVtcyB3aXRoIGRpZmZlcmVudCBgaXRlbV9pZGAgdmFsdWVzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkJhbmtJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQmFua0luY29tZVJlc3VsdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBkb2N1bWVudCB1cGxvYWQgQ1JBIHNlc3Npb24gaW4gbGlua1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkNyYURvY3VtZW50VXBsb2FkUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25DcmFEb2N1bWVudFVwbG9hZFJlc3VsdCB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdGhlIHVzZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25DcmFEb2N1bWVudFVwbG9hZFJlc3VsdFxuICAgICAqL1xuICAgIG51bV9iYW5rX3N0YXRlbWVudHNfdXBsb2FkZWQ6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGRldGFpbHMgb2YgYSBQbGFpZCBDaGVjayBJdGVtIGFkZCBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBDaGVjayBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gVGhlIGBpdGVtX2lkYCBpcyBjYXNlLXNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGBhY2NvdW50c2Agd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uQ3JhSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gW29uRXhpdF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3dlYi8jb25leGl0KSBjYWxsYmFjayBmcm9tIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uRXhpdCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdFxuICAgICAqL1xuICAgIGVycm9yOiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0TWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdFxuICAgICAqL1xuICAgIG1ldGFkYXRhOiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YSB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYW4gW29uRXhpdF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3dlYi8jb25leGl0KSBjYWxsYmFjayBmcm9tIExpbmsuIFRoaXMgZmllbGQgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBbYGV4aXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWdldC1yZXNwb25zZS1saW5rLXNlc3Npb25zLWV4aXQpLCBmb3IgaW1wcm92ZWQgbmFtaW5nIGNvbnNpc3RlbmN5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0RGVwcmVjYXRlZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlcnJvcjogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdE1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkXG4gICAgICovXG4gICAgbWV0YWRhdGE6IExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhIHwgbnVsbDtcbn1cbi8qKlxuICogRGlzcGxheWVkIGlmIGEgdXNlciBleGl0cyBMaW5rIHdpdGhvdXQgc3VjY2Vzc2Z1bGx5IGxpbmtpbmcgYW4gSXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdE1ldGFkYXRhSW5zdGl0dXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRXhpdE1ldGFkYXRhXG4gICAgICovXG4gICAgaW5zdGl0dXRpb24/OiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9pbnQgYXQgd2hpY2ggdGhlIHVzZXIgZXhpdGVkIHRoZSBMaW5rIGZsb3cuIE9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIHN0YXR1cz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBJRCBmb3IgdGhlIGxhc3QgcmVxdWVzdCBtYWRlIGJ5IExpbmsuIFRoaXMgY2FuIGJlIHNoYXJlZCB3aXRoIFBsYWlkIFN1cHBvcnQgdG8gZXhwZWRpdGUgaW52ZXN0aWdhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIGluc3RpdHV0aW9uIG9iamVjdC4gSWYgdGhlIEl0ZW0gd2FzIGNyZWF0ZWQgdmlhIFNhbWUtRGF5IG9yIEluc3RhbnQgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24sIHdpbGwgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgaW5zdGl0dXRpb24gbmFtZSwgc3VjaCBhcyBgV2VsbHMgRmFyZ29gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25FeGl0TWV0YWRhdGFJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGluc3RpdHV0aW9uIGlkZW50aWZpZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkV4aXRNZXRhZGF0YUluc3RpdHV0aW9uXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdGF0ZSBvZiBhIGNvbXBsZXRlZCBMaW5rIHNlc3Npb24sIGFsb25nIHdpdGggdGhlIHB1YmxpYyB0b2tlbihzKSBpZiBhdmFpbGFibGUuICBCeSBkZWZhdWx0LCB0aGlzIHdlYmhvb2sgaXMgc2VudCBvbmx5IGZvciBzZXNzaW9ucyBlbmFibGVkIGZvciB0aGUgSG9zdGVkIExpbmsgZmxvdyAoaW5jbHVkaW5nIExpbmsgUmVjb3ZlcnkgZmxvd3MpIG9yIGEgTXVsdGktSXRlbSBMaW5rIGZsb3cuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHJlY2VpdmUgdGhpcyB3ZWJob29rIGZvciBvdGhlciBzZXNzaW9ucywgY29udGFjdCB5b3VyIEFjY291bnQgTWFuYWdlciBvciBTdXBwb3J0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTRVNTSU9OX0ZJTklTSEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZpbmFsIHN0YXR1cyBvZiB0aGUgTGluayBzZXNzaW9uLiBXaWxsIGFsd2F5cyBiZSBcXFwiU1VDQ0VTU1xcXCIgb3IgXFxcIkVYSVRFRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWRlbnRpZmllciBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkZpbmlzaGVkV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsaW5rIHRva2VuIHVzZWQgdG8gY3JlYXRlIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1YmxpYyB0b2tlbiBnZW5lcmF0ZWQgYnkgdGhlIExpbmsgc2Vzc2lvbi4gVGhpcyBmaWVsZCBoYXMgYmVlbiBkZXByZWNhdGVkOyBwbGVhc2UgdXNlIGBwdWJsaWNfdG9rZW5zYCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHB1YmxpYyB0b2tlbnMgZ2VuZXJhdGVkIGJ5IHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uRmluaXNoZWRXZWJob29rXG4gICAgICovXG4gICAgcHVibGljX3Rva2Vucz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25GaW5pc2hlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBvZiBhbiBJdGVtIGFkZCBpbiBMaW5rLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHQge1xuICAgIC8qKlxuICAgICAqIFJldHVybmVkIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgbGlua2VkIHRoZWlyIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25JdGVtQWRkUmVzdWx0XG4gICAgICovXG4gICAgcHVibGljX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGFjY291bnRzIGF0dGFjaGVkIHRvIHRoZSBjb25uZWN0ZWQgSXRlbS4gSWYgQWNjb3VudCBTZWxlY3QgaXMgZW5hYmxlZCB2aWEgdGhlIGRldmVsb3BlciBkYXNoYm9hcmQsIGBhY2NvdW50c2Agd2lsbCBvbmx5IGluY2x1ZGUgc2VsZWN0ZWQgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdFxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvbkl0ZW1BZGRSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIG9mIGEgZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gaW4gTGluay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25QYXlyb2xsSW5jb21lUmVzdWx0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHBheXN0dWJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fcGF5c3R1YnNfcmV0cmlldmVkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBXLTJzIHJldHJpZXZlZCBmcm9tIGEgcGF5cm9sbCBwcm92aWRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBudW1fdzJzX3JldHJpZXZlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUluc3RpdHV0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblBheXJvbGxJbmNvbWVSZXN1bHRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBzZXQgb2YgcmVzdWx0cyBmb3IgYSBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uUmVzdWx0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uUmVzdWx0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBJdGVtIGFkZHMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGl0ZW1fYWRkX3Jlc3VsdHM6IEFycmF5PExpbmtTZXNzaW9uSXRlbUFkZFJlc3VsdD47XG4gICAgLyoqXG4gICAgICogVGhlIHNldCBvZiBQbGFpZCBDaGVjayBJdGVtIGFkZHMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uQ3JhSXRlbUFkZFJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGNyYV9pdGVtX2FkZF9yZXN1bHRzOiBBcnJheTxMaW5rU2Vzc2lvbkNyYUl0ZW1BZGRSZXN1bHQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXQgb2YgYmFuayBpbmNvbWUgdmVyaWZpY2F0aW9ucyBmb3IgdGhlIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8TGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0Pn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgYmFua19pbmNvbWVfcmVzdWx0czogQXJyYXk8TGlua1Nlc3Npb25CYW5rSW5jb21lUmVzdWx0PjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2V0IG9mIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbnMgZm9yIHRoZSBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge0FycmF5PExpbmtTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lX3Jlc3VsdHM6IEFycmF5PExpbmtTZXNzaW9uUGF5cm9sbEluY29tZVJlc3VsdD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25SZXN1bHRzXG4gICAgICovXG4gICAgZG9jdW1lbnRfaW5jb21lX3Jlc3VsdHM6IENyZWRpdFNlc3Npb25Eb2N1bWVudEluY29tZVJlc3VsdCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uQ3JhRG9jdW1lbnRVcGxvYWRSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uUmVzdWx0c1xuICAgICAqL1xuICAgIGNyYV9kb2N1bWVudF91cGxvYWRfcmVzdWx0cz86IExpbmtTZXNzaW9uQ3JhRG9jdW1lbnRVcGxvYWRSZXN1bHQgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIFtvblN1Y2Nlc3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay93ZWIvI29uc3VjY2VzcykgY2FsbGJhY2sgZnJvbSBMaW5rLiBUaGlzIG9iamVjdCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHRoZSBuZXdlciBbYHJlc3VsdHMuaXRlbV9hZGRfcmVzdWx0YF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1nZXQtcmVzcG9uc2UtbGluay1zZXNzaW9ucy1yZXN1bHRzLWl0ZW0tYWRkLXJlc3VsdHMpLCB3aGljaCBjYW4gc3VwcG9ydCBtdWx0aXBsZSBwdWJsaWMgdG9rZW5zIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBEaXNwbGF5ZWQgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBsaW5rZWQgdGhlaXIgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc1xuICAgICAqL1xuICAgIG1ldGFkYXRhOiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YSB8IG51bGw7XG59XG4vKipcbiAqIERpc3BsYXllZCBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGxpbmtlZCB0aGVpciBJdGVtLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbj86IExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhY2NvdW50cyBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uIElmIEFjY291bnQgU2VsZWN0IGlzIGVuYWJsZWQgdmlhIHRoZSBkZXZlbG9wZXIgZGFzaGJvYXJkLCBgYWNjb3VudHNgIHdpbGwgb25seSBpbmNsdWRlIHNlbGVjdGVkIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtBcnJheTxMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnQ+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCBhIHVzZXJcXCdzIGFjdGlvbnMgYW5kIGV2ZW50cyB0aHJvdWdoIHRoZSBMaW5rIGZsb3cuIEluY2x1ZGUgdGhpcyBpZGVudGlmaWVyIHdoZW4gb3BlbmluZyBhIHN1cHBvcnQgdGlja2V0IGZvciBmYXN0ZXIgdHVybmFyb3VuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFUcmFuc2ZlclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9zdGF0dXM/OiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVRyYW5zZmVyU3RhdHVzIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gYWNjb3VudCBhdHRhY2hlZCB0byB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb2ZmaWNpYWwgYWNjb3VudCBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFBY2NvdW50XG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuIE5vdGUgdGhhdCB0aGUgbWFzayBtYXkgYmUgbm9uLXVuaXF1ZSBiZXR3ZWVuIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBJdCBtYXkgYWxzbyBub3QgbWF0Y2ggdGhlIG1hc2sgdGhhdCB0aGUgYmFuayBkaXNwbGF5cyB0byB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICBtYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCB0eXBlLiBTZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHN1YnR5cGUuIFNlZSB0aGUgW0FjY291bnQgc2NoZW1hXSgvZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0IG9mIHBvc3NpYmxlIHZhbHVlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhQWNjb3VudFxuICAgICAqL1xuICAgIHN1YnR5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGFuIEl0ZW1cXCdzIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIG9yIGRhdGFiYXNlIHZlcmlmaWNhdGlvbiBzdGF0dXMuIFBvc3NpYmxlIHZhbHVlcyBhcmU6ICBgcGVuZGluZ19hdXRvbWF0aWNfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBhdXRvbWF0aWMgdmVyaWZpY2F0aW9uICBgcGVuZGluZ19tYW51YWxfdmVyaWZpY2F0aW9uYDogVGhlIEl0ZW0gaXMgcGVuZGluZyBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24uIEl0ZW1zIHJlbWFpbiBpbiB0aGlzIHN0YXRlIHVudGlsIHRoZSB1c2VyIHN1Y2Nlc3NmdWxseSB2ZXJpZmllcyB0aGUgY29kZS4gIGBhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkYDogVGhlIEl0ZW0gaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGF1dG9tYXRpY2FsbHkgdmVyaWZpZWQgIGBtYW51YWxseV92ZXJpZmllZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBtYW51YWxseSB2ZXJpZmllZCAgYHZlcmlmaWNhdGlvbl9leHBpcmVkYDogUGxhaWQgd2FzIHVuYWJsZSB0byBhdXRvbWF0aWNhbGx5IHZlcmlmeSB0aGUgZGVwb3NpdCB3aXRoaW4gNyBjYWxlbmRhciBkYXlzIGFuZCB3aWxsIG5vIGxvbmdlciBhdHRlbXB0IHRvIHZhbGlkYXRlIHRoZSBJdGVtLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgdmVyaWZpY2F0aW9uX2ZhaWxlZGA6IFRoZSBJdGVtIGZhaWxlZCBtYW51YWwgbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gYmVjYXVzZSB0aGUgdXNlciBleGhhdXN0ZWQgYWxsIDMgdmVyaWZpY2F0aW9uIGF0dGVtcHRzLiBVc2VycyBtYXkgcmV0cnkgYnkgc3VibWl0dGluZyB0aGVpciBpbmZvcm1hdGlvbiBhZ2FpbiB0aHJvdWdoIExpbmsuICBgZGF0YWJhc2VfbWF0Y2hlZGA6IFRoZSBJdGVtIGhhcyBzdWNjZXNzZnVsbHkgYmVlbiB2ZXJpZmllZCB1c2luZyBQbGFpZFxcJ3MgZGF0YSBzb3VyY2VzLiAgYGRhdGFiYXNlX2luc2lnaHRzX3BlbmRpbmdgOiBUaGUgRGF0YWJhc2UgSW5zaWdodHMgcmVzdWx0IGlzIHBlbmRpbmcgYW5kIHdpbGwgYmUgYXZhaWxhYmxlIHVwb24gQXV0aCByZXF1ZXN0LiBOb3RlOiBEYXRhYmFzZSBJbnNpZ2h0cyBpcyBjdXJyZW50bHkgYSBiZXRhIGZlYXR1cmUsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm9ybWF0aW9uLiAgYG51bGxgOiBOZWl0aGVyIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIG5vciBkYXRhYmFzZSB2ZXJpZmljYXRpb24gYXJlIGJlaW5nIHVzZWQgZm9yIHRoZSBJdGVtLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiB3YXMgYmVpbmcgdXNlZCwgaW5kaWNhdGVzIHRoZSB1c2VyXFwncyBzZWxlY3Rpb24gd2hlbiBhc2tlZCBpZiB0aGUgYWNjb3VudCBiZWluZyB2ZXJpZmllZCBpcyBhIGBidXNpbmVzc2Agb3IgYHBlcnNvbmFsYCBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgYXMgUGxhaWQgbm8gbG9uZ2VyIGNvbGxlY3RzIHRoaXMgaW5mb3JtYXRpb24gZHVyaW5nIHRoZSBtaWNyby1kZXBvc2l0IGZsb3cuIFRvIHNlZSB3aGV0aGVyIGFuIGFjY291bnQgaXMgYnVzaW5lc3Mgb3IgcGVyc29uYWwsIHVzZSB0aGUgYGhvbGRlcl9jYXRlZ29yeWAgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YUFjY291bnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNsYXNzX3R5cGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBpbnN0aXR1dGlvbiBvYmplY3QuIElmIHRoZSBJdGVtIHdhcyBjcmVhdGVkIHZpYSBTYW1lLURheSBvciBJbnN0YW50IG1pY3JvLWRlcG9zaXQgdmVyaWZpY2F0aW9uLCB3aWxsIGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGluc3RpdHV0aW9uIG5hbWUsIHN1Y2ggYXMgYFxcJ1dlbGxzIEZhcmdvXFwnYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtTZXNzaW9uU3VjY2Vzc01ldGFkYXRhSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBpbnN0aXR1dGlvbiBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Nlc3Npb25TdWNjZXNzTWV0YWRhdGFJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIGEgdHJhbnNmZXIuIFJldHVybmVkIG9ubHkgd2hlbiBbVHJhbnNmZXIgVUldKC9kb2NzL3RyYW5zZmVyL3VzaW5nLXRyYW5zZmVyLXVpKSBpcyBpbXBsZW1lbnRlZC4gIC0gYENPTVBMRVRFYCDigJMgVGhlIHRyYW5zZmVyIHdhcyBjb21wbGV0ZWQuIC0gYElOQ09NUExFVEVgIOKAkyBUaGUgdHJhbnNmZXIgY291bGQgbm90IGJlIGNvbXBsZXRlZC4gRm9yIGhlbHAsIHNlZSBbVHJvdWJsZXNob290aW5nIHRyYW5zZmVyc10oL2RvY3MvdHJhbnNmZXIvdXNpbmctdHJhbnNmZXItdWkjdHJvdWJsZXNob290aW5nLXRyYW5zZmVycykuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMaW5rU2Vzc2lvblN1Y2Nlc3NNZXRhZGF0YVRyYW5zZmVyU3RhdHVzIHtcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURScsXG4gICAgSW5jb21wbGV0ZSA9ICdJTkNPTVBMRVRFJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogQnkgZGVmYXVsdCwgTGluayB3aWxsIHByb3ZpZGUgbGltaXRlZCBhY2NvdW50IGZpbHRlcmluZzogaXQgd2lsbCBvbmx5IGRpc3BsYXkgSW5zdGl0dXRpb25zIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBhbGwgcHJvZHVjdHMgc3VwcGxpZWQgaW4gdGhlIGBwcm9kdWN0c2AgcGFyYW1ldGVyIG9mIGAvbGluay90b2tlbi9jcmVhdGVgLCBhbmQsIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXksIHdpbGwgYWxzbyBmaWx0ZXIgb3V0IGFjY291bnRzIG90aGVyIHRoYW4gYGNoZWNraW5nYCwgYHNhdmluZ3NgLCBhbmQgYGNhc2ggbWFuYWdlbWVudGAgYWNjb3VudHMgb24gdGhlIEFjY291bnQgU2VsZWN0IHBhbmUuIFlvdSBjYW4gZnVydGhlciBsaW1pdCB0aGUgYWNjb3VudHMgc2hvd24gaW4gTGluayBieSB1c2luZyBgYWNjb3VudF9maWx0ZXJzYCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIHNob3duIGluIExpbmsuIE9ubHkgdGhlIHNwZWNpZmllZCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBUaGlzIGZpbHRlcmluZyBhcHBsaWVzIHRvIGJvdGggdGhlIEFjY291bnQgU2VsZWN0IHZpZXcgKGlmIGVuYWJsZWQpIGFuZCB0aGUgSW5zdGl0dXRpb24gU2VsZWN0IHZpZXcuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBzdWJ0eXBlcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBMaW5rLiBUbyBpbmRpY2F0ZSB0aGF0IGFsbCBzdWJ0eXBlcyBzaG91bGQgYmUgc2hvd24sIHVzZSB0aGUgdmFsdWUgYFxcXCJhbGxcXFwiYC4gSWYgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIGZpbHRlciBpcyB1c2VkLCBhbnkgYWNjb3VudCB0eXBlIGZvciB3aGljaCBhIGZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZW50aXJlbHkgb21pdHRlZCBmcm9tIExpbmsuIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gIFRoZSBmaWx0ZXIgbWF5IG9yIG1heSBub3QgaW1wYWN0IHRoZSBsaXN0IG9mIGFjY291bnRzIHNob3duIGJ5IHRoZSBpbnN0aXR1dGlvbiBpbiB0aGUgT0F1dGggYWNjb3VudCBzZWxlY3Rpb24gZmxvdywgZGVwZW5kaW5nIG9uIHRoZSBzcGVjaWZpYyBpbnN0aXR1dGlvbi4gSWYgdGhlIHVzZXIgc2VsZWN0cyBleGNsdWRlZCBhY2NvdW50IHN1YnR5cGVzIGluIHRoZSBPQXV0aCBmbG93LCB0aGVzZSBhY2NvdW50cyB3aWxsIG5vdCBiZSBhZGRlZCB0byB0aGUgSXRlbS4gSWYgdGhlIHVzZXIgc2VsZWN0cyBvbmx5IGV4Y2x1ZGVkIGFjY291bnQgc3VidHlwZXMsIHRoZSBsaW5rIGF0dGVtcHQgd2lsbCBmYWlsIGFuZCB0aGUgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIHRyeSBhZ2Fpbi4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQWNjb3VudEZpbHRlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXBvc2l0b3J5RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBEZXBvc2l0b3J5RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkFjY291bnRGaWx0ZXJzXG4gICAgICovXG4gICAgY3JlZGl0PzogQ3JlZGl0RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuRmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGxvYW4/OiBMb2FuRmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50RmlsdGVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5BY2NvdW50RmlsdGVyc1xuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBJbnZlc3RtZW50RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdGhlckZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQWNjb3VudEZpbHRlcnNcbiAgICAgKi9cbiAgICBvdGhlcj86IE90aGVyRmlsdGVyO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBDYXNoZmxvdyBSZXBvcnQgcHJvZHVjdC4gQ3VycmVudGx5IGluIGNsb3NlZCBiZXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DYXNoZmxvd1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNhc2hmbG93UmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3QgaW4gdGhlIENhc2hmbG93IFJlcG9ydCBwcm9kdWN0LiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DYXNoZmxvd1JlcG9ydFxuICAgICAqL1xuICAgIGRheXNfcmVxdWVzdGVkPzogbnVtYmVyO1xufVxuLyoqXG4gKiBBIG1hcCBjb250YWluaW5nIGRhdGEgdG8gcGFzcyBpbiBmb3IgdGhlIENhcmQgU3dpdGNoIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVDYXJkU3dpdGNoIHtcbiAgICAvKipcbiAgICAgKiBUaGUgQklOIChCYW5rIElkZW50aWZpY2F0aW9uIE51bWJlcikgb2YgdGhlIGNhcmQgdG8gc3dpdGNoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2hcbiAgICAgKi9cbiAgICBjYXJkX2Jpbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgY3JlZGl0YC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUNyZWRpdEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlQ3JlZGl0RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PENyZWRpdEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGRlcG9zaXRvcnlgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZURlcG9zaXRvcnlGaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxEZXBvc2l0b3J5QWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PERlcG9zaXRvcnlBY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBmb3IgSG9zdGVkIExpbmsuIFRvIGVuYWJsZSB0aGUgc2Vzc2lvbiBmb3IgSG9zdGVkIExpbmssIHNlbmQgdGhpcyBvYmplY3QgaW4gdGhlIHJlcXVlc3QuIEl0IGNhbiBiZSBlbXB0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmsge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtIb3N0ZWRMaW5rRGVsaXZlcnlNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAgICAgKi9cbiAgICBkZWxpdmVyeV9tZXRob2Q/OiBIb3N0ZWRMaW5rRGVsaXZlcnlNZXRob2Q7XG4gICAgLyoqXG4gICAgICogVVJJIHRoYXQgSG9zdGVkIExpbmsgd2lsbCByZWRpcmVjdCB0byB1cG9uIGNvbXBsZXRpb24gb2YgdGhlIExpbmsgZmxvdy4gVGhpcyB3aWxsIG9ubHkgb2NjdXIgaW4gSG9zdGVkIExpbmsgc2Vzc2lvbnMsIG5vdCBpbiBvdGhlciBpbXBsZW1lbnRhdGlvbiBtZXRob2RzLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVIb3N0ZWRMaW5rXG4gICAgICovXG4gICAgY29tcGxldGlvbl9yZWRpcmVjdF91cmk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSG93IG1hbnkgc2Vjb25kcyB0aGUgbGluayB3aWxsIGJlIHZhbGlkIGZvci4gTXVzdCBiZSBwb3NpdGl2ZS4gQ2Fubm90IGJlIGxvbmdlciB0aGFuIDIxIGRheXMuIFRoZSBkZWZhdWx0IGxpZmV0aW1lIGlzIDcgZGF5cyBmb3IgbGlua3MgZGVsaXZlcmVkIGJ5IGVtYWlsLCAxIGRheSBmb3IgbGlua3MgZGVsaXZlcmVkIHZpYSBTTVMsIGFuZCAzMCBtaW51dGVzIGZvciBsaW5rcyBub3Qgc2VudCB2aWEgUGxhaWQgTGluayBkZWxpdmVyeS4gVGhpcyBwYXJhbWV0ZXIgd2lsbCBvdmVycmlkZSB0aGUgdmFsdWUgb2YgYWxsIHRocmVlIGxpbmsgdHlwZXMuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmtcbiAgICAgKi9cbiAgICB1cmxfbGlmZXRpbWVfc2Vjb25kcz86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGluZGljYXRlcyB3aGV0aGVyIHRoZSBjbGllbnQgaXMgb3BlbmluZyBob3N0ZWQgTGluayBpbiBhIG1vYmlsZSBhcHAgaW4gYW4gb3V0IG9mIHByb2Nlc3Mgd2ViIHZpZXcgKE9PUFdWKSAoaS5lLiwgYW4gYEFzV2ViQXV0aGVudGljYXRpb25TZXNzaW9uYCAvIGBTRlNhZmFyaVZpZXdDb250cm9sbGVyYCBvciBBbmRyb2lkIEN1c3RvbSBUYWIpLiBcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlSG9zdGVkTGlua1xuICAgICAqL1xuICAgIGlzX21vYmlsZV9hcHA/OiBib29sZWFuO1xufVxuLyoqXG4gKiBJZGVudGl0eSBvYmplY3QgdXNlZCB0byBzcGVjaWZ5IGRvY3VtZW50IHVwbG9hZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJZGVudGl0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBVc2VkIHRvIHNwZWNpZnkgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIElkZW50aXR5IERvY3VtZW50IFVwbG9hZFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVJZGVudGl0eVxuICAgICAqL1xuICAgIGlzX2RvY3VtZW50X3VwbG9hZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGFjY291bnRfaWRzYC4gQ3VycmVudGx5IGNhbiBvbmx5IGNvbnRhaW4gb25lIGBhY2NvdW50X2lkYC4gTXVzdCBiZSBwb3B1bGF0ZWQgaWYgdXNpbmcgRG9jdW1lbnQgVXBsb2FkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVJZGVudGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWRzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXJzaW5nIGNvbmZpZ3VyYXRpb25zLiBWYWxpZCBwYXJzaW5nIGNvbmZpZ3VyYXRpb25zIGFyZSBgb2NyYCBhbmQgYHJpc2tfc2lnbmFsc2AuIElmIHBhcnNpbmcgY29uZmlndXJhdGlvbnMgYXJlIG9taXR0ZWQsIGRlZmF1bHRzIHRvIGBvY3JgXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVJZGVudGl0eVxuICAgICAqL1xuICAgIHBhcnNpbmdfY29uZmlncz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+O1xufVxuLyoqXG4gKiBBIG1hcCBjb250YWluaW5nIGRhdGEgdXNlZCB0byBoaWdobGlnaHQgaW5zdGl0dXRpb25zIGluIExpbmsuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJvdXRpbmcgbnVtYmVyIG9mIHRoZSBiYW5rIHRvIGhpZ2hsaWdodCBpbiBMaW5rLiBOb3RlOiBpbiByYXJlIGNhc2VzLCBhIHNpbmdsZSByb3V0aW5nIG51bWJlciBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIG11bHRpcGxlIGluc3RpdHV0aW9ucywgZS5nLiBkdWUgdG8gYSBicm9rZXJhZ2UgdXNpbmcgYW5vdGhlciBpbnN0aXR1dGlvbiB0byBtYW5hZ2UgQUNIIG9uIGl0cyBzd2VlcCBhY2NvdW50cy4gSWYgdGhpcyBoYXBwZW5zLCB0aGUgYmFuayB3aWxsIG5vdCBiZSBoaWdobGlnaHRlZCBpbiBMaW5rIGV2ZW4gaWYgdGhlIHJvdXRpbmcgbnVtYmVyIGlzIHByb3ZpZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YVxuICAgICAqL1xuICAgIHJvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cyAob3IgYGJyb2tlcmFnZWAtdHlwZSBhY2NvdW50cyBmb3IgQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PEludmVzdG1lbnRBY2NvdW50U3VidHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZUludmVzdG1lbnRGaWx0ZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X3N1YnR5cGVzPzogQXJyYXk8SW52ZXN0bWVudEFjY291bnRTdWJ0eXBlPjtcbn1cbi8qKlxuICogQSBmaWx0ZXIgdG8gYXBwbHkgdG8gYGxvYW5gLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXIge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY291bnQgc3VidHlwZXMgdG8gZGlzcGxheSBpbiBMaW5rLiBJZiBub3Qgc3BlY2lmaWVkLCBhbGwgYWNjb3VudCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuIFxuICAgICAqIEB0eXBlIHtBcnJheTxMb2FuQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVMb2FuRmlsdGVyXG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlcz86IEFycmF5PExvYW5BY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgeW91ciBhcHBsaWNhdGlvbiwgYXMgaXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiBMaW5rLiBNYXhpbXVtIGxlbmd0aCBvZiAzMCBjaGFyYWN0ZXJzLiBJZiBhIHZhbHVlIGxvbmdlciB0aGFuIDMwIGNoYXJhY3RlcnMgaXMgcHJvdmlkZWQsIExpbmsgd2lsbCBkaXNwbGF5IFxcXCJUaGlzIEFwcGxpY2F0aW9uXFxcIiBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYW5ndWFnZSB0aGF0IExpbmsgc2hvdWxkIGJlIGRpc3BsYXllZCBpbi4gV2hlbiBpbml0aWFsaXppbmcgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24sIHRoaXMgZmllbGQgaXMgbm90IHVzZWQ7IGZvciBtb3JlIGRldGFpbHMsIHNlZSBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHN1cHBvcnRlZCBsYW5ndWFnZXNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi8jc3VwcG9ydGVkLWxhbmd1YWdlcykuICBTdXBwb3J0ZWQgbGFuZ3VhZ2VzIGFyZTogLSBEYW5pc2ggKGBcXCdkYVxcJ2ApIC0gRHV0Y2ggKGBcXCdubFxcJ2ApIC0gRW5nbGlzaCAoYFxcJ2VuXFwnYCkgLSBFc3RvbmlhbiAoYFxcJ2V0XFwnYCkgLSBGcmVuY2ggKGBcXCdmclxcJ2ApIC0gR2VybWFuIChgXFwnZGVcXCdgKSAtIEhpbmRpIChgXFwnaGlcXCdgKSAtIEl0YWxpYW4gKGBcXCdpdFxcJ2ApIC0gTGF0dmlhbiAoYFxcJ2x2XFwnYCkgLSBMaXRodWFuaWFuIChgXFwnbHRcXCdgKSAtIE5vcndlZ2lhbiAoYFxcJ25vXFwnYCkgLSBQb2xpc2ggKGBcXCdwbFxcJ2ApIC0gUG9ydHVndWVzZSAoYFxcJ3B0XFwnYCkgLSBSb21hbmlhbiAoYFxcJ3JvXFwnYCkgLSBTcGFuaXNoIChgXFwnZXNcXCdgKSAtIFN3ZWRpc2ggKGBcXCdzdlxcJ2ApIC0gVmlldG5hbWVzZSAoYFxcJ3ZpXFwnYCkgIFdoZW4gdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIHRoZSBsYW5ndWFnZSBjb25maWd1cmVkIGhlcmUgbXVzdCBtYXRjaCB0aGUgc2V0dGluZyBpbiB0aGUgY3VzdG9taXphdGlvbiwgb3IgdGhlIGN1c3RvbWl6YXRpb24gd2lsbCBub3QgYmUgYXBwbGllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IGFuIGFycmF5IG9mIFBsYWlkLXN1cHBvcnRlZCBjb3VudHJ5IGNvZGVzIHVzaW5nIHRoZSBJU08tMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlIHN0YW5kYXJkLiBJbnN0aXR1dGlvbnMgZnJvbSBhbGwgbGlzdGVkIGNvdW50cmllcyB3aWxsIGJlIHNob3duLiBGb3IgYSBjb21wbGV0ZSBtYXBwaW5nIG9mIHN1cHBvcnRlZCBwcm9kdWN0cyBieSBjb3VudHJ5LCBzZWUgaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsLy4gIElmIHVzaW5nIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgYGNvdW50cnlfY29kZXNgIHNob3VsZCBiZSBzZXQgdG8gdGhlIGNvdW50cnkgd2hlcmUgeW91ciBjb21wYW55IGlzIGJhc2VkLCBub3QgdGhlIGNvdW50cnkgd2hlcmUgeW91ciB1c2VyIGlzIGxvY2F0ZWQuIEZvciBhbGwgb3RoZXIgcHJvZHVjdHMsIGBjb3VudHJ5X2NvZGVzYCByZXByZXNlbnRzIHRoZSBsb2NhdGlvbiBvZiB5b3VyIHVzZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIElmIExpbmsgaXMgbGF1bmNoZWQgd2l0aCBtdWx0aXBsZSBjb3VudHJ5IGNvZGVzLCBvbmx5IHByb2R1Y3RzIHRoYXQgeW91IGFyZSBlbmFibGVkIGZvciBpbiBhbGwgY291bnRyaWVzIHdpbGwgYmUgdXNlZCBieSBMaW5rLiBOb3RlIHRoYXQgd2hpbGUgYWxsIGNvdW50cmllcyBhcmUgZW5hYmxlZCBieSBkZWZhdWx0IGluIFNhbmRib3gsIGluIFByb2R1Y3Rpb24gb25seSBVUyBhbmQgQ2FuYWRhIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIEV1cm9wZWFuIGluc3RpdHV0aW9ucywgW2ZpbGUgYSBwcm9kdWN0IGFjY2VzcyBTdXBwb3J0IHRpY2tldF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3N1cHBvcnQvbmV3L3Byb2R1Y3QtYW5kLWRldmVsb3BtZW50L3Byb2R1Y3QtdHJvdWJsZXNob290aW5nL3JlcXVlc3QtcHJvZHVjdC1hY2Nlc3MpIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLiAgSWYgdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIG1ha2Ugc3VyZSB0aGUgY291bnRyeSBjb2RlcyBpbiB0aGUgY3VzdG9taXphdGlvbiBtYXRjaCB0aG9zZSBzcGVjaWZpZWQgaW4gYGNvdW50cnlfY29kZXNgLCBvciB0aGUgY3VzdG9taXphdGlvbiBtYXkgbm90IGJlIGFwcGxpZWQuICBJZiB1c2luZyB0aGUgQXV0aCBmZWF0dXJlcyBJbnN0YW50IE1hdGNoLCBJbnN0YW50IE1pY3JvLWRlcG9zaXRzLCBTYW1lLWRheSBNaWNyby1kZXBvc2l0cywgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzLCBvciBEYXRhYmFzZSBJbnNpZ2h0cywgYGNvdW50cnlfY29kZXNgIG11c3QgYmUgc2V0IHRvIGBbXFwnVVNcXCddYC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q291bnRyeUNvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRyeV9jb2RlczogQXJyYXk8Q291bnRyeUNvZGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB5b3Ugd2lzaCB0byB1c2UuIElmIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCBzaG91bGQgYmUgb21pdHRlZCAodW5sZXNzIHlvdSBhcmUgdXNpbmcgdXBkYXRlIG1vZGUgdG8gYWRkIEluY29tZSBvciBBc3NldHMgdG8gYW4gSXRlbSk7IHJlcXVpcmVkIG90aGVyd2lzZS4gIGBiYWxhbmNlYCBpcyAqbm90KiBhIHZhbGlkIHZhbHVlLCB0aGUgQmFsYW5jZSBwcm9kdWN0IGRvZXMgbm90IHJlcXVpcmUgZXhwbGljaXQgaW5pdGlhbGl6YXRpb24gYW5kIHdpbGwgYXV0b21hdGljYWxseSBiZSBpbml0aWFsaXplZCB3aGVuIGFueSBvdGhlciBwcm9kdWN0IGlzIGluaXRpYWxpemVkLiAgVGhlIHByb2R1Y3RzIHNwZWNpZmllZCBoZXJlIHdpbGwgZGV0ZXJtaW5lIHdoaWNoIGluc3RpdHV0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZSB0byB5b3VyIHVzZXJzIGluIExpbmsuIE9ubHkgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCAqYWxsKiByZXF1ZXN0ZWQgcHJvZHVjdHMgY2FuIGJlIHNlbGVjdGVkOyBhIGlmIGEgdXNlciBhdHRlbXB0cyB0byBzZWxlY3QgYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IGEgbGlzdGVkIHByb2R1Y3QsIGEgXFxcIkNvbm5lY3Rpdml0eSBub3Qgc3VwcG9ydGVkXFxcIiBlcnJvciBtZXNzYWdlIHdpbGwgYXBwZWFyIGluIExpbmsuIFRvIG1heGltaXplIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIGF2YWlsYWJsZSwgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIG1pbmltYWwgcHJvZHVjdCBzZXQgcmVxdWlyZWQgZm9yIHlvdXIgdXNlIGNhc2UuICAgQWRkaXRpb25hbCBwcm9kdWN0cyBjYW4gYmUgaW5jbHVkZWQgdmlhIHRoZSBbYG9wdGlvbmFsX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1vcHRpb25hbC1wcm9kdWN0cykgb3IgIFtgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC1yZXF1aXJlZC1pZi1zdXBwb3J0ZWQtcHJvZHVjdHMpIGZpZWxkcy4gUHJvZHVjdHMgY2FuIGFsc28gYmUgaW5pdGlhbGl6ZWQgYnkgY2FsbGluZyB0aGUgZW5kcG9pbnQgYWZ0ZXIgb2J0YWluaW5nIGFuIGFjY2VzcyB0b2tlbjsgdGhpcyBtYXkgcmVxdWlyZSB0aGUgcHJvZHVjdCB0byBiZSBsaXN0ZWQgaW4gdGhlIFtgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LWFkZGl0aW9uYWwtY29uc2VudGVkLXByb2R1Y3RzKSBhcnJheS4gRm9yIGRldGFpbHMsIHNlZSBbQ2hvb3Npbmcgd2hlbiB0byBpbml0aWFsaXplIHByb2R1Y3RzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLykuICBOb3RlIHRoYXQsIHVubGVzcyB5b3UgaGF2ZSBvcHRlZCB0byBkaXNhYmxlIEluc3RhbnQgTWF0Y2ggc3VwcG9ydCwgaW5zdGl0dXRpb25zIHRoYXQgc3VwcG9ydCBJbnN0YW50IE1hdGNoIHdpbGwgYWxzbyBiZSBzaG93biBpbiBMaW5rIGlmIGBhdXRoYCBpcyBzcGVjaWZpZWQgYXMgYSBwcm9kdWN0LCBldmVuIHRob3VnaCB0aGVzZSBpbnN0aXR1dGlvbnMgZG8gbm90IGNvbnRhaW4gYGF1dGhgIGluIHRoZWlyIHByb2R1Y3QgYXJyYXkuICBJbiBQcm9kdWN0aW9uLCB5b3Ugd2lsbCBiZSBiaWxsZWQgZm9yIGVhY2ggcHJvZHVjdCB0aGF0IHlvdSBzcGVjaWZ5IHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE5vdGUgdGhhdCBhIHByb2R1Y3QgY2Fubm90IGJlIHJlbW92ZWQgZnJvbSBhbiBJdGVtIG9uY2UgdGhlIEl0ZW0gaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGF0IHByb2R1Y3QuIFRvIHN0b3AgYmlsbGluZyBvbiBhbiBJdGVtIGZvciBzdWJzY3JpcHRpb24tYmFzZWQgcHJvZHVjdHMsIHN1Y2ggYXMgTGlhYmlsaXRpZXMsIEludmVzdG1lbnRzLCBhbmQgVHJhbnNhY3Rpb25zLCByZW1vdmUgdGhlIEl0ZW0gdmlhIGAvaXRlbS9yZW1vdmVgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBQbGFpZCBwcm9kdWN0KHMpIHlvdSB3aXNoIHRvIHVzZSBvbmx5IGlmIHRoZSBpbnN0aXR1dGlvbiBhbmQgYWNjb3VudChzKSBzZWxlY3RlZCBieSB0aGUgdXNlciBzdXBwb3J0IHRoZSBwcm9kdWN0LiBJbnN0aXR1dGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCB0aGVzZSBwcm9kdWN0cyB3aWxsIHN0aWxsIGJlIHNob3duIGluIExpbmsuIFRoZSBwcm9kdWN0cyB3aWxsIG9ubHkgYmUgZXh0cmFjdGVkIGFuZCBiaWxsZWQgaWYgdGhlIHVzZXIgc2VsZWN0cyBhbiBpbnN0aXR1dGlvbiBhbmQgYWNjb3VudCB0eXBlIHRoYXQgc3VwcG9ydHMgdGhlbS4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXlzLiBUaGUgYHByb2R1Y3RzYCBhcnJheSBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHByb2R1Y3QuICBGb3IgbW9yZSBkZXRhaWxzIG9uIHVzaW5nIHRoaXMgZmVhdHVyZSwgc2VlIFtSZXF1aXJlZCBpZiBTdXBwb3J0ZWQgUHJvZHVjdHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvaW5pdGlhbGl6aW5nLXByb2R1Y3RzLyNyZXF1aXJlZC1pZi1zdXBwb3J0ZWQtcHJvZHVjdHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgUGxhaWQgcHJvZHVjdChzKSB0aGF0IHdpbGwgZW5oYW5jZSB0aGUgY29uc3VtZXJcXCdzIHVzZSBjYXNlLCBidXQgdGhhdCB5b3VyIGFwcCBjYW4gZnVuY3Rpb24gd2l0aG91dC4gUGxhaWQgd2lsbCBhdHRlbXB0IHRvIGZldGNoIGRhdGEgZm9yIHRoZXNlIHByb2R1Y3RzIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMsIGFuZCBmYWlsdXJlIHRvIHN1cHBvcnQgdGhlc2UgcHJvZHVjdHMgd2lsbCBub3QgYWZmZWN0IEl0ZW0gY3JlYXRpb24uICBUaGVyZSBzaG91bGQgYmUgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoaXMgYXJyYXkgYW5kIHRoZSBgcHJvZHVjdHNgLCBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCwgb3IgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheXMuIFRoZSBgcHJvZHVjdHNgIGFycmF5IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgcHJvZHVjdC4gIEZvciBtb3JlIGRldGFpbHMgb24gdXNpbmcgdGhpcyBmZWF0dXJlLCBzZWUgW09wdGlvbmFsIFByb2R1Y3RzXShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy9saW5rL2luaXRpYWxpemluZy1wcm9kdWN0cy8jb3B0aW9uYWwtcHJvZHVjdHMpLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25hbF9wcm9kdWN0cz86IEFycmF5PFByb2R1Y3RzPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBhZGRpdGlvbmFsIFBsYWlkIHByb2R1Y3QocykgeW91IHdpc2ggdG8gY29sbGVjdCBjb25zZW50IGZvciB0byBzdXBwb3J0IHlvdXIgdXNlIGNhc2UuIFRoZXNlIHByb2R1Y3RzIHdpbGwgbm90IGJlIGJpbGxlZCB1bnRpbCB5b3Ugc3RhcnQgdXNpbmcgdGhlbSBieSBjYWxsaW5nIHRoZSByZWxldmFudCBlbmRwb2ludHMuICBgYmFsYW5jZWAgaXMgKm5vdCogYSB2YWxpZCB2YWx1ZSwgdGhlIEJhbGFuY2UgcHJvZHVjdCBkb2VzIG5vdCByZXF1aXJlIGV4cGxpY2l0IGluaXRpYWxpemF0aW9uIGFuZCB3aWxsIGF1dG9tYXRpY2FsbHkgaGF2ZSBjb25zZW50IGNvbGxlY3RlZC4gIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZXNlIHByb2R1Y3RzIHdpbGwgc3RpbGwgYmUgc2hvd24gaW4gTGluay4gIFRoZXJlIHNob3VsZCBiZSBubyBvdmVybGFwIGJldHdlZW4gdGhpcyBhcnJheSBhbmQgdGhlIGBwcm9kdWN0c2Agb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXlzLiAgSWYgeW91IGluY2x1ZGUgYHNpZ25hbGAgaW4gYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCwgeW91IHdpbGwgbmVlZCB0byBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIGJlZm9yZSBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCBmb3IgdGhlIGZpcnN0IHRpbWUgb24gYW4gSXRlbSBpbiBvcmRlciB0byBnZXQgdGhlIG1vc3QgYWNjdXJhdGUgcmVzdWx0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFtVc2luZyBgL3NpZ25hbC9wcmVwYXJlYF0oL2RvY3Mvc2lnbmFsLyN1c2luZy1zaWduYWxwcmVwYXJlKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXN0aW5hdGlvbiBVUkwgdG8gd2hpY2ggYW55IHdlYmhvb2tzIHNob3VsZCBiZSBzZW50LiBOb3RlIHRoYXQgd2ViaG9va3MgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiAoZS13YWxsZXQgdHJhbnNhY3Rpb25zIG9ubHkpLCBUcmFuc2ZlciwgQmFuayBUcmFuc2ZlciAoaW5jbHVkaW5nIEF1dGggbWljcm8tZGVwb3NpdCBub3RpZmljYXRpb24gd2ViaG9va3MpLCBNb25pdG9yLCBJZGVudGl0eSBWZXJpZmljYXRpb24sIGFuZCBMaW5rIEV2ZW50cyBhcmUgY29uZmlndXJlZCB2aWEgdGhlIERhc2hib2FyZCBpbnN0ZWFkLiBJbiB1cGRhdGUgbW9kZSwgdGhpcyBmaWVsZCB3aWxsIG5vdCBoYXZlIGFuIGVmZmVjdDsgdG8gdXBkYXRlIHRoZSB3ZWJob29rIHJlY2VpdmVyIGVuZHBvaW50IGZvciBhbiBleGlzdGluZyBJdGVtLCB1c2UgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gdG8gdXBkYXRlIG9yIHJlZmVyZW5jZSwgdXNlZCB3aGVuIHVwZGF0aW5nLCBtb2RpZnlpbmcsIG9yIGFjY2Vzc2luZyBhbiBleGlzdGluZyBgYWNjZXNzX3Rva2VuYC4gVXNlZCB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHVwZGF0ZSBtb2RlLCB3aGVuIGNvbXBsZXRpbmcgdGhlIFNhbWUtZGF5IChtYW51YWwpIE1pY3JvLWRlcG9zaXQgZmxvdywgb3IgKG9wdGlvbmFsbHkpIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsgZm9yIGEgcmV0dXJuaW5nIHVzZXIgYXMgcGFydCBvZiB0aGUgVHJhbnNmZXIgVUkgZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjZXNzIHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIGl0ZW1zIHRvIHVwZGF0ZSBpbiBMaW5rIHVwZGF0ZSBtb2RlIGZvciB0aGUgQXNzZXRzIHByb2R1Y3QuIFVzaW5nIHRoaXMgaW5zdGVhZCBvZiB0aGUgYGFjY2Vzc190b2tlbmAgZmllbGQgYWxsb3dzIHRoZSB1cGRhdGluZyBvZiBtdWx0aXBsZSBpdGVtcyBhdCBvbmNlLiBUaGlzIGZlYXR1cmUgaXMgaW4gY2xvc2VkIGJldGEsIHBsZWFzZSBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIGZvciBtb3JlIGluZm8uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW5zPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgTGluayBjdXN0b21pemF0aW9uIGZyb20gdGhlIFBsYWlkIERhc2hib2FyZCB0byBiZSBhcHBsaWVkIHRvIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBgZGVmYXVsdGAgY3VzdG9taXphdGlvbiB3aWxsIGJlIHVzZWQuIFdoZW4gdXNpbmcgYSBMaW5rIGN1c3RvbWl6YXRpb24sIHRoZSBsYW5ndWFnZSBpbiB0aGUgY3VzdG9taXphdGlvbiBtdXN0IG1hdGNoIHRoZSBsYW5ndWFnZSBzZWxlY3RlZCB2aWEgdGhlIGBsYW5ndWFnZWAgcGFyYW1ldGVyLCBhbmQgdGhlIGNvdW50cmllcyBpbiB0aGUgY3VzdG9taXphdGlvbiBzaG91bGQgbWF0Y2ggdGhlIGNvdW50cnkgY29kZXMgc2VsZWN0ZWQgdmlhIGBjb3VudHJ5X2NvZGVzYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua19jdXN0b21pemF0aW9uX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBVUkkgaW5kaWNhdGluZyB0aGUgZGVzdGluYXRpb24gd2hlcmUgYSB1c2VyIHNob3VsZCBiZSBmb3J3YXJkZWQgYWZ0ZXIgY29tcGxldGluZyB0aGUgTGluayBmbG93OyB1c2VkIHRvIHN1cHBvcnQgT0F1dGggYXV0aGVudGljYXRpb24gZmxvd3Mgd2hlbiBsYXVuY2hpbmcgTGluayBpbiB0aGUgYnJvd3NlciBvciBhbm90aGVyIGFwcC4gVGhlIGByZWRpcmVjdF91cmlgIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24sIG11c3QgYmUgYW4gaHR0cHMgVVJJLiBUbyBzcGVjaWZ5IGFueSBzdWJkb21haW4sIHVzZSBgKmAgYXMgYSB3aWxkY2FyZCBjaGFyYWN0ZXIsIGUuZy4gYGh0dHBzOi8vXyouZXhhbXBsZS5jb20vb2F1dGguaHRtbGAuIE5vdGUgdGhhdCBhbnkgcmVkaXJlY3QgVVJJIG11c3QgYWxzbyBiZSBhZGRlZCB0byB0aGUgQWxsb3dlZCByZWRpcmVjdCBVUklzIGxpc3QgaW4gdGhlIFtkZXZlbG9wZXIgZGFzaGJvYXJkXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9hcGkpLiBJZiBpbml0aWFsaXppbmcgb24gQW5kcm9pZCwgYGFuZHJvaWRfcGFja2FnZV9uYW1lYCBtdXN0IGJlIHNwZWNpZmllZCBpbnN0ZWFkIGFuZCBgcmVkaXJlY3RfdXJpYCBzaG91bGQgYmUgbGVmdCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHlvdXIgYXBwXFwncyBBbmRyb2lkIHBhY2thZ2UuIFJlcXVpcmVkIGlmIHVzaW5nIHRoZSBgbGlua190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIG9uIEFuZHJvaWQuIEFueSBwYWNrYWdlIG5hbWUgc3BlY2lmaWVkIGhlcmUgbXVzdCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBBbGxvd2VkIEFuZHJvaWQgcGFja2FnZSBuYW1lcyBzZXR0aW5nIG9uIHRoZSBbZGV2ZWxvcGVyIGRhc2hib2FyZF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vYXBpKS4gV2hlbiBjcmVhdGluZyBhIGBsaW5rX3Rva2VuYCBmb3IgaW5pdGlhbGl6aW5nIExpbmsgb24gb3RoZXIgcGxhdGZvcm1zLCBgYW5kcm9pZF9wYWNrYWdlX25hbWVgIG11c3QgYmUgbGVmdCBibGFuayBhbmQgYHJlZGlyZWN0X3VyaWAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW5kcm9pZF9wYWNrYWdlX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2RhdGE/OiBMaW5rVG9rZW5DcmVhdGVJbnN0aXR1dGlvbkRhdGE7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2h9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjYXJkX3N3aXRjaD86IExpbmtUb2tlbkNyZWF0ZUNhcmRTd2l0Y2g7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkFjY291bnRGaWx0ZXJzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9maWx0ZXJzPzogTGlua1Rva2VuQWNjb3VudEZpbHRlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkVVQ29uZmlnfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXVfY29uZmlnPzogTGlua1Rva2VuRVVDb25maWc7XG4gICAgLyoqXG4gICAgICogVXNlZCBmb3IgY2VydGFpbiBFdXJvcGUtb25seSBjb25maWd1cmF0aW9ucywgYXMgd2VsbCBhcyBjZXJ0YWluIGxlZ2FjeSB1c2UgY2FzZXMgaW4gb3RoZXIgcmVnaW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50Q29uZmlndXJhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfY29uZmlndXJhdGlvbj86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50Q29uZmlndXJhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9pbml0aWF0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRJbml0aWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZGVwb3NpdF9zd2l0Y2g/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50PzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiYXNlX3JlcG9ydD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3JlZGl0X3BhcnRuZXJfaW5zaWdodHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNyYV9vcHRpb25zPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0UGVybWlzc2libGVQdXJwb3NlICYgc3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3Blcm1pc3NpYmxlX3B1cnBvc2U/OiBDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZSAmIHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGh9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhdXRoPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXBkYXRlPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbnRpdHlfdmVyaWZpY2F0aW9uPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdElkZW50aXR5VmVyaWZpY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50cztcbiAgICAvKipcbiAgICAgKiBBIHVzZXIgdG9rZW4gZ2VuZXJhdGVkIHVzaW5nIGAvdXNlci9jcmVhdGVgLiBBbnkgSXRlbSBjcmVhdGVkIGR1cmluZyB0aGUgTGluayBzZXNzaW9uIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5JbnZlc3RtZW50c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGludmVzdG1lbnRzPzogTGlua1Rva2VuSW52ZXN0bWVudHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkludmVzdG1lbnRzQXV0aH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGludmVzdG1lbnRzX2F1dGg/OiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGg7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbmt9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBob3N0ZWRfbGluaz86IExpbmtUb2tlbkNyZWF0ZUhvc3RlZExpbms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlblRyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9ucz86IExpbmtUb2tlblRyYW5zYWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHJlcXVlc3QgYSBDUkEgY29ubmVjdGlvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNyYV9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVudGl0eT86IExpbmtUb2tlbkNyZWF0ZUlkZW50aXR5O1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgaW5kaWNhdGVzIHRoYXQgY2xpZW50IHN1cHBvcnRzIGxpbmtpbmcgRmluYW5jZUtpdCAvIEFwcGxlQ2FyZCBpdGVtcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZpbmFuY2VraXRfc3VwcG9ydGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGVuYWJsZSBsaW5raW5nIG11bHRpcGxlIGl0ZW1zIGluIHRoZSBzYW1lIExpbmsgc2Vzc2lvbi4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuYWJsZV9tdWx0aV9pdGVtX2xpbms/OiBib29sZWFuO1xufVxuLyoqXG4gKiBCeSBkZWZhdWx0LCBMaW5rIHdpbGwgb25seSBkaXNwbGF5IGFjY291bnQgdHlwZXMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGFsbCBwcm9kdWN0cyBzdXBwbGllZCBpbiB0aGUgYHByb2R1Y3RzYCBwYXJhbWV0ZXIgb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWAuIFlvdSBjYW4gZnVydGhlciBsaW1pdCB0aGUgYWNjb3VudHMgc2hvd24gaW4gTGluayBieSB1c2luZyBgYWNjb3VudF9maWx0ZXJzYCB0byBzcGVjaWZ5IHRoZSBhY2NvdW50IHN1YnR5cGVzIHRvIGJlIHNob3duIGluIExpbmsuIE9ubHkgdGhlIHNwZWNpZmllZCBzdWJ0eXBlcyB3aWxsIGJlIHNob3duLiBUaGlzIGZpbHRlcmluZyBhcHBsaWVzIHRvIGJvdGggdGhlIEFjY291bnQgU2VsZWN0IHZpZXcgKGlmIGVuYWJsZWQpIGFuZCB0aGUgSW5zdGl0dXRpb24gU2VsZWN0IHZpZXcuIEluc3RpdHV0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBzZWxlY3RlZCBzdWJ0eXBlcyB3aWxsIGJlIG9taXR0ZWQgZnJvbSBMaW5rLiBUbyBpbmRpY2F0ZSB0aGF0IGFsbCBzdWJ0eXBlcyBzaG91bGQgYmUgc2hvd24sIHVzZSB0aGUgdmFsdWUgYFxcXCJhbGxcXFwiYC4gSWYgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIGZpbHRlciBpcyB1c2VkLCBhbnkgYWNjb3VudCB0eXBlIGZvciB3aGljaCBhIGZpbHRlciBpcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZW50aXJlbHkgb21pdHRlZCBmcm9tIExpbmsuICBGb3IgYSBmdWxsIGxpc3Qgb2YgdmFsaWQgdHlwZXMgYW5kIHN1YnR5cGVzLCBzZWUgdGhlIFtBY2NvdW50IHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjYWNjb3VudC10eXBlLXNjaGVtYSkuICBGb3IgaW5zdGl0dXRpb25zIHVzaW5nIE9BdXRoLCB0aGUgZmlsdGVyIHdpbGwgbm90IGFmZmVjdCB0aGUgbGlzdCBvZiBpbnN0aXR1dGlvbnMgb3IgYWNjb3VudHMgc2hvd24gYnkgdGhlIGJhbmsgaW4gdGhlIE9BdXRoIHdpbmRvdy4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QWNjb3VudFN1YnR5cGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlRGVwb3NpdG9yeUZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGRlcG9zaXRvcnk/OiBMaW5rVG9rZW5DcmVhdGVEZXBvc2l0b3J5RmlsdGVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVDcmVkaXRGaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAgICAgKi9cbiAgICBjcmVkaXQ/OiBMaW5rVG9rZW5DcmVhdGVDcmVkaXRGaWx0ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZUxvYW5GaWx0ZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBY2NvdW50U3VidHlwZXNcbiAgICAgKi9cbiAgICBsb2FuPzogTGlua1Rva2VuQ3JlYXRlTG9hbkZpbHRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSW52ZXN0bWVudEZpbHRlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEFjY291bnRTdWJ0eXBlc1xuICAgICAqL1xuICAgIGludmVzdG1lbnQ/OiBMaW5rVG9rZW5DcmVhdGVJbnZlc3RtZW50RmlsdGVyO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBBdXRoIHByb2R1Y3QuIFRoaXMgZmllbGQgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIG9yIGRpc2FibGUgZXh0ZW5kZWQgQXV0aCBmbG93cyBmb3IgdGhlIHJlc3VsdGluZyBMaW5rIHNlc3Npb24uIE9taXR0aW5nIGFueSBmaWVsZCB3aWxsIHJlc3VsdCBpbiBhIGRlZmF1bHQgdGhhdCBjYW4gYmUgY29uZmlndXJlZCBieSB5b3VyIGFjY291bnQgbWFuYWdlci4gVGhlIGRlZmF1bHQgYmVoYXZpb3IgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHRoYXQgd2lsbCBhcHBseSBpZiB5b3UgaGF2ZSBub3QgcmVxdWVzdGVkIHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIGFwcGx5IGEgZGlmZmVyZW50IGRlZmF1bHQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGgge1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIEF1dGggVHlwZSBTZWxlY3QgaXMgZW5hYmxlZCBmb3IgdGhlIExpbmsgc2Vzc2lvbiwgYWxsb3dpbmcgdGhlIGVuZCB1c2VyIHRvIGNob29zZSBiZXR3ZWVuIGxpbmtpbmcgdmlhIGEgY3JlZGVudGlhbHMtYmFzZWQgZmxvdyAoaS5lLiBJbnN0YW50IEF1dGgsIEluc3RhbnQgTWF0Y2gsIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cykgb3IgYSBtYW51YWwgZmxvdyB0aGF0IGRvZXMgbm90IHJlcXVpcmUgbG9naW4gKGFsbCBvdGhlciBBdXRoIGZsb3dzKSBwcmlvciB0byBzZWxlY3RpbmcgdGhlaXIgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBEZWZhdWx0IGJlaGF2aW9yIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgYXV0aF90eXBlX3NlbGVjdF9lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBBdXRvbWF0ZWQgTWljcm8tZGVwb3NpdHMgZmxvdy4gRGVmYXVsdCBiZWhhdmlvciBpcyBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGF1dG9tYXRlZF9taWNyb2RlcG9zaXRzX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIEluc3RhbnQgTWF0Y2ggZmxvdy4gSW5zdGFudCBNYXRjaCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuIEluc3RhbnQgTWF0Y2ggY2FuIGJlIGRpc2FibGVkIGJ5IHNldHRpbmcgdGhpcyBmaWVsZCB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGluc3RhbnRfbWF0Y2hfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvdy4gIERlZmF1bHQgYmVoYXZpb3IgaXMgYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEF1dGhcbiAgICAgKi9cbiAgICBzYW1lX2RheV9taWNyb2RlcG9zaXRzX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBMaW5rIHNlc3Npb24gaXMgZW5hYmxlZCBmb3IgdGhlIEluc3RhbnQgTWljcm8tZGVwb3NpdHMgZmxvdy4gIERlZmF1bHQgYmVoYXZpb3IgZm9yIFBsYWlkIHRlYW1zIGNyZWF0ZWQgYWZ0ZXIgTm92ZW1iZXIgMjAyMyBpcyBgZmFsc2VgOyBkZWZhdWx0IGJlaGF2aW9yIGZvciBQbGFpZCB0ZWFtcyBjcmVhdGVkIGJlZm9yZSB0aGF0IGRhdGUgaXMgYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIGluc3RhbnRfbWljcm9kZXBvc2l0c19lbmFibGVkPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hhdCB0eXBlIG9mIFtSZXJvdXRlIHRvIENyZWRlbnRpYWxzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2Uvc2FtZS1kYXkvI3Jlcm91dGUtdG8tY3JlZGVudGlhbHMpIHBhbmUgc2hvdWxkIGJlIHVzZWQgaW4gdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIFNhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3cuIERlZmF1bHQgYmVoYXZpb3IgaXMgYE9QVElPTkFMYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIHJlcm91dGVfdG9fY3JlZGVudGlhbHM/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFJlcm91dGVUb0NyZWRlbnRpYWxzRW51bTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIHRoZSBEYXRhYmFzZSBNYXRjaCBmbG93LiBEZWZhdWx0IGJlaGF2aW9yIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgZGF0YWJhc2VfbWF0Y2hfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHdoZXRoZXIgdGhlIExpbmsgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciB0aGUgRGF0YWJhc2UgSW5zaWdodHMgZmxvdy4gRGF0YWJhc2UgSW5zaWdodHMgaXMgY3VycmVudGx5IGluIGNsb3NlZCBiZXRhOyBmb3IgYWNjZXNzLCBjb250YWN0IHlvdXIgQWNjb3VudCBNYW5hZ2VyLiBEZWZhdWx0IGJlaGF2aW9yIGlzIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICovXG4gICAgZGF0YWJhc2VfaW5zaWdodHNfZW5hYmxlZD86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGBhdXRoX3R5cGVfc2VsZWN0X2VuYWJsZWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBmbG93X3R5cGU/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aEZsb3dUeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZpZXMgd2hldGhlciB0aGUgTGluayBzZXNzaW9uIGlzIGVuYWJsZWQgZm9yIFNNUyBtaWNyby1kZXBvc2l0cyB2ZXJpZmljYXRpb24uIERlZmF1bHQgYmVoYXZpb3IgaXMgYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFxuICAgICAqL1xuICAgIHNtc19taWNyb2RlcG9zaXRzX3ZlcmlmaWNhdGlvbl9lbmFibGVkPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QXV0aFJlcm91dGVUb0NyZWRlbnRpYWxzRW51bSB7XG4gICAgT2ZmID0gJ09GRicsXG4gICAgT3B0aW9uYWwgPSAnT1BUSU9OQUwnLFxuICAgIEZvcmNlZCA9ICdGT1JDRUQnXG59XG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RBdXRoRmxvd1R5cGVFbnVtIHtcbiAgICBGbGV4aWJsZUF1dGggPSAnRkxFWElCTEVfQVVUSCdcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBCYXNlIFJlcG9ydCBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBhc3NldHNgIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5IGFuZCB0aGUgY2xpZW50IGlzIENSQS1lbmFibGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RCYXNlUmVwb3J0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gaW5jbHVkZSBpbiB0aGUgQmFzZSBSZXBvcnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEJhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0QmFzZVJlcG9ydFxuICAgICAqL1xuICAgIGNsaWVudF9yZXBvcnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIFBsYWlkIENoZWNrIHByb2R1Y3RzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBoaXN0b3J5IHRvIGluY2x1ZGUgaW4gUGxhaWQgQ2hlY2sgcHJvZHVjdHMuIERlZmF1bHQgdmFsdWUgaXMgMzY1OyBtYXhpbXVtIGlzIDczMDsgbWluaW11bSBpcyAxODAuIElmIGEgdmFsdWUgbG93ZXIgdGhhbiAxODAgaXMgcHJvdmlkZWQsIGEgbWluaW11bSBvZiAxODAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWluaW11bSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHJlcXVpcmVkIGZvciB0aGUgcmVwb3J0IHRvIGJlIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVpcmVkPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1BhcnRuZXJJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBwYXJ0bmVyX2luc2lnaHRzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNQYXJ0bmVySW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydH1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNcbiAgICAgKi9cbiAgICBiYXNlX3JlcG9ydD86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQmFzZVJlcG9ydDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1xuICAgICAqL1xuICAgIGNhc2hmbG93X2luc2lnaHRzPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBCYXNlIFJlcG9ydCBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnQge1xuICAgIC8qKlxuICAgICAqIENsaWVudC1nZW5lcmF0ZWQgaWRlbnRpZmllciwgd2hpY2ggY2FuIGJlIHVzZWQgYnkgbGVuZGVycyB0byB0cmFjayBsb2FuIGFwcGxpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc0Jhc2VSZXBvcnRcbiAgICAgKi9cbiAgICBjbGllbnRfcmVwb3J0X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgQ2FzaGZsb3cgSW5zaWdodHMgcHJvZHVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgUGxhaWQgQ2hlY2sgc2NvcmUgdG8gcmV0dXJuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdENyYU9wdGlvbnNDYXNoZmxvd0luc2lnaHRzXG4gICAgICovXG4gICAgcGxhaWRfY2hlY2tfc2NvcmVfdmVyc2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0Nhc2hmbG93QXR0cmlidXRlc1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zQ2FzaGZsb3dJbnNpZ2h0c1xuICAgICAqL1xuICAgIGF0dHJpYnV0ZXNfdmVyc2lvbj86IENhc2hmbG93QXR0cmlidXRlc1ZlcnNpb24gfCBudWxsO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBDcmVkaXQgUGFydG5lciBJbnNpZ2h0cyBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1BhcnRuZXJJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgUHJpc20gcHJvZHVjdHMgdG8gcmV0dXJuLiBJZiBub25lIGFyZSBwYXNzZWQgaW4sIHRoZW4gYWxsIHByb2R1Y3RzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge0FycmF5PFByaXNtUHJvZHVjdD59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmFPcHRpb25zUGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgcHJpc21fcHJvZHVjdHM/OiBBcnJheTxQcmlzbVByb2R1Y3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcmlzbVZlcnNpb25zfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JhT3B0aW9uc1BhcnRuZXJJbnNpZ2h0c1xuICAgICAqL1xuICAgIHByaXNtX3ZlcnNpb25zPzogUHJpc21WZXJzaW9ucyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIENyZWRpdCBQYXJ0bmVyIEluc2lnaHRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RDcmVkaXRQYXJ0bmVySW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBpbnRlZ2VyIG51bWJlciBvZiBkYXlzIG9mIGhpc3RvcnkgdG8gY29tcHV0ZSBDcmVkaXQgUGFydG5lciBJbnNpZ2h0cy4gRGVmYXVsdHMgdG8gMTgwIGlmIG5vdCBzcGVjaWZpZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIFByaXNtIHByb2R1Y3RzIHRvIHJldHVybi4gSWYgbm9uZSBhcmUgcGFzc2VkIGluLCB0aGVuIGFsbCBwcm9kdWN0cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQcmlzbVByb2R1Y3Q+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0Q3JlZGl0UGFydG5lckluc2lnaHRzXG4gICAgICovXG4gICAgcHJpc21fcHJvZHVjdHM/OiBBcnJheTxQcmlzbVByb2R1Y3Q+O1xufVxuLyoqXG4gKiAoRGVwcmVjYXRlZCkgU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgRGVwb3NpdCBTd2l0Y2ggKGJldGEpIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgaWYgYGRlcG9zaXRfc3dpdGNoYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdERlcG9zaXRTd2l0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaCB7XG4gICAgLyoqXG4gICAgICogVGhlIGBkZXBvc2l0X3N3aXRjaF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RGVwb3NpdFN3aXRjaFxuICAgICAqL1xuICAgIGRlcG9zaXRfc3dpdGNoX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEVtcGxveW1lbnQgcHJvZHVjdC4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgZW1wbG95bWVudGAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBzb3VyY2UgZW1wbG95bWVudCBkYXRhIHRoYXQgdXNlcnMgd2lsbCBiZSBwZXJtaXR0ZWQgdG8gc2hhcmUuIE9wdGlvbnMgaW5jbHVkZSBgYmFua2AgYW5kIGBwYXlyb2xsYC4gQ3VycmVudGx5IHlvdSBjYW4gb25seSBzcGVjaWZ5IG9uZSBvZiB0aGVzZSBvcHRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxFbXBsb3ltZW50U291cmNlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50XG4gICAgICovXG4gICAgZW1wbG95bWVudF9zb3VyY2VfdHlwZXM/OiBBcnJheTxFbXBsb3ltZW50U291cmNlVHlwZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3RFbXBsb3ltZW50QmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEVtcGxveW1lbnRcbiAgICAgKi9cbiAgICBiYW5rX2VtcGxveW1lbnQ/OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWU7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggQmFuayBFbXBsb3ltZW50LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBlbXBsb3ltZW50YCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgZW1wbG95bWVudF9zb3VyY2VfdHlwZXNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSBCYW5rIEVtcGxveW1lbnQgcHJvZHVjdC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0RW1wbG95bWVudEJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZDogbnVtYmVyO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9uIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SWRlbnRpdHlWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHRlbXBsYXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGNvbnNlbnQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgZmxhZyBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGVuZCB1c2VyIGhhcyBhbHJlYWR5IGFncmVlZCB0byBhIHByaXZhY3kgcG9saWN5IHNwZWNpZnlpbmcgdGhhdCB0aGVpciBkYXRhIHdpbGwgYmUgc2hhcmVkIHdpdGggUGxhaWQgZm9yIHZlcmlmaWNhdGlvbiBwdXJwb3Nlcy4gIElmIGBnYXZlX2NvbnNlbnRgIGlzIHNldCB0byBgdHJ1ZWAsIHRoZSBgYWNjZXB0X3Rvc2Agc3RlcCB3aWxsIGJlIG1hcmtlZCBhcyBgc2tpcHBlZGAgYW5kIHRoZSBlbmQgdXNlclxcJ3Mgc2Vzc2lvbiB3aWxsIHN0YXJ0IGF0IHRoZSBuZXh0IHN0ZXAgcmVxdWlyZW1lbnQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJZGVudGl0eVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGdhdmVfY29uc2VudD86IGJvb2xlYW47XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIEluY29tZSBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBpbmNvbWVfdmVyaWZpY2F0aW9uYCBpcyBpbmNsdWRlZCBpbiB0aGUgYHByb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbl9pZGAgb2YgdGhlIHZlcmlmaWNhdGlvbiBpbnN0YW5jZSwgYXMgcHJvdmlkZWQgYnkgYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAuIFJlcGxhY2VkIGJ5IHRoZSB1c2VyIHRva2VuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV92ZXJpZmljYXRpb25faWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhc3NldF9yZXBvcnRfaWRgIG9mIGFuIGFzc2V0IHJlcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIsIGFzIHByb3ZpZGVkIGJ5IGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuIFByb3ZpZGluZyBhbiBgYXNzZXRfcmVwb3J0X2lkYCBpcyBvcHRpb25hbCBhbmQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSB1c2VyIHRocm91Z2ggYSBzdHJlYW1saW5lZCBmbG93LiBJZiBwcm92aWRlZCwgdGhlIGJhbmsgbGlua2luZyBmbG93IHdpbGwgYmUgc2tpcHBlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgYXNzZXRfcmVwb3J0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGFjY2VzcyB0b2tlbnMgY29ycmVzcG9uZGluZyB0byBJdGVtcyB0aGF0IGEgdXNlciBoYXMgcHJldmlvdXNseSBjb25uZWN0ZWQgd2l0aC4gRGF0YSBmcm9tIHRoZXNlIGluc3RpdHV0aW9ucyB3aWxsIGJlIGNyb3NzLXJlZmVyZW5jZWQgd2l0aCBkb2N1bWVudCBkYXRhIHJlY2VpdmVkIGR1cmluZyB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cgdG8gaGVscCB2ZXJpZnkgdGhhdCB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGFyZSBhY2N1cmF0ZS4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIHByb2R1Y3Qgd2FzIG5vdCBpbml0aWFsaXplZCBmb3IgdGhlc2UgSXRlbXMgZHVyaW5nIGxpbmssIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgYWZ0ZXIgdGhpcyBMaW5rIHNlc3Npb24uICBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgd2l0aCB0aGUgYHBheXJvbGxgIGluY29tZSBzb3VyY2UgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZXMgb2Ygc291cmNlIGluY29tZSBkYXRhIHRoYXQgdXNlcnMgd2lsbCBiZSBwZXJtaXR0ZWQgdG8gc2hhcmUuIE9wdGlvbnMgaW5jbHVkZSBgYmFua2AgYW5kIGBwYXlyb2xsYC4gQ3VycmVudGx5IHlvdSBjYW4gb25seSBzcGVjaWZ5IG9uZSBvZiB0aGVzZSBvcHRpb25zLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIGluY29tZV9zb3VyY2VfdHlwZXM/OiBBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Tb3VyY2VUeXBlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBheXJvbGxfaW5jb21lPzogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWU7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHVzZXIgc3RhdGVkIGluY29tZSBzb3VyY2VzXG4gICAgICogQHR5cGUge0FycmF5PExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXRlZF9pbmNvbWVfc291cmNlcz86IEFycmF5PExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlPjtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBwcm9kdWN0c2AgYXJyYXkgYW5kIGBiYW5rYCBpcyBzcGVjaWZpZWQgaW4gYGluY29tZV9zb3VyY2VfdHlwZXNgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgb2YgZGF0YSB0byByZXF1ZXN0IGZvciB0aGUgQmFuayBJbmNvbWUgcHJvZHVjdFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBtdWx0aXBsZSBJdGVtcyB0byBiZSBhZGRlZCBpbiB0aGUgTGluayBzZXNzaW9uLiBUaGlzIHNldHRpbmcgaXMgZGVwcmVjYXRlZCBhbmQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIG1vcmUgZ2VuZXJhbCBgZW5hYmxlX211bHRpX2l0ZW1fbGlua2Agc2V0dGluZywgd2hpY2ggc3VwcG9ydHMgYWxsIHByb2R1Y3RzLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgZW5hYmxlX211bHRpcGxlX2l0ZW1zPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggUGF5cm9sbCBJbmNvbWUgKGluY2x1ZGluZyBEb2N1bWVudCBJbmNvbWUpLiBGdXJ0aGVyIGN1c3RvbWl6YXRpb24gb3B0aW9ucyBmb3IgRG9jdW1lbnQgSW5jb21lLCBzdWNoIGFzIGN1c3RvbWl6aW5nIHdoaWNoIGRvY3VtZW50IHR5cGVzIG1heSBiZSB1cGxvYWRlZCwgYXJlIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgW0xpbmsgQ3VzdG9taXphdGlvbiBwYW5lXShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vbGluaykgaW4gdGhlIERhc2hib2FyZC4gKFJlcXVpcmVzIFByb2R1Y3Rpb24gZW5hYmxlbWVudC4pXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25QYXlyb2xsSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlcyBvZiBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24gdG8gZW5hYmxlIGZvciB0aGUgTGluayBzZXNzaW9uLiBJZiBub25lIGFyZSBzcGVjaWZpZWQsIHRoZW4gdXNlcnMgd2lsbCBzZWUgYm90aCBkb2N1bWVudCBhbmQgZGlnaXRhbCBwYXlyb2xsIGluY29tZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBmbG93X3R5cGVzPzogQXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEZsb3dUeXBlPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIExpbmsgdG9rZW4gd2lsbCBiZSB1c2VkIGZvciB1cGRhdGUgbW9kZS4gVGhpcyBmaWVsZCBpcyBvbmx5IHJlbGV2YW50IGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIFBheXJvbGwgSW5jb21lIFJlZnJlc2ggYmV0YS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBpc191cGRhdGVfbW9kZT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVW5pcXVlbHkgaWRlbnRpZnkgYSBwYXlyb2xsIGluY29tZSBJdGVtIHRvIHVwZGF0ZSB3aXRoLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHJlbGV2YW50IGZvciBwYXJ0aWNpcGFudHMgaW4gdGhlIFBheXJvbGwgSW5jb21lIFJlZnJlc2ggYmV0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uUGF5cm9sbEluY29tZVxuICAgICAqL1xuICAgIGl0ZW1faWRfdG9fdXBkYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZXMgb2YgYW5hbHlzaXMgdG8gZW5hYmxlIGZvciBkb2N1bWVudCB1cGxvYWRzLiBJZiB0aGlzIGZpZWxkIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBkb2NzIHdpbGwgdW5kZXJnbyBPQ1IgcGFyc2luZyBvbmx5LlxuICAgICAqIEB0eXBlIHtBcnJheTxJbmNvbWVWZXJpZmljYXRpb25Eb2NQYXJzaW5nQ29uZmlnPn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvblBheXJvbGxJbmNvbWVcbiAgICAgKi9cbiAgICBwYXJzaW5nX2NvbmZpZz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvbkRvY1BhcnNpbmdDb25maWc+IHwgbnVsbDtcbn1cbi8qKlxuICogU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluaXRpYWxpemluZyBMaW5rIGZvciB1c2Ugd2l0aCB0aGUgUGF5IEJ5IEJhbmsgZmxvdy4gVGhpcyBpcyBhbiBvcHRpb25hbCBmaWVsZCB0byBjb25maWd1cmUgdGhlIHVzZXIgZXhwZXJpZW5jZSwgYW5kIGN1cnJlbnRseSByZXF1aXJlcyB0aGUgYW1vdW50IGZpZWxkIHRvIGJlIHNldC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RQYXltZW50Q29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIgdGhhdCBwcm92aWRlcyB0aGUgcGF5bWVudCBjb250ZXh0LiBUaGUgbWF4IGxlbmd0aCBpcyAyNTYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFBheW1lbnRDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBpbml0aWFsaXppbmcgTGluayBmb3IgdXNlIHdpdGggdGhlIFBheW1lbnQgSW5pdGlhdGlvbiAoRXVyb3BlKSBwcm9kdWN0LiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIGBwYXltZW50X2luaXRpYXRpb25gIGlzIGluY2x1ZGVkIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LiBFaXRoZXIgYHBheW1lbnRfaWRgIG9yIGBjb25zZW50X2lkYCBtdXN0IGJlIHByb3ZpZGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGF5bWVudF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb25cbiAgICAgKi9cbiAgICBwYXltZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY29uc2VudF9pZGAgcHJvdmlkZWQgYnkgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0UGF5bWVudEluaXRpYXRpb25cbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBTdGF0ZW1lbnRzIHByb2R1Y3QuIFRoaXMgZmllbGQgaXMgcmVxdWlyZWQgZm9yIHRoZSBzdGF0ZW1lbnRzIHByb2R1Y3QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RTdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCBkYXRlIGZvciBzdGF0ZW1lbnRzLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBcXFwiWVlZWS1NTS1ERFxcXCIgZm9ybWF0LCBlLmcuIFxcXCIyMDIwLTEwLTMwXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0U3RhdGVtZW50c1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIFxcXCJZWVlZLU1NLUREXFxcIiBmb3JtYXQsIGUuZy4gXFxcIjIwMjAtMTAtMzBcXFwiLiBZb3UgY2FuIHJlcXVlc3QgdXAgdG8gdHdvIHllYXJzIG9mIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFN0YXRlbWVudHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIHVzZSB3aXRoIHRoZSBUcmFuc2ZlciBwcm9kdWN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaWRgIHJldHVybmVkIGJ5IHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RUcmFuc2ZlclxuICAgICAqL1xuICAgIGludGVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGlkYCByZXR1cm5lZCBieSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQuIFVzZWQgdG8gaW5kaWNhdGUgTGluayBzZXNzaW9uIHRvIGNvbXBsZXRlIHJlcXVpcmVkIHVzZXIgYWN0aW9uIGluIG9yZGVyIHRvIG1ha2UgYSBkZWNpc2lvbiBmb3IgdGhlIGF1dGhvcml6YXRpb24uIElmIHNldCwgYGFjY2Vzc190b2tlbmAgY2FuIGJlIG9taXR0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgcmV0dXJuZWQgYnkgdGhlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFRyYW5zZmVyXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIExpbmsgZm9yIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGUge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgZW5hYmxlcyBbdXBkYXRlIG1vZGUgd2l0aCBBY2NvdW50IFNlbGVjdF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLyN1c2luZy11cGRhdGUtbW9kZS10by1yZXF1ZXN0LW5ldy1hY2NvdW50cykgZm9yIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgYW5kIENhbmFkYSB0aGF0IGRvIG5vdCB1c2UgT0F1dGgsIG9yIHRoYXQgdXNlIE9BdXRoIGJ1dCBkbyBub3QgaGF2ZSB0aGVpciBvd24gYWNjb3VudCBzZWxlY3Rpb24gZmxvdy4gRm9yIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgdGhhdCBoYXZlIGFuIE9BdXRoIGFjY291bnQgc2VsZWN0aW9uIGZsb3cgKGkuZS4gbW9zdCBPQXV0aC1lbmFibGVkIGluc3RpdHV0aW9ucyksIHVwZGF0ZSBtb2RlIHdpdGggQWNjb3VudCBTZWxlY3Qgd2lsbCBhbHdheXMgYmUgZW5hYmxlZCwgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhpcyBmaWVsZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVwZGF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfc2VsZWN0aW9uX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEJ5IGRlZmF1bHQsIFBsYWlkIHdpbGwgZW5hYmxlIHRoZSByZWF1dGhvcml6YXRpb24gZmxvdyBkdXJpbmcgdXBkYXRlIG1vZGUgZm9yIGFuIEl0ZW0gZW5hYmxlZCBmb3IgW0RhdGEgVHJhbnNwYXJlbmN5IE1lc3NhZ2luZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2RhdGEtdHJhbnNwYXJlbmN5LW1lc3NhZ2luZy1taWdyYXRpb24tZ3VpZGUvKSBpZiB0aGUgSXRlbSBleHBpcmVzIHdpdGhpbiBzaXggbW9udGhzLiBEdXJpbmcgYSByZWF1dGhvcml6YXRpb24gZmxvdywgYW4gZW5kIHVzZXIgd2lsbCByZXZpZXcgUGxhaWRcXCdzIGVuZCB1c2VyIHByaXZhY3kgcG9saWN5LCB1c2UgY2FzZSBhbmQgZGF0YSBzY29wZSBjb25zZW50cywgYW5kIGFjY291bnQgYWNjZXNzIGNvbnNlbnRzOyB0aGV5IG1heSBhbHNvIGJlIHJlcXVpcmVkIHRvIGxvZyBpbiB0byB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb25cXCdzIE9BdXRoIGZsb3cuIEFmdGVyIHRoZSBlbmQgdXNlciBzdWNjZXNzZnVsbHkgY29tcGxldGVzIHRoZSByZWF1dGhvcml6YXRpb24gZmxvdywgdGhlIEl0ZW1cXCdzIGV4cGlyYXRpb24gZGF0ZSB3aWxsIGJlIGV4dGVuZGVkIHRvIDEyIG1vbnRocyBmcm9tIHRoZSB0aW1lIHRoYXQgdGhlIHJlYXV0aG9yaXphdGlvbiB0b29rIHBsYWNlLiBUaGlzIGZpZWxkIGFsbG93cyB5b3UgdG8gb3B0aW9uYWxseSBvdmVycmlkZSB0aGUgZGVmYXVsdCByZWF1dGhvcml6YXRpb24gc2NoZWR1bGluZyBsb2dpYyB0byBlaXRoZXIgZm9yY2libHkgZW5hYmxlIG9yIGRpc2FibGUgdGhlIHJlYXV0aG9yaXphdGlvbiBmbG93IGZvciBhIGdpdmVuIHVwZGF0ZSBtb2RlIHNlc3Npb24uIFRoaXMgZmllbGQgZG9lcyBub3QgaW1wYWN0IHRoZSBmbG93IGZvciBJdGVtcyBhdCBpbnN0aXR1dGlvbnMgaW4gdGhlIEVVIG9yIFVLLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gICAgICovXG4gICAgcmVhdXRob3JpemF0aW9uX2VuYWJsZWQ/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgYSBgdXNlcl90b2tlbmAgbXVzdCBhbHNvIGJlIHByb3ZpZGVkLCBhbmQgTGluayB3aWxsIG9wZW4gaW4gdXBkYXRlIG1vZGUgZm9yIHRoZSBnaXZlbiB1c2VyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXBkYXRlXG4gICAgICovXG4gICAgdXNlcj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYGl0ZW1faWRgcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG8gYmUgdXBkYXRlZCBpbiB1cGRhdGUgbW9kZS4gSWYgZW1wdHkgb3IgYG51bGxgLCB0aGlzIGZpZWxkIHdpbGwgZGVmYXVsdCB0byBpbml0aWFsaXppbmcgdXBkYXRlIG1vZGUgZm9yIHRoZSBtb3N0IHJlY2VudCB1bmhlYWx0aHkgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIEEgYHVzZXJfdG9rZW5gIG11c3QgYWxzbyBiZSBwcm92aWRlZCB0byB1c2UgdGhpcyBmaWVsZC4gXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVcGRhdGVcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXIgd2hvIHdpbGwgYmUgbGlua2luZyB0aGVpciBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLiBJdCBpcyBjdXJyZW50bHkgdXNlZCBhcyBhIG1lYW5zIG9mIHNlYXJjaGluZyBsb2dzIGZvciB0aGUgZ2l2ZW4gdXNlciBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZnVsbCBsZWdhbCBuYW1lLCB1c2VkIGZvciBbbWljcm8tZGVwb3NpdCBiYXNlZCB2ZXJpZmljYXRpb24gZmxvd3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS8pLiBGb3IgYSBzbWFsbCBudW1iZXIgb2YgY3VzdG9tZXJzIG9uIGxlZ2FjeSBmbG93cywgcHJvdmlkaW5nIHRoaXMgZmllbGQgaXMgcmVxdWlyZWQgdG8gZW5hYmxlIG1pY3JvLWRlcG9zaXQtYmFzZWQgZmxvd3MuIEZvciBhbGwgb3RoZXIgY3VzdG9tZXJzLCB0aGlzIGZpZWxkIGlzIG9wdGlvbmFsLiBQcm92aWRpbmcgdGhlIHVzZXJcXCdzIG5hbWUgaW4gdGhpcyBmaWVsZCB3aGVuIHVzaW5nIG1pY3JvLWRlcG9zaXQtYmFzZWQgdmVyaWZpY2F0aW9uIHdpbGwgc3RyZWFtbGluZSB0aGUgZW5kIHVzZXIgZXhwZXJpZW5jZSwgYXMgdGhlIHVzZXIgd2lsbCBub3QgYmUgcHJvbXB0ZWQgdG8gZW50ZXIgdGhlaXIgbmFtZSBkdXJpbmcgdGhlIExpbmsgZmxvdzsgUGxhaWQgd2lsbCB1c2UgdGhlIHByb3ZpZGVkIGxlZ2FsIG5hbWUgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uUmVxdWVzdFVzZXJOYW1lfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIG5hbWU/OiBJZGVudGl0eVZlcmlmaWNhdGlvblJlcXVlc3RVc2VyTmFtZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyIGluIFtFLjE2NF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRS4xNjQpIGZvcm1hdC4gSWYgc3VwcGxpZWQsIHdpbGwgYmUgdXNlZCB3aGVuIGFwcGxpY2FibGUgdG8gcHJlZmlsbCBwaG9uZSBudW1iZXIgZmllbGRzIGluIExpbmsgZm9yIHRoZSBbcmV0dXJuaW5nIHVzZXIgZmxvd10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikgYW5kIHRoZSBbSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZsb3ddKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIHBob25lIG51bWJlciB3YXMgdmVyaWZpZWQgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRoaDptbTpzc1pgKS4gVGhpcyB3YXMgcHJldmlvdXNseSBhbiBvcHRpb25hbCBmaWVsZCB1c2VkIGluIHRoZSBbcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3JldHVybmluZy11c2VyKS4gVGhpcyBmaWVsZCBpcyBubyBsb25nZXIgcmVxdWlyZWQgdG8gZW5hYmxlIHRoZSByZXR1cm5pbmcgdXNlciBleHBlcmllbmNlLiAgIE9ubHkgcGFzcyBhIHZlcmlmaWNhdGlvbiB0aW1lIGZvciBhIHBob25lIG51bWJlciB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb27igJl0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJfdmVyaWZpZWRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuIENhbiBiZSB1c2VkIHRvIHByZWZpbGwgTGluayBmaWVsZHMgd2hlbiB1c2VkIHdpdGggW0lkZW50aXR5IFZlcmlmaWNhdGlvbl0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgdGhlIGVtYWlsIGFkZHJlc3Mgd2FzIHZlcmlmaWVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoYFlZWVktTU0tRERUaGg6bW06c3NaYCkuIFRoaXMgd2FzIHByZXZpb3VzbHkgYW4gb3B0aW9uYWwgZmllbGQgdXNlZCBpbiB0aGUgW3JldHVybmluZyB1c2VyIGV4cGVyaWVuY2VdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9yZXR1cm5pbmctdXNlcikuIFRoaXMgZmllbGQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIHRvIGVuYWJsZSB0aGUgcmV0dXJuaW5nIHVzZXIgZXhwZXJpZW5jZS4gICBPbmx5IHBhc3MgYSB2ZXJpZmljYXRpb24gdGltZSBmb3IgYW4gZW1haWwgYWRkcmVzcyB0aGF0IHlvdSBoYXZlIHZlcmlmaWVkLiBJZiB5b3UgaGF2ZSBwZXJmb3JtZWQgdmVyaWZpY2F0aW9uIGJ1dCBkb27igJl0IGhhdmUgdGhlIHRpbWUsIHlvdSBtYXkgc3VwcGx5IGEgc2lnbmFsIHZhbHVlIG9mIHRoZSBzdGFydCBvZiB0aGUgVU5JWCBlcG9jaC4gICBFeGFtcGxlOiBgMjAyMC0wMS0wMVQwMDowMDowMFpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3NfdmVyaWZpZWRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBhbmQgbm90IGN1cnJlbnRseSB1c2VkLCB1c2UgdGhlIGBpZF9udW1iZXJgIGZpZWxkIGluc3RlYWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNzbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUbyBiZSBwcm92aWRlZCBpbiB0aGUgZm9ybWF0IFxcXCJ5eXl5LW1tLWRkXFxcIi4gQ2FuIGJlIHVzZWQgdG8gcHJlZmlsbCBMaW5rIGZpZWxkcyB3aGVuIHVzZWQgd2l0aCBJZGVudGl0eSBWZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJcbiAgICAgKi9cbiAgICBkYXRlX29mX2JpcnRoPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFVzZXJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VySUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyXG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVXNlcklETnVtYmVyO1xufVxuLyoqXG4gKiBTcGVjaWZpZXMgdXNlciBzdGF0ZWQgaW5jb21lIHNvdXJjZXMgZm9yIHRoZSBJbmNvbWUgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZW1wbG95ZXIgY29ycmVzcG9uZGluZyB0byBhbiBpbmNvbWUgc291cmNlIHNwZWNpZmllZCBieSB0aGUgdXNlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgZW1wbG95ZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJTdGF0ZWRJbmNvbWVTb3VyY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIGFtb3VudCBwYWlkIHBlciBjeWNsZSBmb3IgYSBzcGVjaWZpZWQgaW5jb21lIHNvdXJjZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlcXVlc3RVc2VyU3RhdGVkSW5jb21lU291cmNlXG4gICAgICovXG4gICAgcGF5X3Blcl9jeWNsZT86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIGFtb3VudCBwYWlkIGFubnVhbGx5IGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfYW5udWFsPzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyU3RhdGVkSW5jb21lU291cmNlUGF5VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuQ3JlYXRlUmVxdWVzdFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBwYXlfdHlwZT86IFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0VXNlclN0YXRlZEluY29tZVNvdXJjZVxuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBVc2VyU3RhdGVkSW5jb21lU291cmNlRnJlcXVlbmN5O1xufVxuLyoqXG4gKiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBleHBpcmF0aW9uIGRhdGUgYW5kIHRpbWUgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC4gQnkgZGVmYXVsdCwgYSBgbGlua190b2tlbmAgY3JlYXRlZCB0byBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIHRoYXQgd2lsbCBiZSBleGNoYW5nZWQgZm9yIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGV4cGlyZXMgYWZ0ZXIgNCBob3VycywgYW5kIGEgYGxpbmtfdG9rZW5gIGNyZWF0ZWQgZm9yIGFuIGV4aXN0aW5nIEl0ZW0gKHN1Y2ggYXMgd2hlbiB1cGRhdGluZyBhbiBleGlzdGluZyBgYWNjZXNzX3Rva2VuYCBieSBsYXVuY2hpbmcgTGluayBpbiB1cGRhdGUgbW9kZSkgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBJZiB1c2luZyBbSG9zdGVkIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pLCB0aGUgYGxpbmtfdG9rZW5gIHdpbGwgZXhwaXJlIGF0IHRoZSBzYW1lIHRpbWUgYXMgdGhlIEhvc3RlZCBMaW5rIFVSTCwgYW5kIHlvdSBjYW4gY3VzdG9taXplIHRoZSBkdXJhdGlvbiB1c2luZyB0aGUgYGhvc3RlZF9saW5rLnVybF9saWZldGltZV9zZWNvbmRzYCBvcHRpb24gaW4gdGhlIHJlcXVlc3QuIElmIHVzaW5nIExpbmsgRGVsaXZlcnkgKGJldGEpLCB0aGUgYGxpbmtfdG9rZW5gIHdpbGwgZXhwaXJlIGJ5IGRlZmF1bHQgYWZ0ZXIgMjQgaG91cnMgaWYgc2VudCB2aWEgU01TIGFuZCBhZnRlciA3IGRheXMgaWYgc2VudCB2aWEgZW1haWwuIElmIHVzaW5nIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgTGluayB0b2tlbiBleHBpcmF0aW9uIHdpbGwgbm90IGJlIGVuZm9yY2VkOyBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gTGluayBzZXNzaW9uIGNhbiBiZSBjcmVhdGVkIHdpdGggYW4gZXhwaXJlZCBMaW5rIHRva2VuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZXhwaXJhdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIFVSTCBvZiBhIFBsYWlkLWhvc3RlZCBMaW5rIGZsb3cgdGhhdCB3aWxsIHVzZSB0aGUgTGluayB0b2tlbiByZXR1cm5lZCBieSB0aGlzIHJlcXVlc3QuIE9ubHkgcHJlc2VudCBpZiB0aGUgc2Vzc2lvbiBpcyBlbmFibGVkIGZvciBIb3N0ZWQgTGluay4gVG8gZW5hYmxlIHRoZSBzZXNzaW9uIGZvciBIb3N0ZWQgTGluaywgc2VuZCBhIGBob3N0ZWRfbGlua2Agb2JqZWN0IGluIHRoZSByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaG9zdGVkX2xpbmtfdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIEVVIGZsb3dzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkVVQ29uZmlnXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuRVVDb25maWcge1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgb3BlbiBMaW5rIHdpdGhvdXQgYW4gaW5pdGlhbCBVSS4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuRVVDb25maWdcbiAgICAgKi9cbiAgICBoZWFkbGVzcz86IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9iamVjdCBzcGVjaWZ5aW5nIHRoZSBhcmd1bWVudHMgb3JpZ2luYWxseSBwcm92aWRlZCB0byB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBgcHJvZHVjdHNgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5pdGlhbF9wcm9kdWN0czogQXJyYXk8UHJvZHVjdHM+O1xuICAgIC8qKlxuICAgICAqIFRoZSBgd2ViaG9va2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY291bnRyeV9jb2Rlc2Agc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtBcnJheTxDb3VudHJ5Q29kZT59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudHJ5X2NvZGVzOiBBcnJheTxDb3VudHJ5Q29kZT47XG4gICAgLyoqXG4gICAgICogVGhlIGBsYW5ndWFnZWAgc3BlY2lmaWVkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldE1ldGFkYXRhUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuQ3JlYXRlSW5zdGl0dXRpb25EYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fZGF0YT86IExpbmtUb2tlbkNyZWF0ZUluc3RpdHV0aW9uRGF0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEZpbHRlcnNSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfZmlsdGVycz86IEFjY291bnRGaWx0ZXJzUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGByZWRpcmVjdF91cmlgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X25hbWVgIHNwZWNpZmllZCBpbiB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRNZXRhZGF0YVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X25hbWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIExpbmtUb2tlbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBgbGlua190b2tlbmAgZnJvbSBhIHByZXZpb3VzIGludm9jYXRpb24gb2YgYC9saW5rL3Rva2VuL2NyZWF0ZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBMaW5rVG9rZW5HZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvbGluay90b2tlbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua1Rva2VuR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgYGxpbmtfdG9rZW5gLCB3aGljaCBjYW4gYmUgc3VwcGxpZWQgdG8gTGluayBpbiBvcmRlciB0byBpbml0aWFsaXplIGl0IGFuZCByZWNlaXZlIGEgYHB1YmxpY190b2tlbmAsIHdoaWNoIGNhbiBiZSBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGlua190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjcmVhdGlvbiB0aW1lc3RhbXAgZm9yIHRoZSBgbGlua190b2tlbmAsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gdGltZXN0YW1wIGZvciB0aGUgYGxpbmtfdG9rZW5gLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZm9ybWF0aW9uIGFib3V0IExpbmsgc2Vzc2lvbnMgY3JlYXRlZCB1c2luZyB0aGlzIGBsaW5rX3Rva2VuYC4gU2Vzc2lvbiBkYXRhIHdpbGwgYmUgcHJvdmlkZWQgZm9yIHVwIHRvIHNpeCBob3VycyBhZnRlciB0aGUgc2Vzc2lvbiBoYXMgZW5kZWQuXG4gICAgICogQHR5cGUge0FycmF5PExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2U+fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbnM/OiBBcnJheTxMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtZXRhZGF0YTogTGlua1Rva2VuR2V0TWV0YWRhdGFSZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgbGluayBzZXNzaW9uLiBTZXNzaW9uIGRhdGEgd2lsbCBiZSBwcm92aWRlZCBmb3IgdXAgdG8gc2l4IGhvdXJzIGFmdGVyIHRoZSBzZXNzaW9uIGhhcyBlbmRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgZm9yIHRoZSBsaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqL1xuICAgIGxpbmtfc2Vzc2lvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIGxpbmsgc2Vzc2lvbiB3YXMgZmlyc3Qgc3RhcnRlZCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGFydGVkX2F0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggdGhlIGxpbmsgc2Vzc2lvbiB3YXMgZmluaXNoZWQsIGlmIGF2YWlsYWJsZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBmaW5pc2hlZF9hdD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uU3VjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuR2V0U2Vzc2lvbnNSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb25fc3VjY2Vzcz86IExpbmtTZXNzaW9uU3VjY2VzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtTZXNzaW9uRXhpdERlcHJlY2F0ZWR9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9uX2V4aXQ/OiBMaW5rU2Vzc2lvbkV4aXREZXByZWNhdGVkIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TGlua1Nlc3Npb25FeGl0fVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5HZXRTZXNzaW9uc1Jlc3BvbnNlXG4gICAgICovXG4gICAgZXhpdD86IExpbmtTZXNzaW9uRXhpdCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBjdXN0b21lci1yZWxhdGVkIExpbmsgZXZlbnRzXG4gICAgICogQHR5cGUge0FycmF5PExpbmtFdmVudD59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICBldmVudHM/OiBBcnJheTxMaW5rRXZlbnQ+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaW5rU2Vzc2lvblJlc3VsdHN9XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkdldFNlc3Npb25zUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXN1bHRzPzogTGlua1Nlc3Npb25SZXN1bHRzIHwgbnVsbDtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkludmVzdG1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIGFsbG93IHNlbGYtY3VzdG9keSBjcnlwdG8gd2FsbGV0cyB0byBiZSBhZGRlZCB3aXRob3V0IHJlcXVpcmluZyBzaWduYXR1cmUgdmVyaWZpY2F0aW9uLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c1xuICAgICAqL1xuICAgIGFsbG93X3VudmVyaWZpZWRfY3J5cHRvX3dhbGxldHM/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIElmIGB0cnVlYCwgYWxsb3cgdXNlcnMgdG8gbWFudWFsbHkgZW50ZXIgSW52ZXN0bWVudHMgYWNjb3VudCBhbmQgaG9sZGluZ3MgaW5mb3JtYXRpb24uIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzXG4gICAgICovXG4gICAgYWxsb3dfbWFudWFsX2VudHJ5PzogYm9vbGVhbjtcbn1cbi8qKlxuICogQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGUgSW52ZXN0bWVudHMgTW92ZSBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aCB7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBzaG93IGluc3RpdHV0aW9ucyB0aGF0IHVzZSB0aGUgbWFudWFsIGVudHJ5IGZhbGxiYWNrIGZsb3cuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aFxuICAgICAqL1xuICAgIG1hbnVhbF9lbnRyeV9lbmFibGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCBzaG93IGluc3RpdHV0aW9ucyB0aGF0IHVzZSB0aGUgbWFza2VkIG51bWJlciBtYXRjaCBmYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVG9rZW5JbnZlc3RtZW50c0F1dGhcbiAgICAgKi9cbiAgICBtYXNrZWRfbnVtYmVyX21hdGNoX2VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHNob3cgaW5zdGl0dXRpb25zIHRoYXQgdXNlIHRoZSBzdGF0ZWQgYWNjb3VudCBudW1iZXIgZmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuSW52ZXN0bWVudHNBdXRoXG4gICAgICovXG4gICAgc3RhdGVkX2FjY291bnRfbnVtYmVyX2VuYWJsZWQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBgdHJ1ZWAsIHRoZSBmZWUgYW5kIGNvbnRyaWJ1dGlvbiBkZXRhaWxzIGZvciA0MDFrIGFjY291bnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIExpbmtUb2tlbkludmVzdG1lbnRzQXV0aFxuICAgICAqL1xuICAgIHJvbGxvdmVyXzQwMWtfZW5hYmxlZD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBDb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVG9rZW5UcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rVG9rZW5UcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdG8gcmVxdWVzdCBmb3IgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBUaGUgbW9yZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlcXVlc3RlZCwgdGhlIGxvbmdlciB0aGUgaGlzdG9yaWNhbCB1cGRhdGUgcG9sbCB3aWxsIHRha2UuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDkwIGRheXMuIElmIGEgdmFsdWUgdW5kZXIgMzAgaXMgcHJvdmlkZWQsIGEgbWluaW11bSBvZiAzMCBkYXlzIG9mIGhpc3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQuIE9uY2UgVHJhbnNhY3Rpb25zIGhhcyBiZWVuIGFkZGVkIHRvIGFuIEl0ZW0sIHRoaXMgdmFsdWUgY2Fubm90IGJlIHVwZGF0ZWQuICBDdXN0b21lcnMgdXNpbmcgW1JlY3VycmluZyBUcmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zcmVjdXJyaW5nZ2V0KSBzaG91bGQgcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IGZvciBvcHRpbWFsIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTGlua1Rva2VuVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFdlYmhvb2sgaW5kaWNhdGluZyB0aGF0IHRoZSBzdGF0dXMgb2YgdGhlIGRlbGl2ZXJ5IG9mIHRoZSBIb3N0ZWQgTGluayBzZXNzaW9uIHRvIGEgdXNlclxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgTElOS19ERUxJVkVSWWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBERUxJVkVSWV9TVEFUVVNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTGlua1VzZXJEZWxpdmVyeVN0YXR1c1dlYmhvb2tcbiAgICAgKi9cbiAgICBsaW5rX2RlbGl2ZXJ5X3Nlc3Npb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExpbmtVc2VyRGVsaXZlcnlTdGF0dXNXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xpbmtEZWxpdmVyeU1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBMaW5rVXNlckRlbGl2ZXJ5U3RhdHVzV2ViaG9va1xuICAgICAqL1xuICAgIGxpbmtfZGVsaXZlcnlfbWV0YWRhdGE6IExpbmtEZWxpdmVyeU1ldGFkYXRhO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBhIG1vcnRnYWdlIGxvYW4gYWdyZWVtZW50IGJldHdlZW4gb25lIG9yIG1vcmUgYm9ycm93ZXJzIGFuZCBhIG1vcnRnYWdlIGxlbmRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hblxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW4ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuSWRlbnRpZmllcnN9XG4gICAgICogQG1lbWJlcm9mIExvYW5cbiAgICAgKi9cbiAgICBMT0FOX0lERU5USUZJRVJTOiBMb2FuSWRlbnRpZmllcnM7XG59XG4vKipcbiAqIFZhbGlkIGFjY291bnQgc3VidHlwZXMgZm9yIGxvYW4gYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1sb2FuKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIExvYW5BY2NvdW50U3VidHlwZSB7XG4gICAgQXV0byA9ICdhdXRvJyxcbiAgICBCdXNpbmVzcyA9ICdidXNpbmVzcycsXG4gICAgQ29tbWVyY2lhbCA9ICdjb21tZXJjaWFsJyxcbiAgICBDb25zdHJ1Y3Rpb24gPSAnY29uc3RydWN0aW9uJyxcbiAgICBDb25zdW1lciA9ICdjb25zdW1lcicsXG4gICAgSG9tZUVxdWl0eSA9ICdob21lIGVxdWl0eScsXG4gICAgTG9hbiA9ICdsb2FuJyxcbiAgICBNb3J0Z2FnZSA9ICdtb3J0Z2FnZScsXG4gICAgTGluZU9mQ3JlZGl0ID0gJ2xpbmUgb2YgY3JlZGl0JyxcbiAgICBTdHVkZW50ID0gJ3N0dWRlbnQnLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBBbGwgPSAnYWxsJ1xufVxuXG4vKipcbiAqIEEgZmlsdGVyIHRvIGFwcGx5IHRvIGBsb2FuYC10eXBlIGFjY291bnRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5GaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuRmlsdGVyIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IHN1YnR5cGVzIHRvIGRpc3BsYXkgaW4gTGluay4gSWYgbm90IHNwZWNpZmllZCwgYWxsIGFjY291bnQgc3VidHlwZXMgd2lsbCBiZSBzaG93bi4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8TG9hbkFjY291bnRTdWJ0eXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbkZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PExvYW5BY2NvdW50U3VidHlwZT47XG59XG4vKipcbiAqIFRoZSBpbmZvcm1hdGlvbiB1c2VkIHRvIGlkZW50aWZ5IHRoaXMgbG9hbiBieSB2YXJpb3VzIHBhcnRpZXMgdG8gdGhlIHRyYW5zYWN0aW9uIG9yIG90aGVyIG9yZ2FuaXphdGlvbnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIExvYW5JZGVudGlmaWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgaWRlbnRpZmllciBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvYW5JZGVudGlmaWVyXG4gICAgICovXG4gICAgTG9hbklkZW50aWZpZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5JZGVudGlmaWVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgTG9hbklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBMb2FuSWRlbnRpZmllclR5cGU6IExvYW5JZGVudGlmaWVyVHlwZSB8IG51bGw7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIHByZXNjcmliZWQgbGlzdCB0aGF0IHNwZWNpZmllcyB0aGUgdHlwZSBvZiBsb2FuIGlkZW50aWZpZXIuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBMb2FuSWRlbnRpZmllclR5cGUge1xuICAgIExlbmRlckxvYW4gPSAnTGVuZGVyTG9hbicsXG4gICAgVW5pdmVyc2FsTG9hbiA9ICdVbml2ZXJzYWxMb2FuJ1xufVxuXG4vKipcbiAqIENvbGxlY3Rpb24gb2YgY3VycmVudCBhbmQgcHJldmlvdXMgaWRlbnRpZmllcnMgZm9yIHRoaXMgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9hbklkZW50aWZpZXJzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9hbklkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5JZGVudGlmaWVyc1xuICAgICAqL1xuICAgIExPQU5fSURFTlRJRklFUjogTG9hbklkZW50aWZpZXI7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHRoZSBudW1iZXIgb2YgbG9hbiBwYXltZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuUGF5bWVudHNDb3VudHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FuUGF5bWVudHNDb3VudHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbG9hbiBwYXltZW50cyBtYWRlIGluIHRoZSAzMCBkYXlzIGJlZm9yZSB0aGUgc3Vic2NyaXB0aW9uIGRhdGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNDb3VudHNcbiAgICAgKi9cbiAgICBiYXNlbGluZV9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW50IG51bWJlciBvZiBsb2FuIHBheW1lbnRzIG1hZGUgaW4gdGhlIGxhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvYW5QYXltZW50c0NvdW50c1xuICAgICAqL1xuICAgIGN1cnJlbnRfY291bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgdGhlIG51bWJlciBvZiB1bmlxdWUgbG9hbiBwYXltZW50IG1lcmNoYW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBMb2FuUGF5bWVudHNNZXJjaGFudENvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIExvYW5QYXltZW50c01lcmNoYW50Q291bnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHVuaXF1ZSBsb2FuIHBheW1lbnQgbWVyY2hhbnRzIGRldGVjdGVkIGluIHRoZSAzMCBkYXlzIGJlZm9yZSB0aGUgc3Vic2NyaXB0aW9uIGRhdGVcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNNZXJjaGFudENvdW50c1xuICAgICAqL1xuICAgIGJhc2VsaW5lX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbnQgbnVtYmVyIG9mIHVuaXF1ZSBsb2FuIHBheW1lbnQgbWVyY2hhbnRzIGRldGVjdGVkIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBMb2FuUGF5bWVudHNNZXJjaGFudENvdW50c1xuICAgICAqL1xuICAgIGN1cnJlbnRfY291bnQ6IG51bWJlcjtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGxvYW5zIHRoYXQgYXJlIHBhcnQgb2YgYSBzaW5nbGUgZGVhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9hbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2FucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW59XG4gICAgICogQG1lbWJlcm9mIExvYW5zXG4gICAgICovXG4gICAgTE9BTjogTG9hbjtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiB3aGVyZSBhIHRyYW5zYWN0aW9uIHRvb2sgcGxhY2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTG9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmVldCBhZGRyZXNzIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBMb2NhdGlvblxuICAgICAqL1xuICAgIGFkZHJlc3M6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNpdHkgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGBzdGF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIHdoZXJlIHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0aXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbGF0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsb25naXR1ZGUgd2hlcmUgdGhlIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIExvY2F0aW9uXG4gICAgICovXG4gICAgbG9uOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBkZWZpbmVkIHN0b3JlIG51bWJlciB3aGVyZSB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTG9jYXRpb25cbiAgICAgKi9cbiAgICBzdG9yZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgbXVsdGktZmFjdG9yIGF1dGhlbnRpY2F0aW9uIHNldHRpbmdzIHRvIHVzZSB3aXRoIHRoaXMgdGVzdCBhY2NvdW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1GQVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1GQSB7XG4gICAgLyoqXG4gICAgICogUG9zc2libGUgdmFsdWVzIGFyZSBgZGV2aWNlYCwgYHNlbGVjdGlvbnNgLCBvciBgcXVlc3Rpb25zYC4gIElmIHZhbHVlIGlzIGBkZXZpY2VgLCB0aGUgTUZBIGFuc3dlciBpcyBgMTIzNGAuICBJZiB2YWx1ZSBpcyBgc2VsZWN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzIGFsd2F5cyB0aGUgZmlyc3Qgb3B0aW9uLiAgSWYgdmFsdWUgaXMgYHF1ZXN0aW9uc2AsIHRoZSBNRkEgYW5zd2VyIGlzICBgYW5zd2VyXzxpPl88aj5gIGZvciB0aGUgai10aCBxdWVzdGlvbiBpbiB0aGUgaS10aCByb3VuZCwgc3RhcnRpbmcgZnJvbSAwLiBGb3IgZXhhbXBsZSwgdGhlIGFuc3dlciB0byB0aGUgZmlyc3QgcXVlc3Rpb24gaW4gdGhlIHNlY29uZCByb3VuZCBpcyBgYW5zd2VyXzFfMGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2YgcXVlc3Rpb25zLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHF1ZXN0aW9uX3JvdW5kczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBxdWVzdGlvbnMgcGVyIHJvdW5kLiBSZXF1aXJlZCBpZiB2YWx1ZSBvZiBgdHlwZWAgaXMgYHF1ZXN0aW9uc2AuIElmIHZhbHVlIG9mIHR5cGUgaXMgYHNlbGVjdGlvbnNgLCBkZWZhdWx0IHZhbHVlIGlzIDIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgcXVlc3Rpb25zX3Blcl9yb3VuZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiByb3VuZHMgb2Ygc2VsZWN0aW9ucywgdXNlZCBpZiBgdHlwZWAgaXMgYHNlbGVjdGlvbnNgLiBEZWZhdWx0cyB0byAxLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1GQVxuICAgICAqL1xuICAgIHNlbGVjdGlvbl9yb3VuZHM6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgYXZhaWxhYmxlIGFuc3dlcnMgcGVyIHF1ZXN0aW9uLCB1c2VkIGlmIGB0eXBlYCBpcyBgc2VsZWN0aW9uYC4gRGVmYXVsdHMgdG8gMi4gXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTUZBXG4gICAgICovXG4gICAgc2VsZWN0aW9uc19wZXJfcXVlc3Rpb246IG51bWJlcjtcbn1cbi8qKlxuICogU3VtbWFyeSBvYmplY3QgcmVmbGVjdGluZyB0aGUgbWF0Y2ggcmVzdWx0IG9mIHRoZSBhc3NvY2lhdGVkIGRhdGFcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWF0Y2hTdW1tYXJ5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWF0Y2hTdW1tYXJ5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgTWF0Y2hTdW1tYXJ5XG4gICAgICovXG4gICAgc3VtbWFyeTogTWF0Y2hTdW1tYXJ5Q29kZTtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSBtYXRjaCB0eXBlIGJldHdlZW4gZGF0YSBwcm92aWRlZCBieSB1c2VyIGFuZCBkYXRhIGNoZWNrZWQgYWdhaW5zdCBhbiBleHRlcm5hbCBkYXRhIHNvdXJjZS4gICBgbWF0Y2hgIGluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhIHdhcyBhIHN0cm9uZyBtYXRjaCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuICBgcGFydGlhbF9tYXRjaGAgaW5kaWNhdGVzIHRoZSBkYXRhIGFwcHJveGltYXRlbHkgbWF0Y2hlZCBhZ2FpbnN0IGV4dGVybmFsIGRhdGEuIEZvciBleGFtcGxlLCBcXFwiS25vcGVcXFwiIHZzLiBcXFwiS25vcGUtV3lhdHRcXFwiIGZvciBsYXN0IG5hbWUuICBgbm9fbWF0Y2hgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyBhYmxlIHRvIHBlcmZvcm0gYSBjaGVjayBhZ2FpbnN0IGFuIGV4dGVybmFsIGRhdGEgc291cmNlIGFuZCBpdCBkaWQgbm90IG1hdGNoIHRoZSBwcm92aWRlZCBpbnB1dCBkYXRhLiAgYG5vX2RhdGFgIGluZGljYXRlcyB0aGF0IFBsYWlkIHdhcyB1bmFibGUgdG8gZmluZCBleHRlcm5hbCBkYXRhIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YS4gIGBub19pbnB1dGAgaW5kaWNhdGVzIHRoYXQgUGxhaWQgd2FzIHVuYWJsZSB0byBwZXJmb3JtIGEgY2hlY2sgYmVjYXVzZSBubyBpbmZvcm1hdGlvbiB3YXMgcHJvdmlkZWQgZm9yIHRoaXMgZmllbGQgYnkgdGhlIGVuZCB1c2VyLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gTWF0Y2hTdW1tYXJ5Q29kZSB7XG4gICAgTWF0Y2ggPSAnbWF0Y2gnLFxuICAgIFBhcnRpYWxNYXRjaCA9ICdwYXJ0aWFsX21hdGNoJyxcbiAgICBOb01hdGNoID0gJ25vX21hdGNoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YScsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBJbnNpZ2h0cyBpbnRvIGEgdXNlcuKAmXMgdG9wIG1lcmNoYW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWVyY2hhbnRJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lcmNoYW50SW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBpZCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBlbnRpdHlfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIG1lcmNoYW50IG9mIHRoaXMgdHlwZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25fY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lcmNoYW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1lcmNoYW50SW5zaWdodHNcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X3ByaW1hcnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRldGFpbGVkIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVyY2hhbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfZGV0YWlsZWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIG91dGZsb3cgYW1vdW50cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNZXJjaGFudEluc2lnaHRzXG4gICAgICovXG4gICAgdG90YWxfb3V0Zmxvd3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgaW5mbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWVyY2hhbnRJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX2luZmxvd3M6IG51bWJlcjtcbn1cbi8qKlxuICogQWxsb3dzIHNwZWNpZnlpbmcgdGhlIG1ldGFkYXRhIG9mIHRoZSB0ZXN0IGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1ldGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50XFwncyBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1ldGFcbiAgICAgKi9cbiAgICBvZmZpY2lhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIGxpbWl0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnRcXCdzIG1hc2suIFNob3VsZCBiZSBhbiBlbXB0eSBzdHJpbmcgb3IgYSBzdHJpbmcgb2YgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBUaGlzIGFsbG93cyB5b3UgdG8gbW9kZWwgYSBtYXNrIHdoaWNoIGRvZXMgbm90IG1hdGNoIHRoZSBhY2NvdW50IG51bWJlciAoc3VjaCBhcyB3aXRoIGEgdmlydHVhbCBhY2NvdW50IG51bWJlcikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTWV0YVxuICAgICAqL1xuICAgIG1hc2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSByZWFzb24geW91IGFyZSBnZW5lcmF0aW5nIGEgQ29uc3VtZXIgUmVwb3J0IGZvciB0aGlzIHVzZXIuICAgYEFDQ09VTlRfUkVWSUVXX0NSRURJVGA6IEluIGNvbm5lY3Rpb24gd2l0aCBhIGNvbnN1bWVyIGNyZWRpdCB0cmFuc2FjdGlvbiBmb3IgdGhlIHJldmlldyBvciBjb2xsZWN0aW9uIG9mIGFuIGFjY291bnQgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgzKShBKS4gIGBXUklUVEVOX0lOU1RSVUNUSU9OX09USEVSYDogSW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB3cml0dGVuIGluc3RydWN0aW9ucyBvZiB0aGUgY29uc3VtZXIgcHVyc3VhbnQgdG8gRkNSQSBTZWN0aW9uIDYwNChhKSgyKSwgc3VjaCBhcyB3aGVuIGFuIGluZGl2aWR1YWwgYWdyZWVzIHRvIGFjdCBhcyBhIGd1YXJhbnRvciBvciBhc3N1bWVzIHBlcnNvbmFsIGxpYWJpbGl0eSBmb3IgYSBjb25zdW1lciwgYnVzaW5lc3MsIG9yIGNvbW1lcmNpYWwgbG9hbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE1vbml0b3JpbmdDb25zdW1lclJlcG9ydFBlcm1pc3NpYmxlUHVycG9zZSB7XG4gICAgQWNjb3VudFJldmlld0NyZWRpdCA9ICdBQ0NPVU5UX1JFVklFV19DUkVESVQnLFxuICAgIFdyaXR0ZW5JbnN0cnVjdGlvbk90aGVyID0gJ1dSSVRURU5fSU5TVFJVQ1RJT05fT1RIRVInXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgaW5jb21lIHN1YmNhdGVnb3J5IG9mIHRoZSByZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWxNb250aGx5SW5jb21lSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIHRvdGFsX21vbnRobHlfaW5jb21lOiBUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lU291cmNlc0NvdW50c31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZXNfY291bnRzOiBJbmNvbWVTb3VyY2VzQ291bnRzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtGb3JlY2FzdGVkTW9udGhseUluY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgZm9yZWNhc3RlZF9tb250aGx5X2luY29tZTogRm9yZWNhc3RlZE1vbnRobHlJbmNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0hpc3RvcmljYWxBbm51YWxJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGhpc3RvcmljYWxfYW5udWFsX2luY29tZTogSGlzdG9yaWNhbEFubnVhbEluY29tZTtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5jb21lIHNvdXJjZXMgZm9yIHRoaXMgSXRlbS4gRWFjaCBlbnRyeSBpbiB0aGUgYXJyYXkgaXMgYSBzaW5nbGUgaW5jb21lIHNvdXJjZVxuICAgICAqIEB0eXBlIHtBcnJheTxNb25pdG9yaW5nSW5jb21lU291cmNlPn1cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZXM6IEFycmF5PE1vbml0b3JpbmdJbmNvbWVTb3VyY2U+O1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGFuIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9uaXRvcmluZ0luY29tZVNvdXJjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdJbmNvbWVTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGFuIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lU291cmNlXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IGNvbW1vbiBuYW1lIG9yIG9yaWdpbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgdW5kZXJseWluZyBpbmNvbWUgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luY29tZVNvdXJjZVxuICAgICAqL1xuICAgIGluY29tZV9kZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDcmVkaXRCYW5rSW5jb21lQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbmNvbWVTb3VyY2VcbiAgICAgKi9cbiAgICBpbmNvbWVfY2F0ZWdvcnk6IENyZWRpdEJhbmtJbmNvbWVDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCBkZXRlY3RlZCB0cmFuc2FjdGlvbiBkYXRlIGZvciB0aGlzIGluY29tZSBzb3VyY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5jb21lU291cmNlXG4gICAgICovXG4gICAgbGFzdF90cmFuc2FjdGlvbl9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIE1vbml0b3JpbmcgSW5zaWdodHMgZm9yIHRoZSBnaXZlbiBJdGVtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE1vbml0b3JpbmdJbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbmNvbWVJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzXG4gICAgICovXG4gICAgaW5jb21lOiBNb25pdG9yaW5nSW5jb21lSW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdMb2FuSW5zaWdodHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c1xuICAgICAqL1xuICAgIGxvYW5zOiBNb25pdG9yaW5nTG9hbkluc2lnaHRzO1xufVxuLyoqXG4gKiBBbiBvYmplY3Qgd2l0aCBkZXRhaWxzIG9mIHRoZSBNb25pdG9yaW5nIEluc2lnaHRzIEl0ZW1cXCdzIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9uaXRvcmluZ0luc2lnaHRzSXRlbVN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb25pdG9yaW5nSXRlbVN0YXR1c0NvZGV9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c0l0ZW1TdGF0dXNcbiAgICAgKi9cbiAgICBzdGF0dXNfY29kZTogTW9uaXRvcmluZ0l0ZW1TdGF0dXNDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgcmVhc29uIGZvciB3aHkgYSBNb25pdG9yaW5nIEluc2lnaHRzIFJlcG9ydCBpcyBub3QgYXZhaWxhYmxlLiBUaGlzIGZpZWxkIHdpbGwgb25seSBiZSBwb3B1bGF0ZWQgd2hlbiB0aGUgYHN0YXR1c19jb2RlYCBpcyBub3QgYEFWQUlMQUJMRWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNJdGVtU3RhdHVzXG4gICAgICovXG4gICAgcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRW51bSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgaW5zaWdodHNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE1vbml0b3JpbmdJbnNpZ2h0c1N0YXR1cyB7XG4gICAgQXZhaWxhYmxlID0gJ0FWQUlMQUJMRScsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCcsXG4gICAgUGVuZGluZyA9ICdQRU5ESU5HJyxcbiAgICBVbnN1cHBvcnRlZCA9ICdVTlNVUFBPUlRFRCcsXG4gICAgVW5oZWFsdGh5ID0gJ1VOSEVBTFRIWSdcbn1cblxuLyoqXG4gKiBGb3IgZWFjaCB1c2VyIGVuYWJsZWQgZm9yIENhc2ggRmxvdyBVcGRhdGVzLCB0aGlzIHdlYmhvb2sgd2lsbCBmaXJlIGV2ZXJ5IGRheSB3aXRoIGluZm9ybWF0aW9uIG9uIHRoZSBzdGF0dXMgb2YgdGhlIHVwZGF0ZS4gVXBvbiByZWNlaXZpbmcgdGhlIHdlYmhvb2ssIGNhbGwgYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9nZXRgIHRvIHJldHJpZXZlIHRoZSB1cGRhdGVkIGluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb25pdG9yaW5nSW5zaWdodHNXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ0luc2lnaHRzV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYENSQV9NT05JVE9SSU5HYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdJbnNpZ2h0c1dlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgSU5TSUdIVFNfVVBEQVRFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01vbml0b3JpbmdJbnNpZ2h0c1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHN0YXR1czogTW9uaXRvcmluZ0luc2lnaHRzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb24gZm9yIHdoeSBpbnNpZ2h0cyBtYXkgbm90IGJlIGBBVkFJTEFCTEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHJlYXNvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGB1c2VyX2lkYCB0aGF0IHRoZSByZXBvcnQgaXMgYXNzb2NpYXRlZCB3aXRoXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9uaXRvcmluZ0luc2lnaHRzV2ViaG9va1xuICAgICAqL1xuICAgIHVzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nSW5zaWdodHNXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRW51bSBmb3IgdGhlIHN0YXR1cyBvZiB0aGUgSXRlbVxcJ3MgaW5zaWdodHNcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE1vbml0b3JpbmdJdGVtU3RhdHVzQ29kZSB7XG4gICAgQXZhaWxhYmxlID0gJ0FWQUlMQUJMRScsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCcsXG4gICAgUGVuZGluZyA9ICdQRU5ESU5HJyxcbiAgICBJdGVtTm90U3VwcG9ydGVkID0gJ0lURU1fTk9UX1NVUFBPUlRFRCcsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBsb2FuIGV4cG9zdXJlIHN1YmNhdGVnb3J5IG9mIHRoZSByZXBvcnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9uaXRvcmluZ0xvYW5JbnNpZ2h0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdMb2FuSW5zaWdodHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMb2FuUGF5bWVudHNDb3VudHN9XG4gICAgICogQG1lbWJlcm9mIE1vbml0b3JpbmdMb2FuSW5zaWdodHNcbiAgICAgKi9cbiAgICBsb2FuX3BheW1lbnRzX2NvdW50czogTG9hblBheW1lbnRzQ291bnRzO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbG9hbiBkaXNidXJzZW1lbnRzIGRldGVjdGVkIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nTG9hbkluc2lnaHRzXG4gICAgICovXG4gICAgbG9hbl9kaXNidXJzZW1lbnRzX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0xvYW5QYXltZW50c01lcmNoYW50Q291bnRzfVxuICAgICAqIEBtZW1iZXJvZiBNb25pdG9yaW5nTG9hbkluc2lnaHRzXG4gICAgICovXG4gICAgbG9hbl9wYXltZW50X21lcmNoYW50c19jb3VudHM6IExvYW5QYXltZW50c01lcmNoYW50Q291bnRzO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgaW50ZXJlc3QgcmF0ZSBmb3IgdGhlIG1vcnRnYWdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZUludGVyZXN0UmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlSW50ZXJlc3RSYXRlIHtcbiAgICAvKipcbiAgICAgKiBQZXJjZW50YWdlIHZhbHVlIChpbnRlcmVzdCByYXRlIG9mIGN1cnJlbnQgbW9ydGdhZ2UsIG5vdCBBUFIpIG9mIGludGVyZXN0IHBheWFibGUgb24gYSBsb2FuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlSW50ZXJlc3RSYXRlXG4gICAgICovXG4gICAgcGVyY2VudGFnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiBpbnRlcmVzdCBjaGFyZ2VkIChmaXhlZCBvciB2YXJpYWJsZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VJbnRlcmVzdFJhdGVcbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgbW9ydGdhZ2UgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTW9ydGdhZ2VMaWFiaWxpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb3J0Z2FnZUxpYWJpbGl0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhpcyBsaWFiaWxpdHkgYmVsb25ncyB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBhY2NvdW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCBvdXRzdGFuZGluZyBhbW91bnQgY2hhcmdlZCBmb3IgbGF0ZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgY3VycmVudF9sYXRlX2ZlZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgaGVsZCBpbiBlc2Nyb3cgdG8gcGF5IHRheGVzIGFuZCBpbnN1cmFuY2Ugb24gYmVoYWxmIG9mIHRoZSBib3Jyb3dlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGVzY3Jvd19iYWxhbmNlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBib3Jyb3dlciBoYXMgcHJpdmF0ZSBtb3J0Z2FnZSBpbnN1cmFuY2UgaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGhhc19wbWk6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBib3Jyb3dlciB3aWxsIHBheSBhIHBlbmFsdHkgZm9yIGVhcmx5IHBheW9mZiBvZiBtb3J0Z2FnZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBoYXNfcHJlcGF5bWVudF9wZW5hbHR5OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TW9ydGdhZ2VJbnRlcmVzdFJhdGV9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgaW50ZXJlc3RfcmF0ZTogTW9ydGdhZ2VJbnRlcmVzdFJhdGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbGFzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvZiB0aGUgbGFzdCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxhc3RfcGF5bWVudF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIGxvYW4sIGZvciBleGFtcGxlIGBjb252ZW50aW9uYWxgLCBgZml4ZWRgLCBvciBgdmFyaWFibGVgLiBUaGlzIGZpZWxkIGlzIHByb3ZpZGVkIGRpcmVjdGx5IGZyb20gdGhlIGxvYW4gc2VydmljZXIgYW5kIGRvZXMgbm90IGhhdmUgYW4gZW51bWVyYXRlZCBzZXQgb2YgcG9zc2libGUgdmFsdWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbG9hbl90eXBlX2Rlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZ1bGwgZHVyYXRpb24gb2YgbW9ydGdhZ2UgYXMgYXQgb3JpZ2luYXRpb24gKGUuZy4gYDEwIHllYXJgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIGxvYW5fdGVybTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBPcmlnaW5hbCBkYXRlIG9uIHdoaWNoIG1vcnRnYWdlIGlzIGR1ZSBpbiBmdWxsLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG1hdHVyaXR5X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgbmV4dCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgbmV4dF9tb250aGx5X3BheW1lbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGR1ZSBkYXRlIGZvciB0aGUgbmV4dCBwYXltZW50LiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZUxpYWJpbGl0eVxuICAgICAqL1xuICAgIG5leHRfcGF5bWVudF9kdWVfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgbG9hbiB3YXMgaW5pdGlhbGx5IGxlbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIG1vcnRnYWdlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fcHJpbmNpcGFsX2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbW91bnQgb2YgbG9hbiAocHJpbmNpcGFsICsgaW50ZXJlc3QpIHBhc3QgZHVlIGZvciBwYXltZW50LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgcGFzdF9kdWVfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICBwcm9wZXJ0eV9hZGRyZXNzOiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzcztcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VMaWFiaWxpdHlcbiAgICAgKi9cbiAgICB5dGRfaW50ZXJlc3RfcGFpZDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgWVREIHByaW5jaXBhbCBwYWlkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlTGlhYmlsaXR5XG4gICAgICovXG4gICAgeXRkX3ByaW5jaXBhbF9wYWlkOiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBmaWVsZHMgZGVzY3JpYmluZyBwcm9wZXJ0eSBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE1vcnRnYWdlUHJvcGVydHlBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZpdmUgb3IgbmluZSBkaWdpdCBwb3N0YWwgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBNb3J0Z2FnZVByb3BlcnR5QWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgKGV4YW1wbGUgXFxcIk5DXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgKGV4YW1wbGUgXFxcIjU2NCBNYWluIFN0cmVldCwgQXB0IDE1XFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTW9ydGdhZ2VQcm9wZXJ0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIHJpc2sgc2lnbmFscyBhbmQgcmVsZXZhbnQgbWV0YWRhdGEgZm9yIGEgc2V0IG9mIHVwbG9hZGVkIGRvY3VtZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBNdWx0aURvY3VtZW50Umlza1NpZ25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE11bHRpRG9jdW1lbnRSaXNrU2lnbmFsIHtcbiAgICAvKipcbiAgICAgKiBBcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYXR0cmlidXRlcyB0aGF0IGNvdWxkIGluZGljYXRlIGlmIGEgZG9jdW1lbnQgaXMgZnJhdWR1bGVudFxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2U+fVxuICAgICAqIEBtZW1iZXJvZiBNdWx0aURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGRvY3VtZW50X3JlZmVyZW5jZXM6IEFycmF5PFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZT47XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgYXR0cmlidXRlcyB0aGF0IGluZGljYXRlIHdoZXRoZXIgb3Igbm90IHRoZXJlIGlzIGZyYXVkIHJpc2sgd2l0aCBhIHNldCBvZiBkb2N1bWVudHNcbiAgICAgKiBAdHlwZSB7QXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsPn1cbiAgICAgKiBAbWVtYmVyb2YgTXVsdGlEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbD47XG59XG4vKipcbiAqIFNjb3JlIGZvdW5kIGJ5IG1hdGNoaW5nIG5hbWUgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBuYW1lIG9uIHRoZSBhY2NvdW50IGF0IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHRoZSBhY2NvdW50IGNvbnRhaW5zIG11bHRpcGxlIG93bmVycywgdGhlIG1heGltdW0gbWF0Y2ggc2NvcmUgaXMgZmlsbGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOYW1lTWF0Y2hTY29yZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3IgbmFtZS4gMTAwIGlzIGEgcGVyZmVjdCBzY29yZSwgOTktODUgbWVhbnMgYSBzdHJvbmcgbWF0Y2gsIDg0LTcwIGlzIGEgcGFydGlhbCBtYXRjaCwgYW55IHNjb3JlIGxlc3MgdGhhbiA3MCBpcyBhIG1pc21hdGNoLiBUeXBpY2FsbHksIHRoZSBtYXRjaCB0aHJlc2hvbGQgc2hvdWxkIGJlIHNldCB0byBhIHNjb3JlIG9mIDcwIG9yIGhpZ2hlci4gSWYgdGhlIG5hbWUgaXMgbWlzc2luZyBmcm9tIGVpdGhlciB0aGUgQVBJIG9yIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgdGhpcyBpcyBudWxsLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIGZpcnN0IG9yIGxhc3QgbmFtZSBjb21wbGV0ZWx5IG1hdGNoZWQsIGxpa2VseSBhIGZhbWlseSBtZW1iZXJcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTmFtZU1hdGNoU2NvcmVcbiAgICAgKi9cbiAgICBpc19maXJzdF9uYW1lX29yX2xhc3RfbmFtZV9tYXRjaD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIG5pY2tuYW1lIG1hdGNoZWQsIGV4YW1wbGUgSmVubmlmZXIgYW5kIEplbm4uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgaXNfbmlja25hbWVfbWF0Y2g/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJcyBgdHJ1ZWAgaWYgdGhlIG5hbWUgb24gZWl0aGVyIG9mIHRoZSBuYW1lcyB0aGF0IHdhcyBtYXRjaGVkIGZvciB0aGUgc2NvcmUgY29udGFpbmVkIHN0cmluZ3MgaW5kaWNhdGl2ZSBvZiBhIGJ1c2luZXNzIG5hbWUsIHN1Y2ggYXMgXFxcIkNPUlBcXFwiLCBcXFwiTExDXFxcIiwgXFxcIklOQ1xcXCIsIG9yIFxcXCJMVERcXFwiLiBBIGB0cnVlYCByZXN1bHQgZ2VuZXJhbGx5IGluZGljYXRlcyB0aGF0IGFuIGFjY291bnRcXCdzIG5hbWUgaXMgYSBidXNpbmVzcyBuYW1lLiBIb3dldmVyLCBhIGBmYWxzZWAgcmVzdWx0IGRvZXMgbm90IG1lYW4gdGhlIGFjY291bnQgbmFtZSBpcyBub3QgYSBidXNpbmVzcyBuYW1lLCBhcyBzb21lIGJ1c2luZXNzZXMgZG8gbm90IHVzZSB0aGVzZSBzdHJpbmdzIGluIHRoZSBuYW1lcyB1c2VkIGZvciB0aGVpciBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWNjb3VudHMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE5hbWVNYXRjaFNjb3JlXG4gICAgICovXG4gICAgaXNfYnVzaW5lc3NfbmFtZV9kZXRlY3RlZD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXQgcGF5IGFtb3VudCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0UGF5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0UGF5IHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBuZXQgcGF5IGZvciB0aGUgcGF5IHBlcmlvZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgbmV0IHBheVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXItdG8tZGF0ZSBhbW91bnQgb2YgdGhlIG5ldCBwYXlcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBOZXRQYXlcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VG90YWx9XG4gICAgICogQG1lbWJlcm9mIE5ldFBheVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdG90YWw/OiBUb3RhbDtcbn1cbi8qKlxuICogQ29udGFpbnMgZGF0YSBhYm91dCB0aGUgY29ubmVjdGVkIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c0l0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrSW5zaWdodHNJdGVtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgZm9yIHRoZSBpbnN0aXR1dGlvbiB0aGUgdXNlciBsaW5rZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIHRoZSB1c2VyIGxpbmtlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZGVudGlmaWVyIGZvciB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBDb250YWlucyBkYXRhIGZvciB0aGUgTmV0d29yayBJbnNpZ2h0cyBSZXBvcnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgTmV0d29yayBJbnNpZ2h0cyByZXBvcnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIHJlcG9ydF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lIHdoZW4gdGhlIE5ldHdvcmsgSW5zaWdodHMgUmVwb3J0IHdhcyBnZW5lcmF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzUmVwb3J0XG4gICAgICovXG4gICAgZ2VuZXJhdGVkX3RpbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIG1hcCBvZiBuZXR3b3JrIGF0dHJpYnV0ZXMsIHdoZXJlIHRoZSBrZXkgaXMgYSBzdHJpbmcsIGFuZCB0aGUgdmFsdWUgaXMgYSBmbG9hdCwgaW50LCBvciBib29sZWFuLlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydFxuICAgICAqL1xuICAgIG5ldHdvcmtfYXR0cmlidXRlczogb2JqZWN0O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIGFjY2Vzc190b2tlbnMuXG4gICAgICogQHR5cGUge0FycmF5PE5ldHdvcmtJbnNpZ2h0c0l0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNSZXBvcnRcbiAgICAgKi9cbiAgICBpdGVtczogQXJyYXk8TmV0d29ya0luc2lnaHRzSXRlbT47XG59XG4vKipcbiAqIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbmV0d29ya19pbnNpZ2h0cy9yZXBvcnQvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWNjZXNzIHRva2VucyB0aGF0IHRoZSBOZXR3b3JrIEluc2lnaHRzIHdpbGwgYmUgcmVxdWVzdGVkIGZvci4gVGhlc2UgY29ycmVzcG9uZCB0byBwcmV2aW91cyBJdGVtcyBhIHVzZXIgaGFzIGNvbm5lY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9uZXR3b3JrX2luc2lnaHRzL3JlcG9ydC9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya0luc2lnaHRzUmVwb3J0fVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcG9ydDogTmV0d29ya0luc2lnaHRzUmVwb3J0O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvbmV0d29yay9zdGF0dXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya1N0YXR1c0dldFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcjogTmV0d29ya1N0YXR1c0dldFVzZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIGEgdGVtcGxhdGUgZGVmaW5lZCBpbiBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZmllbGQgaXMgdXNlZCBpZiB5b3UgaGF2ZSBhZGRpdGlvbmFsIGNyaXRlcmlhIHRoYXQgeW91IHdhbnQgdG8gY2hlY2sgYWdhaW5zdCAoZS5nLiBMYXllciBlbGlnaWJpbGl0eSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZW1wbGF0ZV9pZD86IHN0cmluZztcbn1cbi8qKlxuICogTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9uZXR3b3JrL3N0YXR1cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldHdvcmtTdGF0dXNHZXRSZXNwb25zZU5ldHdvcmtTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5ldHdvcmtfc3RhdHVzOiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VMYXllcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGF5ZXI/OiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VMYXllciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBMYXllci1yZWxhdGVkIG1ldGFkYXRhIGZvciB0aGUgcmVxdWVzdGVkIHVzZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZUxheWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTGF5ZXIge1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgYSBMYXllciBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VMYXllclxuICAgICAqL1xuICAgIGVsaWdpYmxlOiBib29sZWFuO1xufVxuLyoqXG4gKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgb3ZlcmFsbCBuZXR3b3JrIHN0YXR1cyBvZiB0aGUgdXNlci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZU5ldHdvcmtTdGF0dXMge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgUmV0dXJuaW5nVXNlciA9ICdSRVRVUk5JTkdfVVNFUidcbn1cblxuLyoqXG4gKiBBbiBvYmplY3Qgc3BlY2lmeWluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZW5kIHVzZXIgZm9yIHRoZSBuZXR3b3JrIHN0YXR1cyBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTmV0d29ya1N0YXR1c0dldFVzZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXR3b3JrU3RhdHVzR2V0VXNlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciBpbiBbRS4xNjRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0UuMTY0KSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV0d29ya1N0YXR1c0dldFVzZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI6IHN0cmluZztcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBQbGFpZCBkZXRlY3RzIGEgbmV3IGFjY291bnQuIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgeW91IGNhbiBwcm9tcHQgeW91ciB1c2VycyB0byBzaGFyZSBuZXcgYWNjb3VudHMgd2l0aCB5b3UgdGhyb3VnaCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZS8jdXNpbmctdXBkYXRlLW1vZGUtdG8tcmVxdWVzdC1uZXctYWNjb3VudHMpIChVUy9DQSBvbmx5KS4gSWYgdGhlIGVuZCB1c2VyIGhhcyBvcHRlZCBub3QgdG8gc2hhcmUgbmV3IGFjY291bnRzIHdpdGggUGxhaWQgdmlhIHRoZWlyIGluc3RpdHV0aW9uXFwncyBPQXV0aCBzZXR0aW5ncywgUGxhaWQgd2lsbCBub3QgZGV0ZWN0IG5ldyBhY2NvdW50cyBhbmQgdGhpcyB3ZWJob29rIHdpbGwgbm90IGZpcmUuIEZvciBlbmQgdXNlciBhY2NvdW50cyBpbiB0aGUgRVUgYW5kIFVLLCB1cG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIHlvdSBjYW4gcHJvbXB0IHlvdXIgdXNlciB0byByZS1saW5rIHRoZWlyIGFjY291bnQgYW5kIHRoZW4gZGVsZXRlIHRoZSBvbGQgSXRlbSB2aWEgYC9pdGVtL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE5ld0FjY291bnRzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgTmV3QWNjb3VudHNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBQbGFpZEVycm9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBOZXdBY2NvdW50c0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudD86IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogQWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWVyIG51bWJlciBkYXRhIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0ZXN0IGFjY291bnQuIEFsbCB2YWx1ZXMgYXJlIG9wdGlvbmFsLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogV2lsbCBiZSB1c2VkIGZvciB0aGUgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1xuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSBhIHZhbGlkIEFDSCByb3V0aW5nIG51bWJlci4gVG8gdGVzdCBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgLCBzZXQgdGhpcyB0byAzMjIyNzE2MjcgdG8gZm9yY2UgYSBgdHJ1ZWAgcmVzdWx0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBhY2hfcm91dGluZz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgd2lyZSB0cmFuc2ZlciByb3V0aW5nIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYWNoX3dpcmVfcm91dGluZz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFRlQgaW5zdGl0dXRpb24gbnVtYmVyLiBNdXN0IGJlIHNwZWNpZmllZCBhbG9uZ3NpZGUgYGVmdF9icmFuY2hgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBlZnRfaW5zdGl0dXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRUZUIGJyYW5jaCBudW1iZXIuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgZWZ0X2luc3RpdHV0aW9uYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgZWZ0X2JyYW5jaD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBCYW5rIGlkZW50aWZpZXIgY29kZSAoQklDKS4gTXVzdCBiZSBzcGVjaWZpZWQgYWxvbmdzaWRlIGBpbnRlcm5hdGlvbmFsX2liYW5gLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2JpYz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIGJhbmsgYWNjb3VudCBudW1iZXIgKElCQU4pLiBJZiBubyBhY2NvdW50IG51bWJlciBpcyBzcGVjaWZpZWQgdmlhIGBhY2NvdW50YCwgd2lsbCBhbHNvIGJlIHVzZWQgYXMgdGhlIGFjY291bnQgbnVtYmVyIGJ5IGRlZmF1bHQuIE11c3QgYmUgc3BlY2lmaWVkIGFsb25nc2lkZSBgaW50ZXJuYXRpb25hbF9iaWNgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsX2liYW4/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQkFDUyBzb3J0IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzXG4gICAgICovXG4gICAgYmFjc19zb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgaG9sZGluZ3MgdG8gYW4gaW52ZXN0bWVudHMgYWNjb3VudCB2aWEgQUNBVFMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBQ0FUU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0FUUyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNBVFNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDQVRTXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXJzIGZvciB0aGUgY2xlYXJpbmdob3VzZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGluIG9yZGVyIG9mIHJlbGV2YW5jZS4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGlmIHdlIGNhblxcJ3QgcHJvdmlkZSBhbnkgYWNjb3VudCBsZXZlbCBkYXRhLiBJbnN0aXR1dGlvbiBsZXZlbCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgaW5zdGl0dXRpb25zL2dldCBlbmRwb2ludHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0FUU1xuICAgICAqL1xuICAgIGR0Y19udW1iZXJzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVUyBhY2NvdW50IHZpYSBBQ0ggb3Igd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDSFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNBQ0gge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gIEF0IGNlcnRhaW4gaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgQ2hhc2UgYW5kIFBOQywgeW91IHdpbGwgcmVjZWl2ZSBcXFwidG9rZW5pemVkXFxcIiByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlcnMsIHdoaWNoIGFyZSBub3QgdGhlIHVzZXJcXCdzIGFjdHVhbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIEZvciBpbXBvcnRhbnQgZGV0YWlscyBvbiBob3cgdGhpcyBtYXkgaW1wYWN0IHlvdXIgaW50ZWdyYXRpb24gYW5kIG9uIGhvdyB0byBhdm9pZCBmcmF1ZCwgdXNlciBjb25mdXNpb24sIGFuZCBBQ0ggcmV0dXJucywgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGFjY291bnQgbnVtYmVyIGlzIHRva2VuaXplZCBieSB0aGUgaW5zdGl0dXRpb24uIEZvciBpbXBvcnRhbnQgZGV0YWlscyBvbiBob3cgdG9rZW5pemVkIGFjY291bnQgbnVtYmVycyBtYXkgaW1wYWN0IHlvdXIgaW50ZWdyYXRpb24sIHNlZSBbVG9rZW5pemVkIGFjY291bnQgbnVtYmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIGlzX3Rva2VuaXplZF9hY2NvdW50X251bWJlcj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIEFDSCByb3V0aW5nIG51bWJlciBmb3IgdGhlIGFjY291bnQuIFRoaXMgbWF5IGJlIGEgdG9rZW5pemVkIHJvdXRpbmcgbnVtYmVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hcbiAgICAgKi9cbiAgICByb3V0aW5nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGlmIHRoZSBpbnN0aXR1dGlvbiBpcyBrbm93biB0byB1c2UgYSBzZXBhcmF0ZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBNYW55IGluc3RpdHV0aW9ucyBkbyBub3QgaGF2ZSBhIHNlcGFyYXRlIHdpcmUgcm91dGluZyBudW1iZXIgYW5kIHVzZSB0aGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB3aXJlcyBpbnN0ZWFkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBoYXZlIHRoZSBlbmQgdXNlciBtYW51YWxseSBjb25maXJtIHRoZWlyIHdpcmUgcm91dGluZyBudW1iZXIgYmVmb3JlIHNlbmRpbmcgYW55IHdpcmVzIHRvIHRoZWlyIGFjY291bnQsIGVzcGVjaWFsbHkgaWYgdGhpcyBmaWVsZCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSFxuICAgICAqL1xuICAgIHdpcmVfcm91dGluZzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZSBhY2NvdW50IHN1cHBvcnRzIEFDSCB0cmFuc2ZlcnMgaW50byB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX2luPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGUgYWNjb3VudCBzdXBwb3J0cyBBQ0ggdHJhbnNmZXJzIG91dCBvZiB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNIXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX291dD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIG1vbmV5IHRvIG9yIGZyb20gYSBVUyBhY2NvdW50IHZpYSBBQ0ggb3Igd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0FDSE51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FDSE51bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudC4gIEF0IGNlcnRhaW4gaW5zdGl0dXRpb25zLCBpbmNsdWRpbmcgQ2hhc2UgYW5kIFBOQywgeW91IHdpbGwgcmVjZWl2ZSBcXFwidG9rZW5pemVkXFxcIiByb3V0aW5nIGFuZCBhY2NvdW50IG51bWJlcnMsIHdoaWNoIGFyZSBub3QgdGhlIHVzZXJcXCdzIGFjdHVhbCBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMuIEZvciBpbXBvcnRhbnQgZGV0YWlscyBvbiBob3cgdGhpcyBtYXkgaW1wYWN0IHlvdXIgaW50ZWdyYXRpb24gYW5kIG9uIGhvdyB0byBhdm9pZCBmcmF1ZCwgdXNlciBjb25mdXNpb24sIGFuZCBBQ0ggcmV0dXJucywgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYWNjb3VudCBudW1iZXIgaXMgdG9rZW5pemVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gRm9yIGltcG9ydGFudCBkZXRhaWxzIG9uIGhvdyB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIG1heSBpbXBhY3QgeW91ciBpbnRlZ3JhdGlvbiwgc2VlIFtUb2tlbml6ZWQgYWNjb3VudCBudW1iZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvI3Rva2VuaXplZC1hY2NvdW50LW51bWJlcnMpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICBpc190b2tlbml6ZWRfYWNjb3VudF9udW1iZXI/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIG1heSBiZSBhIHRva2VuaXplZCByb3V0aW5nIG51bWJlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbVG9rZW5pemVkIGFjY291bnQgbnVtYmVyc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoLyN0b2tlbml6ZWQtYWNjb3VudC1udW1iZXJzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQUNITnVsbGFibGVcbiAgICAgKi9cbiAgICByb3V0aW5nOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHdpcmUgdHJhbnNmZXIgcm91dGluZyBudW1iZXIgZm9yIHRoZSBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGlmIHRoZSBpbnN0aXR1dGlvbiBpcyBrbm93biB0byB1c2UgYSBzZXBhcmF0ZSB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBNYW55IGluc3RpdHV0aW9ucyBkbyBub3QgaGF2ZSBhIHNlcGFyYXRlIHdpcmUgcm91dGluZyBudW1iZXIgYW5kIHVzZSB0aGUgQUNIIHJvdXRpbmcgbnVtYmVyIGZvciB3aXJlcyBpbnN0ZWFkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBoYXZlIHRoZSBlbmQgdXNlciBtYW51YWxseSBjb25maXJtIHRoZWlyIHdpcmUgcm91dGluZyBudW1iZXIgYmVmb3JlIHNlbmRpbmcgYW55IHdpcmVzIHRvIHRoZWlyIGFjY291bnQsIGVzcGVjaWFsbHkgaWYgdGhpcyBmaWVsZCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgd2lyZV9yb3V0aW5nOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBpbnRvIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNBQ0hOdWxsYWJsZVxuICAgICAqL1xuICAgIGNhbl90cmFuc2Zlcl9pbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdoZXRoZXIgdGhlIGFjY291bnQgc3VwcG9ydHMgQUNIIHRyYW5zZmVycyBvdXQgb2YgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FDSE51bGxhYmxlXG4gICAgICovXG4gICAgY2FuX3RyYW5zZmVyX291dD86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBJZGVudGlmeWluZyBpbmZvcm1hdGlvbiBmb3IgdHJhbnNmZXJyaW5nIGhvbGRpbmdzIHRvIGFuIGludmVzdG1lbnRzIGFjY291bnQgdmlhIEFUT04uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNBVE9OXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0FUT04ge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FUT05cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0FUT05cbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIFVLIGJhbmsgYWNjb3VudCB2aWEgQkFDUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzQkFDUyB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQkFDUyBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU1xuICAgICAqL1xuICAgIGFjY291bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQkFDUyBzb3J0IGNvZGUgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0JBQ1NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgVUsgYmFuayBhY2NvdW50IHZpYSBCQUNTLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzQkFDU051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0JBQ1NOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzQkFDU051bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBCQUNTIGFjY291bnQgbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJBQ1Mgc29ydCBjb2RlIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGEgQ2FuYWRpYW4gYmFuayBhY2NvdW50IHZpYSBFRlQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNFRlRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzRUZUIHtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYWNjb3VudCBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgaW5zdGl0dXRpb24gbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlRcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYnJhbmNoIG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzRUZUXG4gICAgICovXG4gICAgYnJhbmNoOiBzdHJpbmc7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhIENhbmFkaWFuIGJhbmsgYWNjb3VudCB2aWEgRUZULlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzRUZUTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzRUZUTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBhY2NvdW50IElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgYWNjb3VudCBudW1iZXIgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0VGVE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBFRlQgaW5zdGl0dXRpb24gbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlROdWxsYWJsZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVGVCBicmFuY2ggbnVtYmVyIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNFRlROdWxsYWJsZVxuICAgICAqL1xuICAgIGJyYW5jaDogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSUJBTk51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0lCQU5OdWxsYWJsZSB7XG59XG4vKipcbiAqIElkZW50aWZ5aW5nIGluZm9ybWF0aW9uIGZvciB0cmFuc2ZlcnJpbmcgbW9uZXkgdG8gb3IgZnJvbSBhbiBpbnRlcm5hdGlvbmFsIGJhbmsgYWNjb3VudCB2aWEgd2lyZSB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbCB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbFxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQmFuayBJZGVudGlmaWVyIENvZGUgKEJJQykgZm9yIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc0ludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBudW1iZXJzIHVzaW5nIHRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgYW5kIEJJQy9TV0lGVCBjb2RlIGZvcm1hdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHtcbiAgICAvKipcbiAgICAgKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsSUJBTlxuICAgICAqL1xuICAgIGliYW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgQnVzaW5lc3MgSWRlbnRpZmllciBDb2RlLCBhbHNvIGtub3duIGFzIFNXSUZUIGNvZGUsIGZvciB0aGlzIGJhbmsgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbElCQU5cbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBtb25leSB0byBvciBmcm9tIGFuIGludGVybmF0aW9uYWwgYmFuayBhY2NvdW50IHZpYSB3aXJlIHRyYW5zZmVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJhbmsgSWRlbnRpZmllciBDb2RlIChCSUMpIGZvciB0aGUgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE51bWJlcnNJbnRlcm5hdGlvbmFsTnVsbGFibGVcbiAgICAgKi9cbiAgICBiaWM6IHN0cmluZztcbn1cbi8qKlxuICogSWRlbnRpZnlpbmcgaW5mb3JtYXRpb24gZm9yIHRyYW5zZmVycmluZyBob2xkaW5ncyBmcm9tIGEgNDAxayBhY2NvdW50IHRvIGFub3RoZXIgNDAxayBhY2NvdW50IG9yIElSQSB2aWEgdGhlIG1hbnVhbCA0MDFrIHJvbGxvdmVyIHByb2Nlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIE51bWJlcnNSZXRpcmVtZW50NDAxa1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE51bWJlcnNSZXRpcmVtZW50NDAxayB7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG51bWJlcnNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzUmV0aXJlbWVudDQwMWtcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYW4gbnVtYmVyIGZvciB0aGUgZW1wbG95ZXJcXCdzIDQwMWsgcmV0aXJlbWVudCBwbGFuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgTnVtYmVyc1JldGlyZW1lbnQ0MDFrXG4gICAgICovXG4gICAgcGxhbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBhY2NvdW50IG51bWJlciBmb3IgdGhlIGFjY291bnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBOdW1iZXJzUmV0aXJlbWVudDQwMWtcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVmFsaWQgdmFsdWVzIGFyZSBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8gdGhlIG9yaWdpbmF0aW9uIGFjY291bnQ7IGEgYGNyZWRpdGAgaW5kaWNhdGVzIGEgdHJhbnNmZXIgb2YgbW9uZXkgb3V0IG9mIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50LiBUaGlzIGZpZWxkIGlzIG9taXR0ZWQgZm9yIFBsYWlkIExlZGdlciBTd2VlcCBldmVudHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPbWl0dGFibGVUcmFuc2ZlclR5cGUge1xuICAgIERlYml0ID0gJ2RlYml0JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0J1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIG9wdGlvbiBzZWN1cml0eS4gIEZvciB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgdGhpcyBkYXRhIGlzIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBpZiB0aGUgaXRlbSBpcyB1c2luZyBhIGN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdCwgYW5kIHRoZSBgdGlja2VyYCBmaWVsZCBvZiB0aGUgY3VzdG9tIHNlY3VyaXR5IGZvbGxvd3MgdGhlIFtPQ0MgT3B0aW9uIFN5bWJvbF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3B0aW9uX3N5bWJvbCNUaGVfT0NDX09wdGlvbl9TeW1ib2wpIHN0YW5kYXJkIHdpdGggbm8gc3BhY2VzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcHRpb25Db250cmFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGlvbkNvbnRyYWN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIG9wdGlvbiBjb250cmFjdC4gSXQgaXMgb25lIG9mOiAgYHB1dGA6IGZvciBQdXQgb3B0aW9uIGNvbnRyYWN0cyAgYGNhbGxgOiBmb3IgQ2FsbCBvcHRpb24gY29udHJhY3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBjb250cmFjdF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGV4cGlyYXRpb24gZGF0ZSBmb3IgdGhpcyBvcHRpb24gY29udHJhY3QsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJpa2UgcHJpY2UgZm9yIHRoaXMgb3B0aW9uIGNvbnRyYWN0LCBwZXIgc2hhcmUgb2Ygc2VjdXJpdHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgT3B0aW9uQ29udHJhY3RcbiAgICAgKi9cbiAgICBzdHJpa2VfcHJpY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdGlja2VyIG9mIHRoZSB1bmRlcmx5aW5nIHNlY3VyaXR5IGZvciB0aGlzIG9wdGlvbiBjb250cmFjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcHRpb25Db250cmFjdFxuICAgICAqL1xuICAgIHVuZGVybHlpbmdfc2VjdXJpdHlfdGlja2VyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hbCBzb3VyY2Ugb2YgdGhlIGZ1bmRzLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGJ5IGxvY2FsIHJlZ3VsYXRpb24gZm9yIGNlcnRhaW4gYnVzaW5lc3NlcyAoZS5nLiBtb25leSByZW1pdHRhbmNlKSB0byBzZW5kIHBheW91dHMgdG8gcmVjaXBpZW50cyBpbiB0aGUgRVUgYW5kIFVLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPcmlnaW5hdGluZ0Z1bmRTb3VyY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcmlnaW5hdGluZ0Z1bmRTb3VyY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzb3VyY2Ugb2YgdGhlIGZ1bmRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGZ1bGxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgbnVtYmVyIGZyb20gd2hpY2ggdGhlIGZ1bmRzIGFyZSBzb3VyY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE9yaWdpbmF0aW5nRnVuZFNvdXJjZVxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEJ1c2luZXNzIElkZW50aWZpZXIgQ29kZSwgYWxzbyBrbm93biBhcyBTV0lGVCBjb2RlLCBmb3IgdGhpcyBiYW5rIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgT3JpZ2luYXRpbmdGdW5kU291cmNlXG4gICAgICovXG4gICAgYmljOiBzdHJpbmc7XG59XG4vKipcbiAqIE9yaWdpbmF0b3IgYW5kIHRoZWlyIHN0YXR1cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3JpZ2luYXRvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9yaWdpbmF0b3Ige1xuICAgIC8qKlxuICAgICAqIE9yaWdpbmF0b3LigJlzIGNsaWVudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRGlsaWdlbmNlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBPcmlnaW5hdG9yXG4gICAgICovXG4gICAgdHJhbnNmZXJfZGlsaWdlbmNlX3N0YXR1czogVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBleHBlY3RlZCB0cmFuc2ZlciBmcmVxdWVuY3kuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeSB7XG4gICAgT25jZVBlck1vbnRoID0gJ29uY2VfcGVyX21vbnRoJyxcbiAgICBUd2ljZVBlck1vbnRoID0gJ3R3aWNlX3Blcl9tb250aCcsXG4gICAgT25jZVBlcldlZWsgPSAnb25jZV9wZXJfd2VlaycsXG4gICAgRGFpbHkgPSAnZGFpbHknXG59XG5cbi8qKlxuICogVmFsaWQgYWNjb3VudCBzdWJ0eXBlcyBmb3Igb3RoZXIgYWNjb3VudHMuIEZvciBhIGxpc3QgY29udGFpbmluZyBkZXNjcmlwdGlvbnMgb2YgZWFjaCBzdWJ0eXBlLCBzZWUgW0FjY291bnQgc2NoZW1hc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMvI1N0YW5kYWxvbmVBY2NvdW50VHlwZS1vdGhlcikuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBPdGhlckFjY291bnRTdWJ0eXBlIHtcbiAgICBPdGhlciA9ICdvdGhlcicsXG4gICAgQWxsID0gJ2FsbCdcbn1cblxuLyoqXG4gKiBBIGZpbHRlciB0byBhcHBseSB0byBgb3RoZXJgLXR5cGUgYWNjb3VudHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3RoZXJGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdGhlckZpbHRlciB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYWNjb3VudCBzdWJ0eXBlcyB0byBkaXNwbGF5IGluIExpbmsuIElmIG5vdCBzcGVjaWZpZWQsIGFsbCBhY2NvdW50IHN1YnR5cGVzIHdpbGwgYmUgc2hvd24uIEZvciBhIGZ1bGwgbGlzdCBvZiB2YWxpZCB0eXBlcyBhbmQgc3VidHlwZXMsIHNlZSB0aGUgW0FjY291bnQgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNhY2NvdW50LXR5cGUtc2NoZW1hKS4gXG4gICAgICogQHR5cGUge0FycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdGhlckZpbHRlclxuICAgICAqL1xuICAgIGFjY291bnRfc3VidHlwZXM6IEFycmF5PE90aGVyQWNjb3VudFN1YnR5cGU+O1xufVxuLyoqXG4gKiBgaW52ZXN0bWVudDpgIEludmVzdG1lbnQgYWNjb3VudC4gIGBjcmVkaXQ6YCBDcmVkaXQgY2FyZCAgYGRlcG9zaXRvcnk6YCBEZXBvc2l0b3J5IGFjY291bnQgIGBsb2FuOmAgTG9hbiBhY2NvdW50ICBgcGF5cm9sbDpgIFBheXJvbGwgYWNjb3VudCAgYG90aGVyOmAgTm9uLXNwZWNpZmllZCBhY2NvdW50IHR5cGUgIFNlZSB0aGUgW0FjY291bnQgdHlwZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBhY2NvdW50IHR5cGVzIGFuZCBjb3JyZXNwb25kaW5nIHN1YnR5cGVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3ZlcnJpZGVBY2NvdW50VHlwZSB7XG4gICAgSW52ZXN0bWVudCA9ICdpbnZlc3RtZW50JyxcbiAgICBDcmVkaXQgPSAnY3JlZGl0JyxcbiAgICBEZXBvc2l0b3J5ID0gJ2RlcG9zaXRvcnknLFxuICAgIExvYW4gPSAnbG9hbicsXG4gICAgUGF5cm9sbCA9ICdwYXlyb2xsJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBEYXRhIHRvIHVzZSB0byBzZXQgdmFsdWVzIG9mIHRlc3QgYWNjb3VudHMuIFNvbWUgdmFsdWVzIGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gdGhlIHNjaGVtYSBhbmQgd2lsbCBpbnN0ZWFkIHdpbGwgYmUgY2FsY3VsYXRlZCBmcm9tIG90aGVyIHRlc3QgZGF0YSBpbiBvcmRlciB0byBhY2hpZXZlIG1vcmUgY29uc2lzdGVudCwgcmVhbGlzdGljIHRlc3QgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgT3ZlcnJpZGVBY2NvdW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJyaWRlQWNjb3VudHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPdmVycmlkZUFjY291bnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHlwZTogT3ZlcnJpZGVBY2NvdW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudFN1YnR5cGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBzdWJ0eXBlOiBBY2NvdW50U3VidHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgcHJvdmlkZWQsIHRoZSBhY2NvdW50IHdpbGwgc3RhcnQgd2l0aCB0aGlzIGFtb3VudCBhcyB0aGUgY3VycmVudCBiYWxhbmNlLiBcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgc3RhcnRpbmdfYmFsYW5jZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIElmIHByb3ZpZGVkLCB0aGUgYWNjb3VudCB3aWxsIGFsd2F5cyBoYXZlIHRoaXMgYW1vdW50IGFzIGl0cyAgYXZhaWxhYmxlIGJhbGFuY2UsIHJlZ2FyZGxlc3Mgb2YgY3VycmVudCBiYWxhbmNlIG9yIGNoYW5nZXMgaW4gdHJhbnNhY3Rpb25zIG92ZXIgdGltZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgZm9yY2VfYXZhaWxhYmxlX2JhbGFuY2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJU08tNDIxNyBjdXJyZW5jeSBjb2RlLiBJZiBwcm92aWRlZCwgdGhlIGFjY291bnQgd2lsbCBiZSBkZW5vbWluYXRlZCBpbiB0aGUgZ2l2ZW4gY3VycmVuY3kuIFRyYW5zYWN0aW9ucyB3aWxsIGFsc28gYmUgaW4gdGhpcyBjdXJyZW5jeSBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNZXRhfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgbWV0YTogTWV0YTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc31cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIG51bWJlcnM6IE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgbGlzdCBvZiB0cmFuc2FjdGlvbnMgb24gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SG9sZGluZ3NPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGhvbGRpbmdzPzogSG9sZGluZ3NPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGludmVzdG1lbnRfdHJhbnNhY3Rpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNPdmVycmlkZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7T3duZXJPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGlkZW50aXR5OiBPd25lck92ZXJyaWRlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdHlPdmVycmlkZX1cbiAgICAgKiBAbWVtYmVyb2YgT3ZlcnJpZGVBY2NvdW50c1xuICAgICAqL1xuICAgIGxpYWJpbGl0eTogTGlhYmlsaXR5T3ZlcnJpZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luZmxvd01vZGVsfVxuICAgICAqIEBtZW1iZXJvZiBPdmVycmlkZUFjY291bnRzXG4gICAgICovXG4gICAgaW5mbG93X21vZGVsOiBJbmZsb3dNb2RlbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5jb21lT3ZlcnJpZGV9XG4gICAgICogQG1lbWJlcm9mIE92ZXJyaWRlQWNjb3VudHNcbiAgICAgKi9cbiAgICBpbmNvbWU/OiBJbmNvbWVPdmVycmlkZTtcbn1cbi8qKlxuICogRGF0YSByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gYWJvdXQgdGhlIG93bmVyIG9yIG93bmVycyBvZiBhbiBhY2NvdW50LiBPbmx5IHRoZSBgbmFtZXNgIGFycmF5IG11c3QgYmUgbm9uLWVtcHR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE93bmVyIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEluIHRoZSBjYXNlIG9mIGEgam9pbnQgYWNjb3VudCwgUGxhaWQgd2lsbCBtYWtlIGEgYmVzdCBlZmZvcnQgdG8gcmVwb3J0IHRoZSBuYW1lcyBvZiBhbGwgYWNjb3VudCBob2xkZXJzLiAgSWYgYW4gSXRlbSBjb250YWlucyBtdWx0aXBsZSBhY2NvdW50cyB3aXRoIGRpZmZlcmVudCBvd25lciBuYW1lcywgc29tZSBpbnN0aXR1dGlvbnMgd2lsbCByZXBvcnQgYWxsIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBpbiBlYWNoIGFjY291bnRcXCdzIGBuYW1lc2AgYXJyYXkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyXG4gICAgICovXG4gICAgbmFtZXM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHBob25lIG51bWJlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIE1heSBiZSBhbiBlbXB0eSBhcnJheSBpZiBubyByZWxldmFudCBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzOiBBcnJheTxQaG9uZU51bWJlcj47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGVtYWlsIGFkZHJlc3NlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gTWF5IGJlIGFuIGVtcHR5IGFycmF5IGlmIG5vIHJlbGV2YW50IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lclxuICAgICAqL1xuICAgIGVtYWlsczogQXJyYXk8RW1haWw+O1xuICAgIC8qKlxuICAgICAqIERhdGEgYWJvdXQgdGhlIHZhcmlvdXMgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBNYXkgYmUgYW4gZW1wdHkgYXJyYXkgaWYgbm8gcmVsZXZhbnQgaW5mb3JtYXRpb24gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJcbiAgICAgKi9cbiAgICBhZGRyZXNzZXM6IEFycmF5PEFkZHJlc3M+O1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IHRoZSBvd25lciBvciBvd25lcnMgb2YgYW4gYWNjb3VudC4gQW55IGZpZWxkcyBub3Qgc3BlY2lmaWVkIHdpbGwgYmUgZmlsbGVkIGluIHdpdGggZGVmYXVsdCBTYW5kYm94IGluZm9ybWF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBPd25lck92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3duZXJPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIG5hbWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGVzZSBzaG91bGQgYWx3YXlzIGJlIHRoZSBuYW1lcyBvZiBpbmRpdmlkdWFscywgZXZlbiBmb3IgYnVzaW5lc3MgYWNjb3VudHMuIE5vdGUgdGhhdCB0aGUgc2FtZSBuYW1lIGRhdGEgd2lsbCBiZSB1c2VkIGZvciBhbGwgYWNjb3VudHMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIE93bmVyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuYW1lczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge0FycmF5PFBob25lTnVtYmVyPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIHBob25lX251bWJlcnM6IEFycmF5PFBob25lTnVtYmVyPjtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgZW1haWwgYWRkcmVzc2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8RW1haWw+fVxuICAgICAqIEBtZW1iZXJvZiBPd25lck92ZXJyaWRlXG4gICAgICovXG4gICAgZW1haWxzOiBBcnJheTxFbWFpbD47XG4gICAgLyoqXG4gICAgICogRGF0YSBhYm91dCB0aGUgdmFyaW91cyBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxBZGRyZXNzPn1cbiAgICAgKiBAbWVtYmVyb2YgT3duZXJPdmVycmlkZVxuICAgICAqL1xuICAgIGFkZHJlc3NlczogQXJyYXk8QWRkcmVzcz47XG59XG4vKipcbiAqIEhvdyBhbiBhc3NldCBpcyBvd25lZC4gIGBhc3NvY2lhdGlvbmA6IE93bmVyc2hpcCBieSBhIGNvcnBvcmF0aW9uLCBwYXJ0bmVyc2hpcCwgb3IgdW5pbmNvcnBvcmF0ZWQgYXNzb2NpYXRpb24sIGluY2x1ZGluZyBmb3ItcHJvZml0IGFuZCBub3QtZm9yLXByb2ZpdCBvcmdhbml6YXRpb25zLiBgaW5kaXZpZHVhbGA6IE93bmVyc2hpcCBieSBhbiBpbmRpdmlkdWFsLiBgam9pbnRgOiBKb2ludCBvd25lcnNoaXAgYnkgbXVsdGlwbGUgcGFydGllcy4gYHRydXN0YDogT3duZXJzaGlwIGJ5IGEgcmV2b2NhYmxlIG9yIGlycmV2b2NhYmxlIHRydXN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gT3duZXJzaGlwVHlwZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBJbmRpdmlkdWFsID0gJ2luZGl2aWR1YWwnLFxuICAgIEpvaW50ID0gJ2pvaW50JyxcbiAgICBBc3NvY2lhdGlvbiA9ICdhc3NvY2lhdGlvbicsXG4gICAgVHJ1c3QgPSAndHJ1c3QnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIGFkZHJlc3MgaXMgYSBwb3N0IG9mZmljZSBib3guIFdpbGwgYmUgYHllc2Agd2hlbiBhIFAuTy4gYm94IGlzIGRldGVjdGVkLCBgbm9gIHdoZW4gUGxhaWQgY29uZmlybWVkIHRoZSBhZGRyZXNzIGlzIG5vdCBhIFAuTy4gYm94LCBhbmQgYG5vX2RhdGFgIHdoZW4gUGxhaWQgd2FzIG5vdCBhYmxlIHRvIGRldGVybWluZSBpZiB0aGUgYWRkcmVzcyBpcyBhIFAuTy4gYm94LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUE9Cb3hTdGF0dXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgc3R1ZGVudFxcJ3MgZWxpZ2liaWxpdHkgaW4gdGhlIFB1YmxpYyBTZXJ2aWNlIExvYW4gRm9yZ2l2ZW5lc3MgcHJvZ3JhbS4gVGhpcyBpcyBvbmx5IHJldHVybmVkIGlmIHRoZSBpbnN0aXR1dGlvbiBpcyBGZWRMb2FuIChgaW5zXzExNjUyN2ApLiBTaW5jZSBGZWRMb2FuIG5vIGxvbmdlciBzZXJ2aWNlcyBzdHVkZW50IGxvYW5zLCB0aGlzIGZpZWxkIGlzIG5vIGxvbmdlciByZXR1cm5lZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBTTEZTdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQU0xGU3RhdHVzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZXN0aW1hdGVkIGRhdGUgYm9ycm93ZXIgd2lsbCBoYXZlIGNvbXBsZXRlZCAxMjAgcXVhbGlmeWluZyBtb250aGx5IHBheW1lbnRzLiBSZXR1cm5lZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBlc3RpbWF0ZWRfZWxpZ2liaWxpdHlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgdGhhdCBoYXZlIGJlZW4gbWFkZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQU0xGU3RhdHVzXG4gICAgICovXG4gICAgcGF5bWVudHNfbWFkZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHF1YWxpZnlpbmcgcGF5bWVudHMgcmVtYWluaW5nLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBTTEZTdGF0dXNcbiAgICAgKi9cbiAgICBwYXltZW50c19yZW1haW5pbmc6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgZGVmaW5lIHNwZWNpZmljIHBhcnRpZXMgdG8gYSBkZWFsLiBUaGlzIGluY2x1ZGVzIHRoZSBkaXJlY3QgcGFydGljaXBhdGluZyBwYXJ0aWVzLCBzdWNoIGFzIGJvcnJvd2VyIGFuZCBzZWxsZXIgYW5kIHRoZSBpbmRpcmVjdCBwYXJ0aWVzIHN1Y2ggYXMgdGhlIGNyZWRpdCByZXBvcnQgcHJvdmlkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0aWVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGFydHk+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0aWVzXG4gICAgICovXG4gICAgUEFSVFk6IEFycmF5PFBhcnR5Pjtcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lciBiZWluZyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkaXNwbGF5IHRoZSBlbmQgY3VzdG9tZXIgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSXQgd2lsbCBub3QgYmUgc2hvd24gdG8gZW5kIHVzZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEZW5vdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBwYXJ0bmVyIGhhcyBjb21wbGV0ZWQgYXR0ZXN0YXRpb24gb2YgZGlsaWdlbmNlIGZvciB0aGUgZW5kIGN1c3RvbWVyIHRvIGJlIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc19kaWxpZ2VuY2VfYXR0ZXN0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHByb2R1Y3RzIHRvIGJlIGVuYWJsZWQgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gdGhlIHByb2R1Y3RzIGVuYWJsZWQgZm9yIHRoZSByZXNlbGxlciBhdCB0aGUgdGltZSB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvZHVjdHM/OiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogSWYgYHRydWVgLCB0aGUgZW5kIGN1c3RvbWVyXFwncyBkZWZhdWx0IExpbmsgY3VzdG9taXphdGlvbiB3aWxsIGJlIHNldCB0byBtYXRjaCB0aGUgcGFydG5lclxcJ3MuIFlvdSBjYW4gYWx3YXlzIGNoYW5nZSB0aGUgZW5kIGN1c3RvbWVyXFwncyBMaW5rIGN1c3RvbWl6YXRpb24gaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gU2VlIHRoZSBbTGluayBDdXN0b21pemF0aW9uIGRvY3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9jdXN0b21pemF0aW9uLykgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjcmVhdGVfbGlua19jdXN0b21pemF0aW9uPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBCYXNlNjQtZW5jb2RlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZW5kIGN1c3RvbWVyXFwncyBsb2dvLiBNdXN0IGJlIGEgUE5HIG9mIHNpemUgMTAyNHgxMDI0IHVuZGVyIDRNQi4gVGhlIGxvZ28gd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFuZCBzaG93biB0byB0aGUgZW5kIHVzZXIgZHVyaW5nIExpbmsgZmxvd3MuIEEgbG9nbyBpcyByZXF1aXJlZCBpZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYHRydWVgLiBJZiBgY3JlYXRlX2xpbmtfY3VzdG9taXphdGlvbmAgaXMgYGZhbHNlYCBhbmQgdGhlIGxvZ28gaXMgb21pdHRlZCwgdGhlIHBhcnRuZXJcXCdzIGxvZ28gd2lsbCBiZSB1c2VkIGlmIG9uZSBleGlzdHMsIG90aGVyd2lzZSBhIHN0b2NrIGxvZ28gd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsb2dvPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGxlZ2FsIG5hbWUuIFRoaXMgd2lsbCBiZSBzaGFyZWQgd2l0aCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGFzIHBhcnQgb2YgdGhlIE9BdXRoIHJlZ2lzdHJhdGlvbiBwcm9jZXNzLiBJdCB3aWxsIG5vdCBiZSBzaG93biB0byBlbmQgdXNlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX2VudGl0eV9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgd2Vic2l0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2Vic2l0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uLiBUaGlzIHdpbGwgYmUgc2hvd24gdG8gZW5kIHVzZXJzIHdoZW4gdGhleSBnbyB0aHJvdWdoIHRoZSBQbGFpZCBMaW5rIGZsb3cuIFRoZSBhcHBsaWNhdGlvbiBuYW1lIG11c3QgYmUgdW5pcXVlIGFuZCBjYW5ub3QgbWF0Y2ggdGhlIG5hbWUgb2YgYW5vdGhlciBhcHBsaWNhdGlvbiBhbHJlYWR5IHJlZ2lzdGVyZWQgd2l0aCBQbGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXBwbGljYXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVjaG5pY2FsX2NvbnRhY3Q/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJpbGxpbmdfY29udGFjdD86IFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY3VzdG9tZXJfc3VwcG9ydF9pbmZvPzogUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mbztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M6IFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB3aGV0aGVyIHRoZSBwYXJ0bmVyIGhhcyBmb3J3YXJkZWQgdGhlIFBsYWlkIGJhbmsgYWRkZW5kdW0gdG8gdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX2JhbmtfYWRkZW5kdW1fY29tcGxldGVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnR9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NldHNfdW5kZXJfbWFuYWdlbWVudD86IFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgVVJJcyBpbmRpY2F0aW5nIHRoZSBkZXN0aW5hdGlvbihzKSB3aGVyZSBhIHVzZXIgY2FuIGJlIGZvcndhcmRlZCBhZnRlciBjb21wbGV0aW5nIHRoZSBMaW5rIGZsb3c7IHVzZWQgdG8gc3VwcG9ydCBPQXV0aCBhdXRoZW50aWNhdGlvbiBmbG93cyB3aGVuIGxhdW5jaGluZyBMaW5rIGluIHRoZSBicm93c2VyIG9yIGFub3RoZXIgYXBwLiBVUklzIHNob3VsZCBub3QgY29udGFpbiBhbnkgcXVlcnkgcGFyYW1ldGVycy4gV2hlbiB1c2VkIGluIFByb2R1Y3Rpb24sIFVSSXMgbXVzdCB1c2UgaHR0cHMuIFRvIHNwZWNpZnkgYW55IHN1YmRvbWFpbiwgdXNlIGAqYCBhcyBhIHdpbGRjYXJkIGNoYXJhY3RlciwgZS5nLiBgaHR0cHM6Ly9fKi5leGFtcGxlLmNvbS9vYXV0aC5odG1sYC4gVG8gbW9kaWZ5IHJlZGlyZWN0IFVSSXMgZm9yIGFuIGVuZCBjdXN0b21lciBhZnRlciBjcmVhdGluZyB0aGVtLCBnbyB0byB0aGUgZW5kIGN1c3RvbWVyXFwncyBbQVBJIHBhZ2VdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL2FwaSkgaW4gdGhlIERhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZGlyZWN0X3VyaXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCB0byBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBieSByZWd1bGF0b3J5IGF1dGhvcml0aWVzLCBpZiBhcHBsaWNhYmxlLiBGb3IgYmFua3MsIHRoaXMgaXMgdGhlIEZESUMgQ2VydGlmaWNhdGUgTnVtYmVyLiBGb3IgY3JlZGl0IHVuaW9ucywgdGhpcyBpcyB0aGUgQ3JlZGl0IFVuaW9uIENoYXJ0ZXIgTnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpc3RyYXRpb25fbnVtYmVyPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyRW5hYmxlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIHNlY3JldCBrZXkgZm9yIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdGlvbl9zZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJ9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyPzogUGFydG5lckVuZEN1c3RvbWVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3Qgc2NoZW1hIGZvciBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfY3VzdG9tZXJfY2xpZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL29hdXRoX2luc3RpdHV0aW9ucy9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgZmxvd2Rvd25fc3RhdHVzPzogUGFydG5lckVuZEN1c3RvbWVyRmxvd2Rvd25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBxdWVzdGlvbm5haXJlX3N0YXR1cz86IFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIE9BdXRoIGluc3RpdHV0aW9ucyB3aXRoIHdoaWNoIHRoZSBlbmQgY3VzdG9tZXJcXCdzIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHJlZ2lzdGVyZWQuXG4gICAgICogQHR5cGUge0FycmF5PFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25zPzogQXJyYXk8UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBjbGllbnRfaWRgIG9mIHRoZSBlbmQgY3VzdG9tZXIgdG8gYmUgcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXNwb25zZSBzY2hlbWEgZm9yIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZGV0YWlscyBmb3IgYW4gZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclxuICAgICAqL1xuICAgIGNvbXBhbnlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXM7XG59XG4vKipcbiAqIFRoZSBlbmQgY3VzdG9tZXJcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTy0zMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUgc3RhbmRhcmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnlfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQXNzZXRzIHVuZGVyIG1hbmFnZW1lbnQgZm9yIHRoZSBnaXZlbiBlbmQgY3VzdG9tZXIuIFJlcXVpcmVkIGZvciBlbmQgY3VzdG9tZXJzIHdpdGggbW9udGhseSBzZXJ2aWNlIGNvbW1pdG1lbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJBc3NldHNVbmRlck1hbmFnZW1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckFzc2V0c1VuZGVyTWFuYWdlbWVudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBiaWxsaW5nIGNvbnRhY3QgZm9yIHRoZSBlbmQgY3VzdG9tZXIuIERlZmF1bHRzIHRvIHBhcnRuZXJcXCdzIGJpbGxpbmcgY29udGFjdCBpZiBvbWl0dGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckJpbGxpbmdDb250YWN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyQmlsbGluZ0NvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJCaWxsaW5nQ29udGFjdFxuICAgICAqL1xuICAgIGVtYWlsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIGluZm9ybWF0aW9uIGlzIHB1YmxpYy4gVXNlcnMgb2YgeW91ciBhcHAgd2lsbCBzZWUgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIG1hbmFnaW5nIGNvbm5lY3Rpb25zIGJldHdlZW4geW91ciBhcHAgYW5kIHRoZWlyIGJhbmsgYWNjb3VudHMgaW4gUGxhaWQgUG9ydGFsLiBEZWZhdWx0cyB0byBwYXJ0bmVyXFwncyBjdXN0b21lciBzdXBwb3J0IGluZm8gaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyQ3VzdG9tZXJTdXBwb3J0SW5mb1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm8ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lckN1c3RvbWVyU3VwcG9ydEluZm9cbiAgICAgKi9cbiAgICBjb250YWN0X3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJDdXN0b21lclN1cHBvcnRJbmZvXG4gICAgICovXG4gICAgbGlua191cGRhdGVfdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBhZGRlbmR1bSB0byB0aGUgUGxhaWQgTVNBIChcXFwiZmxvd2Rvd25cXFwiKSBmb3IgdGhlIGVuZCBjdXN0b21lci5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lckZsb3dkb3duU3RhdHVzIHtcbiAgICBOb3RTdGFydGVkID0gJ05PVF9TVEFSVEVEJyxcbiAgICBJblJldmlldyA9ICdJTl9SRVZJRVcnLFxuICAgIE5lZ290aWF0aW9uID0gJ05FR09USUFUSU9OJyxcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURSdcbn1cblxuLyoqXG4gKiBUaGUgT0F1dGggcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIGVudmlyb25tZW50cz86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHM7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb24gd2hpY2ggdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24gd2FzIGFwcHJvdmVkIGJ5IHRoZSBpbnN0aXR1dGlvbiwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZWlyIGFwcGxpY2F0aW9uIGhhcyBub3QgeWV0IGJlZW4gYXBwcm92ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvblxuICAgICAqL1xuICAgIHByb2R1Y3Rpb25fZW5hYmxlbWVudF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCBub24tT0F1dGggSXRlbSBhZGRzIHdpbGwgbm8gbG9uZ2VyIGJlIHN1cHBvcnRlZCBmb3IgdGhpcyBpbnN0aXR1dGlvbiwgb3IgYW4gZW1wdHkgc3RyaW5nIGlmIG5vIHN1Y2ggZGF0ZSBoYXMgYmVlbiBzZXQgYnkgdGhlIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25cbiAgICAgKi9cbiAgICBjbGFzc2ljX2Rpc2FibGVtZW50X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVnaXN0cmF0aW9uIHN0YXR1cyBmb3IgdGhlIGVuZCBjdXN0b21lclxcJ3MgYXBwbGljYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgQXBwcm92ZWQgPSAnQVBQUk9WRUQnLFxuICAgIEVuYWJsZWQgPSAnRU5BQkxFRCcsXG4gICAgQXR0ZW50aW9uUmVxdWlyZWQgPSAnQVRURU5USU9OX1JFUVVJUkVEJ1xufVxuXG4vKipcbiAqIFJlZ2lzdHJhdGlvbiBzdGF0dXNlcyBieSBlbnZpcm9ubWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkVudmlyb25tZW50c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uQXBwbGljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25FbnZpcm9ubWVudHNcbiAgICAgKi9cbiAgICBkZXZlbG9wbWVudD86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbkFwcGxpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uRW52aXJvbm1lbnRzXG4gICAgICovXG4gICAgcHJvZHVjdGlvbj86IFBhcnRuZXJFbmRDdXN0b21lck9BdXRoSW5zdGl0dXRpb25BcHBsaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogVGhlIE9BdXRoIHN0YXR1cyBvZiB0aGUgdXBkYXRlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRWYWx1ZXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnbm90LXN0YXJ0ZWQnLFxuICAgIFByb2Nlc3NpbmcgPSAncHJvY2Vzc2luZycsXG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIEVuYWJsZWQgPSAnZW5hYmxlZCcsXG4gICAgQXR0ZW50aW9uUmVxdWlyZWQgPSAnYXR0ZW50aW9uLXJlcXVpcmVkJ1xufVxuXG4vKipcbiAqIFRoZSB3ZWJob29rIG9mIHR5cGUgYFBBUlRORVJgIGFuZCBjb2RlIGBFTkRfQ1VTVE9NRVJfT0FVVEhfU1RBVFVTX1VQREFURURgIHdpbGwgYmUgZmlyZWQgd2hlbiBhIHBhcnRuZXJcXCdzIGVuZCBjdXN0b21lciBoYXMgYW4gdXBkYXRlIG9uIHRoZWlyIE9BdXRoIHJlZ2lzdHJhdGlvbiBzdGF0dXMgd2l0aCBhbiBpbnN0aXR1dGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBQQVJUTkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgRU5EX0NVU1RPTUVSX09BVVRIX1NUQVRVU19VUERBVEVEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgZW5kX2N1c3RvbWVyX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbiBJRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lck9BdXRoU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnN0aXR1dGlvbiBuYW1lXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkV2ViaG9va1xuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGFydG5lckVuZEN1c3RvbWVyT0F1dGhTdGF0dXNVcGRhdGVkVmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXJ0bmVyRW5kQ3VzdG9tZXJPQXV0aFN0YXR1c1VwZGF0ZWRWYWx1ZXM7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjdXJpdHkgcXVlc3Rpb25uYWlyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnRuZXJFbmRDdXN0b21lclF1ZXN0aW9ubmFpcmVTdGF0dXMge1xuICAgIE5vdFN0YXJ0ZWQgPSAnTk9UX1NUQVJURUQnLFxuICAgIFJlY2VpdmVkID0gJ1JFQ0VJVkVEJyxcbiAgICBDb21wbGV0ZSA9ICdDT01QTEVURSdcbn1cblxuLyoqXG4gKiBUaGUgc2VjcmV0cyBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgZW5kIGN1c3RvbWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0c1xuICAgICAqL1xuICAgIHNhbmRib3g/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBjdXN0b21lclxcJ3Mgc2VjcmV0IGtleSBmb3IgdGhlIERldmVsb3BtZW50IGVudmlyb25tZW50LiBUaGUgRGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgaGFzIGJlZW4gcmVtb3ZlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBkZXZlbG9wbWVudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGN1c3RvbWVyXFwncyBzZWNyZXQga2V5IGZvciB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gVGhlIGVuZCBjdXN0b21lciB3aWxsIGJlIHByb3ZpZGVkIHdpdGggYSBsaW1pdGVkIG51bWJlciBvZiBjcmVkaXRzIHRvIHRlc3QgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgYmVmb3JlIGZ1bGwgZW5hYmxlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJTZWNyZXRzXG4gICAgICovXG4gICAgcHJvZHVjdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgZ2l2ZW4gZW5kIGN1c3RvbWVyLiAgYFVOREVSX1JFVklFV2A6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gY3JlYXRlZCBhbmQgZW5hYmxlZCBpbiBTYW5kYm94IGFuZCBMaW1pdGVkIFByb2R1Y3Rpb24uIFRoZSBlbmQgY3VzdG9tZXIgbXVzdCBiZSBtYW51YWxseSByZXZpZXdlZCBieSB0aGUgUGxhaWQgdGVhbSBiZWZvcmUgaXQgY2FuIGJlIGVuYWJsZWQgaW4gZnVsbCBwcm9kdWN0aW9uLCBhdCB3aGljaCBwb2ludCBpdHMgc3RhdHVzIHdpbGwgYXV0b21hdGljYWxseSB0cmFuc2l0aW9uIHRvIGBQRU5ESU5HX0VOQUJMRU1FTlRgIG9yIGBERU5JRURgLiAgYFBFTkRJTkdfRU5BQkxFTUVOVGA6IFRoZSBlbmQgY3VzdG9tZXIgaXMgcmVhZHkgdG8gYmUgZnVsbHkgZW5hYmxlZCBpbiB0aGUgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC4gQ2FsbCB0aGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgdG8gZW5hYmxlIHRoZSBlbmQgY3VzdG9tZXIgaW4gZnVsbCBQcm9kdWN0aW9uLiAgYEFDVElWRWA6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gZnVsbHkgZW5hYmxlZCBpbiBhbGwgZW52aXJvbm1lbnRzLiAgYERFTklFRGA6IFRoZSBlbmQgY3VzdG9tZXIgaGFzIGJlZW4gY3JlYXRlZCBhbmQgZW5hYmxlZCBpbiBTYW5kYm94IGFuZCBMaW1pdGVkIFByb2R1Y3Rpb24sIGJ1dCBpdCBkaWQgbm90IHBhc3MgcmV2aWV3IGJ5IHRoZSBQbGFpZCB0ZWFtIGFuZCB0aGVyZWZvcmUgY2Fubm90IGJlIGVuYWJsZWQgZm9yIGZ1bGwgUHJvZHVjdGlvbiBhY2Nlc3MuIFRhbGsgdG8geW91ciBBY2NvdW50IE1hbmFnZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXMge1xuICAgIFVuZGVyUmV2aWV3ID0gJ1VOREVSX1JFVklFVycsXG4gICAgUGVuZGluZ0VuYWJsZW1lbnQgPSAnUEVORElOR19FTkFCTEVNRU5UJyxcbiAgICBBY3RpdmUgPSAnQUNUSVZFJyxcbiAgICBEZW5pZWQgPSAnREVOSUVEJ1xufVxuXG4vKipcbiAqIFRoZSB0ZWNobmljYWwgY29udGFjdCBmb3IgdGhlIGVuZCBjdXN0b21lci4gRGVmYXVsdHMgdG8gcGFydG5lclxcJ3MgdGVjaG5pY2FsIGNvbnRhY3QgaWYgb21pdHRlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyVGVjaG5pY2FsQ29udGFjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBnaXZlbl9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lclRlY2huaWNhbENvbnRhY3RcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0bmVyRW5kQ3VzdG9tZXJUZWNobmljYWxDb250YWN0XG4gICAgICovXG4gICAgZW1haWw/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkZXRhaWxzIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBlbmQgY3VzdG9tZXIsIGluY2x1ZGluZyBzZWNyZXRzIGZvciBTYW5kYm94IGFuZCBMaW1pdGVkIFByb2R1Y3Rpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBgY2xpZW50X2lkYCBvZiB0aGUgZW5kIGN1c3RvbWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBQYXJ0bmVyRW5kQ3VzdG9tZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzXG4gICAgICovXG4gICAgc2VjcmV0cz86IFBhcnRuZXJFbmRDdXN0b21lclNlY3JldHM7XG59XG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0bmVyRW5kQ3VzdG9tZXJXaXRoU2VjcmV0c0FsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydG5lckVuZEN1c3RvbWVyV2l0aFNlY3JldHNBbGxPZiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnRuZXJFbmRDdXN0b21lclNlY3JldHN9XG4gICAgICogQG1lbWJlcm9mIFBhcnRuZXJFbmRDdXN0b21lcldpdGhTZWNyZXRzQWxsT2ZcbiAgICAgKi9cbiAgICBzZWNyZXRzPzogUGFydG5lckVuZEN1c3RvbWVyU2VjcmV0cztcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHBhcnR5IHRvIGEgdHJhbnNhY3Rpb24uIEluY2x1ZGVkIGRpcmVjdCBwYXJ0aWNpcGFudHMgbGlrZSB0aGUgYm9ycm93ZXIgYW5kIHNlbGxlciBhcyB3ZWxsIGFzIGluZGlyZWN0IHBhcnRpY2lwYW50cyBzdWNoIGFzIHRoZSBmbG9vZCBjZXJ0aWZpY2F0ZSBwcm92aWRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0eSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnR5SW5kaXZpZHVhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBJTkRJVklEVUFMOiBQYXJ0eUluZGl2aWR1YWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXJ0eVxuICAgICAqL1xuICAgIFJPTEVTOiBSb2xlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VGF4cGF5ZXJJZGVudGlmaWVyc31cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlcbiAgICAgKi9cbiAgICBUQVhQQVlFUl9JREVOVElGSUVSUzogVGF4cGF5ZXJJZGVudGlmaWVycztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJ0eUluZGl2aWR1YWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsTmFtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGFydHlJbmRpdmlkdWFsXG4gICAgICovXG4gICAgTkFNRTogSW5kaXZpZHVhbE5hbWU7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIGRlZmluZWQgbGlzdCB0aGF0IGlkZW50aWZpZXMgdGhlIHJvbGUgdGhhdCB0aGUgcGFydHkgcGxheXMgaW4gdGhlIHRyYW5zYWN0aW9uLiBQYXJ0aWVzIG1heSBiZSBlaXRoZXIgYSBwZXJzb24gb3IgbGVnYWwgZW50aXR5LiBBIHBhcnR5IG1heSBwbGF5IG11bHRpcGxlIHJvbGVzIGluIGEgdHJhbnNhY3Rpb24uQSB2YWx1ZSBmcm9tIGEgTUlTTU8gZGVmaW5lZCBsaXN0IHRoYXQgaWRlbnRpZmllcyB0aGUgcm9sZSB0aGF0IHRoZSBwYXJ0eSBwbGF5cyBpbiB0aGUgdHJhbnNhY3Rpb24uIFBhcnRpZXMgbWF5IGJlIGVpdGhlciBhIHBlcnNvbiBvciBsZWdhbCBlbnRpdHkuIEEgcGFydHkgbWF5IHBsYXkgbXVsdGlwbGUgcm9sZXMgaW4gYSB0cmFuc2FjdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBhcnR5Um9sZVR5cGUge1xuICAgIEJvcnJvd2VyID0gJ0JvcnJvd2VyJ1xufVxuXG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYSBtb25ldGFyeSBhbW91bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheSB7XG4gICAgLyoqXG4gICAgICogQSBudW1lcmljYWwgYW1vdW50IG9mIGEgc3BlY2lmaWMgY3VycmVuY3kuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5XG4gICAgICovXG4gICAgYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW5jeSBjb2RlLCBlLmcuIFVTRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGZyZXF1ZW5jeSBvZiB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5RnJlcXVlbmN5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5RnJlcXVlbmN5VmFsdWV9XG4gICAgICogQG1lbWJlcm9mIFBheUZyZXF1ZW5jeVxuICAgICAqL1xuICAgIHZhbHVlOiBQYXlGcmVxdWVuY3lWYWx1ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VmVyaWZpY2F0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlGcmVxdWVuY3lcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBWZXJpZmljYXRpb25TdGF0dXM7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgb2YgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXlGcmVxdWVuY3lWYWx1ZSB7XG4gICAgTW9udGhseSA9ICdtb250aGx5JyxcbiAgICBTZW1pbW9udGhseSA9ICdzZW1pbW9udGhseScsXG4gICAgV2Vla2x5ID0gJ3dlZWtseScsXG4gICAgQml3ZWVrbHkgPSAnYml3ZWVrbHknLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHBheSBwZXJpb2QuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVBlcmlvZERldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlQZXJpb2REZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgY2hlY2tfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8RGlzdHJpYnV0aW9uQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd24/OiBBcnJheTxEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXkgcGVyaW9kIGVuZCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRvdGFsIGVhcm5pbmdzIGJlZm9yZSB0YXgvZGVkdWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgZ3Jvc3NfZWFybmluZ3M/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2ZyZXF1ZW5jeT86IFBheVBlcmlvZERldGFpbHNQYXlGcmVxdWVuY3kgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXlzdHViIHdhcyBpc3N1ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoXFxcInl5eXktbW0tZGRcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBwYXlfZGF5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBzdGFydCBkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQ6IFxcXCJ5eXl5LW1tLWRkXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeSB7XG4gICAgUGF5RnJlcXVlbmN5VW5rbm93biA9ICdQQVlfRlJFUVVFTkNZX1VOS05PV04nLFxuICAgIFBheUZyZXF1ZW5jeVdlZWtseSA9ICdQQVlfRlJFUVVFTkNZX1dFRUtMWScsXG4gICAgUGF5RnJlcXVlbmN5Qml3ZWVrbHkgPSAnUEFZX0ZSRVFVRU5DWV9CSVdFRUtMWScsXG4gICAgUGF5RnJlcXVlbmN5U2VtaW1vbnRobHkgPSAnUEFZX0ZSRVFVRU5DWV9TRU1JTU9OVEhMWScsXG4gICAgUGF5RnJlcXVlbmN5TW9udGhseSA9ICdQQVlfRlJFUVVFTkNZX01PTlRITFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogUmF3IGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uIGxpbmUgaXRlbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHRvdGFsIGRlZHVjdGlvbnMgZm9yIHRoZSBwYXkgcGVyaW9kXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGVkdWN0aW9uc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb25cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGVkdWN0aW9uc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGxpbmUgaXRlbS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEZWR1Y3Rpb25zVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBOYW1lIG9mIHRoZSBhY2NvdW50IGZvciB0aGUgZ2l2ZW4gZGlzdHJpYnV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGJhbmsgdGhhdCB0aGUgcGF5bWVudCBpcyBiZWluZyBkZXBvc2l0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IGRpc3RyaWJ1dGVkIHRvIHRoaXMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIG5ldCBwYXkuIEFsd2F5cyBgbnVsbGAgaWYgYHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkRpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDItNCBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvZiBhbiBhY2NvdW50XFwncyBvZmZpY2lhbCBhY2NvdW50IG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIHRoZSBhY2NvdW50IHRoYXQgdGhlIHBheXN0dWIgd2FzIHNlbnQgdG8gKGUuZy4gXFwnY2hlY2tpbmdcXCcpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlYXJuaW5ncyBsaW5lIGl0ZW1zIGZvciB0aGUgcGF5IHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBDb21tb25seSB1c2VkIHRlcm0gdG8gZGVzY3JpYmUgdGhlIGVhcm5pbmcgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGhvdXJzIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvdXJseSByYXRlIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICByYXRlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsaW5lIGl0ZW0uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgYm90aCB0aGUgY3VycmVudCBwYXkgcGVyaW9kIGFuZCB5ZWFyIHRvIGRhdGUgYW1vdW50IGZvciBhbiBlYXJuaW5nIGNhdGVnb3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViRWFybmluZ3NUb3RhbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJFYXJuaW5nc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBhbW91bnQgb2YgdGhlIGVhcm5pbmdzIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICBob3VyczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViRWFybmluZ3NUb3RhbFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZWFybmluZ3MuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YkVhcm5pbmdzVG90YWxcbiAgICAgKi9cbiAgICB5dGRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXljaGVjay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGRpc3RyaWJ1dGlvbl9icmVha2Rvd246IEFycmF5PFBheVN0dWJEaXN0cmlidXRpb25CcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgcGVyaW9kIGVuZGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBncm9zc19lYXJuaW5nczogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbmV0IHBheS4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBwYXkgc3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NyZWRpdFBheVN0dWJQYXlCYXNpc1R5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheVN0dWJQYXlQZXJpb2REZXRhaWxzXG4gICAgICovXG4gICAgcGF5X2Jhc2lzPzogQ3JlZGl0UGF5U3R1YlBheUJhc2lzVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5IHBlcmlvZCBzdGFydGVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5U3R1YlBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBzdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGF4cGF5ZXIgSUQgb2YgdGhlIGluZGl2aWR1YWwgcmVjZWl2aW5nIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlTdHViVGF4cGF5ZXJJRFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheVN0dWJUYXhwYXllcklEIHtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX3R5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgbWFzazsgaS5lLiBsYXN0IDQgZGlnaXRzIG9mIHRoZSB0YXhwYXllciBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlTdHViVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX21hc2s6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuIE1pbmltdW0gYWNjZXB0ZWQgdmFsdWUgaXMgYDFgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgcGF5bWVudC4gRm9yIHN0YW5kaW5nIG9yZGVycyBhbmQgcGF5bWVudCBjb25zZW50cywgYFxcXCJHQlBcXFwiYCBtdXN0IGJlIHVzZWQuIEZvciBQb2xhbmQsIERlbm1hcmssIFN3ZWRlbiBhbmQgTm9yd2F5LCBvbmx5IHRoZSBsb2NhbCBjdXJyZW5jeSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEFtb3VudEN1cnJlbmN5IHtcbiAgICBHYnAgPSAnR0JQJyxcbiAgICBFdXIgPSAnRVVSJyxcbiAgICBQbG4gPSAnUExOJyxcbiAgICBTZWsgPSAnU0VLJyxcbiAgICBEa2sgPSAnREtLJyxcbiAgICBOb2sgPSAnTk9LJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgcGF5bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50QW1vdW50TnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50QW1vdW50TnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnROdWxsYWJsZVxuICAgICAqL1xuICAgIGN1cnJlbmN5OiBQYXltZW50QW1vdW50Q3VycmVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5bWVudC4gTXVzdCBjb250YWluIGF0IG1vc3QgdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBgMS4yM2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudE51bGxhYmxlXG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogVGhlIGFtb3VudCBhbmQgY3VycmVuY3kgb2YgYSBwYXltZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRBbW91bnRSZWZ1bmRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRBbW91bnRSZWZ1bmRlZCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRDdXJyZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEFtb3VudFJlZnVuZGVkXG4gICAgICovXG4gICAgY3VycmVuY3k6IFBheW1lbnRBbW91bnRDdXJyZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBwYXltZW50LiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50UmVmdW5kZWRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBUaGUgYW1vdW50IGFuZCBjdXJyZW5jeSBvZiBhIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFRvUmVmdW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEFtb3VudFRvUmVmdW5kIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50QW1vdW50VG9SZWZ1bmRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRBbW91bnRUb1JlZnVuZFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIFRoZSBjaGFubmVsIHVzZWQgdG8gbWFrZSBhIHBheW1lbnQuIGBvbmxpbmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBpbiBzdG9yZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYG90aGVyOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50Q2hhbm5lbCB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogTWF4aW11bSBhbW91bnQgb2YgYSBzaW5nbGUgcGF5bWVudCBpbml0aWF0ZWQgdXNpbmcgdGhlIHBheW1lbnQgY29uc2VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudEN1cnJlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudE1heFBheW1lbnRBbW91bnRcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xufVxuLyoqXG4gKiBXaGVyZSB0aGUgcGF5bWVudCBjb25zZW50IHBlcmlvZCBzaG91bGQgc3RhcnQuICBJZiB0aGUgaW5zdGl0dXRpb24gaXMgTW9uem8sIG9ubHkgYENPTlNFTlRgIGFsaWdubWVudHMgYXJlIHN1cHBvcnRlZC4gIGBDQUxFTkRBUmA6IGxpbmUgdXAgd2l0aCBhIGNhbGVuZGFyLiAgYENPTlNFTlRgOiBvbiB0aGUgZGF0ZSBvZiBjb25zZW50IGNyZWF0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0FsaWdubWVudCB7XG4gICAgQ2FsZW5kYXIgPSAnQ0FMRU5EQVInLFxuICAgIENvbnNlbnQgPSAnQ09OU0VOVCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGNvbnNlbnQgcGF5bWVudHMgbGltaXRhdGlvbnMgcGVyIHBlcmlvZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljSW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRcbiAgICAgKi9cbiAgICBpbnRlcnZhbDogUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50XG4gICAgICovXG4gICAgYWxpZ25tZW50OiBQYXltZW50Q29uc2VudFBlcmlvZGljQWxpZ25tZW50O1xufVxuLyoqXG4gKiBNYXhpbXVtIGN1bXVsYXRpdmUgYW1vdW50IGZvciBhbGwgcGF5bWVudHMgaW4gdGhlIHNwZWNpZmllZCBpbnRlcnZhbC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudENvbnNlbnRQZXJpb2RpY0Ftb3VudEFtb3VudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50Q3VycmVuY3l9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50UGVyaW9kaWNBbW91bnRBbW91bnRcbiAgICAgKi9cbiAgICBjdXJyZW5jeTogUGF5bWVudEFtb3VudEN1cnJlbmN5O1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHBheW1lbnQuIE11c3QgY29udGFpbiBhdCBtb3N0IHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gYDEuMjNgLiBNaW5pbXVtIGFjY2VwdGVkIHZhbHVlIGlzIGAxYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50QW1vdW50XG4gICAgICovXG4gICAgdmFsdWU6IG51bWJlcjtcbn1cbi8qKlxuICogUGF5bWVudCBjb25zZW50IHBlcmlvZGljIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudENvbnNlbnRQZXJpb2RpY0ludGVydmFsIHtcbiAgICBEYXkgPSAnREFZJyxcbiAgICBXZWVrID0gJ1dFRUsnLFxuICAgIE1vbnRoID0gJ01PTlRIJyxcbiAgICBZZWFyID0gJ1lFQVInXG59XG5cbi8qKlxuICogTGlmZSBzcGFuIGZvciB0aGUgcGF5bWVudCBjb25zZW50LiBBZnRlciB0aGUgYHRvYCBkYXRlIHRoZSBwYXltZW50IGNvbnNlbnQgZXhwaXJlcyBhbmQgY2FuIG5vIGxvbmdlciBiZSB1c2VkIGZvciBwYXltZW50IGluaXRpYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgZnJvbSB3aGljaCB0aGUgY29uc2VudCBzaG91bGQgYmUgYWN0aXZlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lXG4gICAgICovXG4gICAgZnJvbT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgYW5kIHRpbWUgYXQgd2hpY2ggdGhlIGNvbnNlbnQgZXhwaXJlcywgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRDb25zZW50VmFsaWREYXRlVGltZVxuICAgICAqL1xuICAgIHRvPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG9wdGlvbmFsIGFkZHJlc3Mgb2YgdGhlIHBheW1lbnQgcmVjaXBpZW50XFwncyBiYW5rIGFjY291bnQuIFJlcXVpcmVkIGJ5IG1vc3QgaW5zdGl0dXRpb25zIG91dHNpZGUgb2YgdGhlIFVLLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGxlbmd0aCAxLTIgcmVwcmVzZW50aW5nIHRoZSBzdHJlZXQgYWRkcmVzcyB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuIE1heGltdW0gb2YgNzAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFRoZSBjaXR5IHdoZXJlIHRoZSByZWNpcGllbnQgaXMgbG9jYXRlZC4gTWF4aW11bSBvZiAzNSBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQWRkcmVzc1xuICAgICAqL1xuICAgIGNpdHk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgd2hlcmUgdGhlIHJlY2lwaWVudCBpcyBsb2NhdGVkLiBNYXhpbXVtIG9mIDE2IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSB3aGVyZSB0aGUgcmVjaXBpZW50IGlzIGxvY2F0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25BZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQgZGVmaW5lcyBhIHBheW1lbnQgaW5pdGlhdGlvbiBjb25zZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25zZW50IElELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnNlbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBjb25zZW50IGlzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHBheW1lbnQgY29uc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIGNvbnN0cmFpbnRzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50cztcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkLCB1c2UgdGhlIFxcJ3R5cGVcXCcgZmllbGQgaW5zdGVhZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGU+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNjb3Blcz86IEFycmF5PFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFNjb3BlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50XG4gICAgICovXG4gICAgdHlwZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFxuICAgICAqL1xuICAgIHBheWVyX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbn1cbi8qKlxuICogTGltaXRhdGlvbnMgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gcGF5bWVudHMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50Q29uc2VudFZhbGlkRGF0ZVRpbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzXG4gICAgICovXG4gICAgdmFsaWRfZGF0ZV90aW1lPzogUGF5bWVudENvbnNlbnRWYWxpZERhdGVUaW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDb25zdHJhaW50c1xuICAgICAqL1xuICAgIG1heF9wYXltZW50X2Ftb3VudDogUGF5bWVudENvbnNlbnRNYXhQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbW91bnQgbGltaXRhdGlvbnMgcGVyIHBlcmlvZCBvZiB0aW1lLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHNcbiAgICAgKi9cbiAgICBwZXJpb2RpY19hbW91bnRzOiBBcnJheTxQYXltZW50Q29uc2VudFBlcmlvZGljQW1vdW50Pjtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhlIHBheW1lbnQgY29uc2VudCBpcyBmb3IuIFRoZSBjcmVhdGVkIGNvbnNlbnQgY2FuIGJlIHVzZWQgdG8gdHJhbnNmZXIgZnVuZHMgdG8gdGhpcyByZWNpcGllbnQgb25seS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggYXQgbW9zdCAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnQgY29uc2VudCBzY29wZXMuXG4gICAgICogQHR5cGUge1NldDxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHNjb3Blcz86IFNldDxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0eXBlPzogUGF5bWVudEluaXRpYXRpb25Db25zZW50VHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zdHJhaW50czogUGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3B0aW9ucz86IEV4dGVybmFsUGF5bWVudEluaXRpYXRpb25Db25zZW50T3B0aW9ucyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheWVyX2RldGFpbHM/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHMgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGNvbnNlbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9jb25zZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBDb25zZW50IGNyZWF0aW9uIHRpbWVzdGFtcCwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoZSBwYXltZW50IGNvbnNlbnQgaXMgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q29uc3RyYWludHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY29uc3RyYWludHM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENvbnN0cmFpbnRzO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQsIHVzZSB0aGUgXFwndHlwZVxcJyBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBzY29wZXM/OiBBcnJheTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZT47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHlwZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5ZXJfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcGF5bWVudCBjb25zZW50IHBheWVyIGRldGFpbHMuICBQYXllciBgbmFtZWAgYW5kIGFjY291bnQgYG51bWJlcnNgIGFyZSByZXF1aXJlZCB0byBsb2NrIHRoZSBhY2NvdW50IHRvIHdoaWNoIHRoZSBjb25zZW50IGNhbiBiZSBjcmVhdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwYXllciBhcyBpdCBhcHBlYXJzIGluIHRoZWlyIGJhbmsgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyRGV0YWlsc1xuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJOdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBudW1iZXJzOiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllck51bWJlcnM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJEZXRhaWxzXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyXFwncyBiaXJ0aGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJEZXRhaWxzXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheWVyXFwncyBwaG9uZSBudW1iZXJzIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfVxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXJzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXJcXCdzIGVtYWlsc1xuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXllckRldGFpbHNcbiAgICAgKi9cbiAgICBlbWFpbHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUaGUgY291bnRlcnBhcnR5XFwncyBiYW5rIGFjY291bnQgbnVtYmVycy4gRXhhY3RseSBvbmUgb2YgSUJBTiBvciBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheWVyTnVtYmVyc1xuICAgICAqL1xuICAgIGJhY3M/OiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0lCQU5OdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5ZXJOdW1iZXJzXG4gICAgICovXG4gICAgaWJhbj86IE51bWJlcnNJQkFOTnVsbGFibGUgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgY29uc2VudCBwYXltZW50LiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIGNvbnNlbnQgcGF5bWVudCBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBwYXltZW50IGlzIGNyZWF0ZWQuIElmIHRoZSByZXF1ZXN0IHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLCBpdCB3aWxsIHByZXZlbnQgYW55IHBheW1lbnQgdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gNDggaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyAoc2luY2Ugbm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGVtKS4gSWYgbm90IHByb3ZpZGVkLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgZmFsbCBiYWNrIHRvIHRoZSByZWZlcmVuY2UgZnJvbSBjb25zZW50LiBJbiBvcmRlciB0byB0cmFjayBzZXR0bGVtZW50IHZpYSBQYXltZW50IENvbmZpcm1hdGlvbiwgZWFjaCBwYXltZW50IG11c3QgaGF2ZSBhIHVuaXF1ZSByZWZlcmVuY2UuIElmIHRoZSByZWZlcmVuY2UgcHJvdmlkZWQgdGhyb3VnaCB0aGUgQVBJIGlzIG5vdCB1bmlxdWUsIFBsYWlkIHdpbGwgYWRqdXN0IGl0LiBTb21lIGluc3RpdHV0aW9ucyBtYXkgbGltaXQgdGhlIHJlZmVyZW5jZSB0byBsZXNzIHRoYW4gMTggY2hhcmFjdGVycy4gSWYgbmVjZXNzYXJ5LCBQbGFpZCB3aWxsIGFkanVzdCB0aGUgcmVmZXJlbmNlIGJ5IHRydW5jYXRpbmcgaXQgdG8gZml0IHRoZSBpbnN0aXR1dGlvblxcJ3MgcmVxdWlyZW1lbnRzLiBCb3RoIHRoZSBvcmlnaW5hbGx5IHByb3ZpZGVkIGFuZCBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIHJlZmVyZW5jZXMgKGlmIGFueSkgY2FuIGJlIGZvdW5kIGluIHRoZSBgcmVmZXJlbmNlYCBhbmQgYGFkanVzdGVkX3JlZmVyZW5jZWAgZmllbGRzLCByZXNwZWN0aXZlbHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGUgJiBzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc2NvcGU/OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTY29wZSAmIHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UHJvY2Vzc2luZ01vZGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3NpbmdfbW9kZT86IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFByb2Nlc3NpbmdNb2RlO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcGF5bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWNpZGVzIHRoZSBtb2RlIHVuZGVyIHdoaWNoIHRoZSBwYXltZW50IHByb2Nlc3Npbmcgc2hvdWxkIGJlIHBlcmZvcm1lZCwgdXNpbmcgYElNTUVESUFURWAgYXMgZGVmYXVsdC4gIGBJTU1FRElBVEVgOiBXaWxsIGltbWVkaWF0ZWx5IGV4ZWN1dGUgdGhlIHBheW1lbnQsIHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UgZnJvbSB0aGUgQVNQU1AgYmVmb3JlIHJldHVybmluZyB0aGUgcmVzdWx0IG9mIHRoZSBwYXltZW50IGluaXRpYXRpb24uIFRoaXMgaXMgaWRlYWwgZm9yIHVzZXItcHJlc2VudCBmbG93cy4gICBgQVNZTkNgOiBXaWxsIGFjY2VwdCBhIHBheW1lbnQgZXhlY3V0aW9uIHJlcXVlc3QgYW5kIHNjaGVkdWxlIGl0IGZvciBwcm9jZXNzaW5nLCBpbW1lZGlhdGVseSByZXR1cm5pbmcgdGhlIG5ldyBgcGF5bWVudF9pZGAuIExpc3RlbiBmb3Igd2ViaG9va3Mgb3IgdXNlIHRoZSBbYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9wYXltZW50LWluaXRpYXRpb24vI3BheW1lbnRfaW5pdGlhdGlvbnBheW1lbnRnZXQpIGVuZHBvaW50IHRvIG9idGFpbiB1cGRhdGVzIG9uIHRoZSBwYXltZW50IHN0YXR1cy4gVGhpcyBpcyBpZGVhbCBmb3Igbm9uIHVzZXItcHJlc2VudCBmbG93cy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFByb2Nlc3NpbmdNb2RlIHtcbiAgICBBc3luYyA9ICdBU1lOQycsXG4gICAgSW1tZWRpYXRlID0gJ0lNTUVESUFURSdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3Jldm9rZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29uc2VudCBJRC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0YXRpb24vY29uc2VudC9yZXZva2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgY29uc2VudCBgdHlwZWAgZmllbGQuIENvbnNlbnRzIGFyZSByZXF1aXJlZCB0byBoYXZlIGEgc2luZ2xlIHR5cGUuICAgUGF5bWVudCBjb25zZW50IHNjb3BlLiBEZWZpbmVzIHBvc3NpYmxlIGRpcmVjdGlvbnMgZm9yIHBheW1lbnRzIG1hZGUgd2l0aCB0aGUgZ2l2ZW4gY29uc2VudC4gIGBNRV9UT19NRWA6IEFsbG93cyBtb3ZpbmcgbW9uZXkgYmV0d2VlbiBhY2NvdW50cyBvd25lZCBieSB0aGUgc2FtZSB1c2VyLiAgYEVYVEVSTkFMYDogQWxsb3dzIGluaXRpYXRpbmcgcGF5bWVudHMgZnJvbSB0aGUgdXNlclxcJ3MgYWNjb3VudCB0byB0aGlyZCBwYXJ0aWVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U2NvcGUge1xuICAgIE1lVG9NZSA9ICdNRV9UT19NRScsXG4gICAgRXh0ZXJuYWwgPSAnRVhURVJOQUwnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgcGF5bWVudCBjb25zZW50LiAgYFVOQVVUSE9SSVNFRGA6IENvbnNlbnQgY3JlYXRlZCwgYnV0IHJlcXVpcmVzIHVzZXIgYXV0aG9yaXNhdGlvbi4gIGBSRUpFQ1RFRGA6IENvbnNlbnQgYXV0aG9yaXNhdGlvbiB3YXMgcmVqZWN0ZWQgYnkgdGhlIHVzZXIgYW5kL29yIHRoZSBiYW5rLiAgYEFVVEhPUklTRURgOiBDb25zZW50IGlzIGFjdGl2ZSBhbmQgcmVhZHkgdG8gYmUgdXNlZC4gIGBSRVZPS0VEYDogQ29uc2VudCBoYXMgYmVlbiByZXZva2VkIGFuZCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQuICBgRVhQSVJFRGA6IENvbnNlbnQgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzIHtcbiAgICBVbmF1dGhvcmlzZWQgPSAnVU5BVVRIT1JJU0VEJyxcbiAgICBBdXRob3Jpc2VkID0gJ0FVVEhPUklTRUQnLFxuICAgIFJldm9rZWQgPSAnUkVWT0tFRCcsXG4gICAgUmVqZWN0ZWQgPSAnUkVKRUNURUQnLFxuICAgIEV4cGlyZWQgPSAnRVhQSVJFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBwYXltZW50IGNvbnNlbnQgaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9JTklUSUFUSU9OYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgQ09OU0VOVF9TVEFUVVNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGlkYCBmb3IgdGhlIGNvbnNlbnQgYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBjb25zZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9sZF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogUGF5bWVudEluaXRpYXRpb25Db25zZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHVwZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQYXltZW50IGNvbnNlbnQgdHlwZS4gRGVmaW5lcyBwb3NzaWJsZSB1c2UgY2FzZSBmb3IgcGF5bWVudHMgbWFkZSB3aXRoIHRoZSBnaXZlbiBjb25zZW50LiAgYFNXRUVQSU5HYDogQWxsb3dzIG1vdmluZyBtb25leSBiZXR3ZWVuIGFjY291bnRzIG93bmVkIGJ5IHRoZSBzYW1lIHVzZXIuICBgQ09NTUVSQ0lBTGA6IEFsbG93cyBpbml0aWF0aW5nIHBheW1lbnRzIGZyb20gdGhlIHVzZXJcXCdzIGFjY291bnQgdG8gdGhpcmQgcGFydGllcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFR5cGUge1xuICAgIFN3ZWVwaW5nID0gJ1NXRUVQSU5HJyxcbiAgICBDb21tZXJjaWFsID0gJ0NPTU1FUkNJQUwnXG59XG5cbi8qKlxuICogTWV0YWRhdGEgdGhhdCBjYXB0dXJlcyB3aGF0IHNwZWNpZmljIHBheW1lbnQgY29uZmlndXJhdGlvbnMgYW4gaW5zdGl0dXRpb24gc3VwcG9ydHMgd2hlbiBtYWtpbmcgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHBheW1lbnRzIGZyb20gYSBkaWZmZXJlbnQgY291bnRyeS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX2ludGVybmF0aW9uYWxfcGF5bWVudHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIFNFUEEgSW5zdGFudCBwYXltZW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3NlcGFfaW5zdGFudDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIG1hcHBpbmcgb2YgY3VycmVuY3kgdG8gbWF4aW11bSBwYXltZW50IGFtb3VudCAoZGVub21pbmF0ZWQgaW4gdGhlIHNtYWxsZXN0IHVuaXQgb2YgY3VycmVuY3kpIHN1cHBvcnRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBFeGFtcGxlOiBge1xcXCJHQlBcXFwiOiBcXFwiMTAwMDBcXFwifWAgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4aW11bV9wYXltZW50X2Ftb3VudDogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH07XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIHJldHVybmluZyByZWZ1bmQgZGV0YWlscyB3aGVuIGluaXRpYXRpbmcgYSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfcmVmdW5kX2RldGFpbHM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk1ldGFkYXRhXG4gICAgICovXG4gICAgc3RhbmRpbmdfb3JkZXJfbWV0YWRhdGE6IFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgcGF5bWVudCBjb25zZW50cy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25NZXRhZGF0YVxuICAgICAqL1xuICAgIHN1cHBvcnRzX3BheW1lbnRfY29uc2VudHM6IGJvb2xlYW47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB1c2VkIHRvIHJlc3RyaWN0IHRoZSBhY2NvdW50cyB1c2VkIGZvciBwYXltZW50cy4gSWYgcHJvdmlkZWQsIHRoZSBlbmQgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VuZCBwYXltZW50cyBvbmx5IGZyb20gdGhlIHNwZWNpZmllZCBiYW5rIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvbk9wdGlvbmFsUmVzdHJpY3Rpb25CYWNzXG4gICAgICovXG4gICAgYWNjb3VudD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgNi1jaGFyYWN0ZXIgc29ydCBjb2RlIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uT3B0aW9uYWxSZXN0cmljdGlvbkJhY3NcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudCBkZWZpbmVzIGEgcGF5bWVudCBpbml0aWF0aW9uIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQuIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHBheW1lbnRfaWRgIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBQYXltZW50QW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHN0YXR1czogUGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9yZWZlcmVuY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVkdWxlPzogRXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICByZWZ1bmRfZGV0YWlscz86IEV4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZW5kZXJCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGJhY3M6IFNlbmRlckJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBzZW5kZXIsIGlmIHNwZWNpZmllZCBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgaWJhbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZWZ1bmQgSURzIGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF5bWVudC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgcmVmdW5kX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50QW1vdW50UmVmdW5kZWR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGFtb3VudF9yZWZ1bmRlZD86IFBheW1lbnRBbW91bnRSZWZ1bmRlZDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHdhbGxldF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIHNjaGVtZT86IFBheW1lbnRTY2hlbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50U2NoZW1lfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBjb25zZW50IElEIHRoYXQgdGhpcyBwYXltZW50IHdhcyBpbml0aWF0ZWQgd2l0aC4gSXMgcHJlc2VudCBvbmx5IHdoZW4gcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIElEIHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSB3aGVuIGEgcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHZpcnR1YWwgYWNjb3VudHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50XG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgUGxhaWQgdG8gZWFjaCBwYXltZW50IGZvciB0cmFja2luZyBhbmQgcmVjb25jaWxsaWF0aW9uIHB1cnBvc2VzLiAgTm90ZTogTm90IGFsbCBiYW5rcyBoYW5kbGUgZW5kX3RvX2VuZF9pZCBjb25zaXN0ZW50bHkuIFRvIGVuc3VyZSBhY2N1cmF0ZSBtYXRjaGluZywgY2xpZW50cyBzaG91bGQgY29udmVydCBib3RoIHRoZSBpbmNvbWluZyBlbmRfdG9fZW5kX2lkIGFuZCB0aGUgb25lIHByb3ZpZGVkIGJ5IFBsYWlkIHRvIHRoZSBzYW1lIGNhc2UgKGVpdGhlciBsb3dlciBvciB1cHBlcikgYmVmb3JlIGNvbXBhcmlzb24uIEZvciB2aXJ0dWFsIGFjY291bnQgcGF5bWVudHMsIFBsYWlkIG1hbmFnZXMgdGhpcyBmaWVsZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFxuICAgICAqL1xuICAgIGVuZF90b19lbmRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudCB0aGUgcGF5bWVudCBpcyBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgcGF5bWVudC4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCBhdCBtb3N0IDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyAoc2luY2Ugbm90IGFsbCBpbnN0aXR1dGlvbnMgc3VwcG9ydCB0aGVtKS4gSW4gb3JkZXIgdG8gdHJhY2sgc2V0dGxlbWVudCB2aWEgUGF5bWVudCBDb25maXJtYXRpb24sIGVhY2ggcGF5bWVudCBtdXN0IGhhdmUgYSB1bmlxdWUgcmVmZXJlbmNlLiBJZiB0aGUgcmVmZXJlbmNlIHByb3ZpZGVkIHRocm91Z2ggdGhlIEFQSSBpcyBub3QgdW5pcXVlLCBQbGFpZCB3aWxsIGFkanVzdCBpdC4gU29tZSBpbnN0aXR1dGlvbnMgbWF5IGxpbWl0IHRoZSByZWZlcmVuY2UgdG8gbGVzcyB0aGFuIDE4IGNoYXJhY3RlcnMuIElmIG5lY2Vzc2FyeSwgUGxhaWQgd2lsbCBhZGp1c3QgdGhlIHJlZmVyZW5jZSBieSB0cnVuY2F0aW5nIGl0IHRvIGZpdCB0aGUgaW5zdGl0dXRpb25cXCdzIHJlcXVpcmVtZW50cy4gQm90aCB0aGUgb3JpZ2luYWxseSBwcm92aWRlZCBhbmQgYXV0b21hdGljYWxseSBhZGp1c3RlZCByZWZlcmVuY2VzIChpZiBhbnkpIGNhbiBiZSBmb3VuZCBpbiB0aGUgYHJlZmVyZW5jZWAgYW5kIGBhZGp1c3RlZF9yZWZlcmVuY2VgIGZpZWxkcywgcmVzcGVjdGl2ZWx5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZlcmVuY2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogUGF5bWVudEFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVSZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2NoZWR1bGU/OiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZVJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogRXh0ZXJuYWxQYXltZW50T3B0aW9ucyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBwYXltZW50XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZvciBhIHBheW1lbnQgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCwgdGhlcmUgaXMgb25seSBvbmUgcG9zc2libGUgdmFsdWU6ICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhlIGluaXRpYWwgcGhhc2Ugb2YgdGhlIHBheW1lbnRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVN0YXR1cyB7XG4gICAgUGF5bWVudFN0YXR1c0lucHV0TmVlZGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRCdcbn1cblxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9wYXltZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBwYXltZW50LiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBwYXltZW50X2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IFBheW1lbnRBbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZWZlcmVuY2Ugc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RtZW50IHRvIHBhc3MgYmFuayB2YWxpZGF0aW9uIHJ1bGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWRqdXN0ZWRfcmVmZXJlbmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RXh0ZXJuYWxQYXltZW50U2NoZWR1bGVHZXR9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc2NoZWR1bGU/OiBFeHRlcm5hbFBheW1lbnRTY2hlZHVsZUdldCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4dGVybmFsUGF5bWVudFJlZnVuZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kX2RldGFpbHM/OiBFeHRlcm5hbFBheW1lbnRSZWZ1bmREZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VuZGVyQkFDU051bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhY3M6IFNlbmRlckJBQ1NOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEludGVybmF0aW9uYWwgQmFuayBBY2NvdW50IE51bWJlciAoSUJBTikgZm9yIHRoZSBzZW5kZXIsIGlmIHNwZWNpZmllZCBpbiB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGNhbGwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpYmFuOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFJlZnVuZCBJRHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZnVuZF9pZHM/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEFtb3VudFJlZnVuZGVkfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFtb3VudF9yZWZ1bmRlZD86IFBheW1lbnRBbW91bnRSZWZ1bmRlZDtcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zY2hlbWU/OiBQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBjb25zZW50IElEIHRoYXQgdGhpcyBwYXltZW50IHdhcyBpbml0aWF0ZWQgd2l0aC4gSXMgcHJlc2VudCBvbmx5IHdoZW4gcGF5bWVudCB3YXMgaW5pdGlhdGVkIHVzaW5nIHRoZSBwYXltZW50IGNvbnNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb25zZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gSUQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IHdoZW4gYSBwYXltZW50IHdhcyBpbml0aWF0ZWQgdXNpbmcgdmlydHVhbCBhY2NvdW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGFzc2lnbmVkIGJ5IFBsYWlkIHRvIGVhY2ggcGF5bWVudCBmb3IgdHJhY2tpbmcgYW5kIHJlY29uY2lsbGlhdGlvbiBwdXJwb3Nlcy4gIE5vdGU6IE5vdCBhbGwgYmFua3MgaGFuZGxlIGVuZF90b19lbmRfaWQgY29uc2lzdGVudGx5LiBUbyBlbnN1cmUgYWNjdXJhdGUgbWF0Y2hpbmcsIGNsaWVudHMgc2hvdWxkIGNvbnZlcnQgYm90aCB0aGUgaW5jb21pbmcgZW5kX3RvX2VuZF9pZCBhbmQgdGhlIG9uZSBwcm92aWRlZCBieSBQbGFpZCB0byB0aGUgc2FtZSBjYXNlIChlaXRoZXIgbG93ZXIgb3IgdXBwZXIpIGJlZm9yZSBjb21wYXJpc29uLiBGb3IgdmlydHVhbCBhY2NvdW50IHBheW1lbnRzLCBQbGFpZCBtYW5hZ2VzIHRoaXMgZmllbGQgYXV0b21hdGljYWxseS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGVuZF90b19lbmRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHBheW1lbnRzIHRvIHJldHVybi4gSWYgYGNvdW50YCBpcyBub3Qgc3BlY2lmaWVkLCBhIG1heGltdW0gb2YgMTAgcGF5bWVudHMgd2lsbCBiZSByZXR1cm5lZCwgYmVnaW5uaW5nIHdpdGggdGhlIG1vc3QgcmVjZW50IHBheW1lbnQgYmVmb3JlIHRoZSBjdXJzb3IgKGlmIHNwZWNpZmllZCkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIFxcXCIyMDE5LTEyLTA2VDIyOjM1OjQ5WlxcXCIpLiBPbmx5IHBheW1lbnRzIGNyZWF0ZWQgYmVmb3JlIHRoZSBjdXJzb3Igd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbnNlbnQgSUQuIElmIHNwZWNpZmllZCwgb25seSBwYXltZW50cywgZXhlY3V0ZWQgdXNpbmcgdGhpcyBjb25zZW50LCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc2VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBwYXltZW50cyB0aGF0IGhhdmUgYmVlbiBjcmVhdGVkLCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfaWRgLlxuICAgICAqIEB0eXBlIHtBcnJheTxQYXltZW50SW5pdGlhdGlvblBheW1lbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBwYXltZW50czogQXJyYXk8UGF5bWVudEluaXRpYXRpb25QYXltZW50PjtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgdGhhdCwgd2hlbiB1c2VkIGFzIHRoZSBvcHRpb25hbCBgY3Vyc29yYCBwYXJhbWV0ZXIgdG8gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YCwgd2lsbCByZXR1cm4gdGhlIG5leHQgdW5yZXR1cm5lZCBwYXltZW50IGFzIGl0cyBmaXJzdCBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3JldmVyc2VgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcGF5bWVudCB0byByZXZlcnNlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgd2FsbGV0IHRyYW5zYWN0aW9uLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBJZiBhIHJlcXVlc3QgdG8gZXhlY3V0ZSBhIHdhbGxldCB0cmFuc2FjdGlvbiBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHRoZW4gYWZ0ZXIgYSBtaW5pbXVtIGRlbGF5IG9mIG9uZSBtaW51dGUsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3YWxsZXQgdHJhbnNhY3Rpb24gaXMgY3JlYXRlZC4gSWYgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQsIGl0IHdpbGwgcHJldmVudCBhbnkgdHJhbnNhY3Rpb24gdGhhdCB1c2VzIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSwgYW5kIHdhcyByZWNlaXZlZCB3aXRoaW4gMjQgaG91cnMgb2YgdGhlIGZpcnN0IHJlcXVlc3QsIGZyb20gYmVpbmcgcHJvY2Vzc2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSByZWZ1bmQuIFRoaXMgbXVzdCBiZSBhbiBhbHBoYW51bWVyaWMgc3RyaW5nIHdpdGggNiB0byAxOCBjaGFyYWN0ZXJzIGFuZCBtdXN0IG5vdCBjb250YWluIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMgb3Igc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmZXJlbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRBbW91bnRUb1JlZnVuZH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBQYXltZW50QW1vdW50VG9SZWZ1bmQ7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRlcnBhcnR5X2RhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnRlcnBhcnR5X2FkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGF0aW9uL3BheW1lbnQvcmV2ZXJzZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgcmVmdW5kXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHBheW1lbnQuICBgUEFZTUVOVF9TVEFUVVNfSU5QVVRfTkVFREVEYDogVGhpcyBpcyB0aGUgaW5pdGlhbCBzdGF0ZSBvZiBhbGwgcGF5bWVudHMuIEl0IGluZGljYXRlcyB0aGF0IHRoZSBwYXltZW50IGlzIHdhaXRpbmcgb24gdXNlciBpbnB1dCB0byBjb250aW51ZSBwcm9jZXNzaW5nLiBBIHBheW1lbnQgbWF5IHJlLWVudGVyIHRoaXMgc3RhdGUgbGF0ZXIgb24gaWYgZnVydGhlciBpbnB1dCBpcyBuZWVkZWQuICBgUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEYDogVGhlIHBheW1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGF1dGhvcmlzZWQgYW5kIGFjY2VwdGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIEZvciBzdWNjZXNzZnVsIHBheW1lbnRzLCB0aGlzIGlzIGEgcG90ZW50aWFsIHRlcm1pbmFsIHN0YXR1cy4gRnVydGhlciBzdGF0dXMgdHJhbnNpdGlvbnMgY2FuIGJlIHRvIFJFSkVDVEVEIGFuZCwgd2hlbiBzdXBwb3J0ZWQgYnkgdGhlIGluc3RpdHV0aW9uLCB0byBFWEVDVVRFRC4gIGBQQVlNRU5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfRlVORFNgOiBUaGUgcGF5bWVudCBoYXMgZmFpbGVkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZnVuZHMuICBgUEFZTUVOVF9TVEFUVVNfRkFJTEVEYDogVGhlIHBheW1lbnQgaGFzIGZhaWxlZCB0byBiZSBpbml0aWF0ZWQuIFRoaXMgZXJyb3IgbWF5IGJlIGNhdXNlZCBieSB0cmFuc2llbnQgc3lzdGVtIG91dGFnZXMgYW5kIGlzIHJldHJ5YWJsZSBvbmNlIHRoZSByb290IGNhdXNlIGlzIHJlc29sdmVkLiAgYFBBWU1FTlRfU1RBVFVTX0JMT0NLRURgOiBUaGUgcGF5bWVudCBoYXMgYmVlbiBibG9ja2VkIGJ5IFBsYWlkLiBUaGlzIGNhbiBvY2N1ciwgZm9yIGV4YW1wbGUsIGR1ZSB0byBQbGFpZCBmbGFnZ2luZyB0aGUgcGF5bWVudCBhcyBwb3RlbnRpYWxseSByaXNreS4gVGhpcyBpcyBhIHJldHJ5YWJsZSBlcnJvci4gIGBQQVlNRU5UX1NUQVRVU19BVVRIT1JJU0lOR2A6IFRoZSBwYXltZW50IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZSBwYXltZW50IHdpbGwgYXV0b21hdGljYWxseSBleGl0IHRoaXMgc3RhdGUgd2hlbiB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGhhcyBhdXRob3Jpc2VkIHRoZSB0cmFuc2FjdGlvbi4gIGBQQVlNRU5UX1NUQVRVU19DQU5DRUxMRURgOiBUaGUgcGF5bWVudCB3YXMgY2FuY2VsbGVkICh0eXBpY2FsbHkgYnkgdGhlIGVuZCB1c2VyKSBkdXJpbmcgYXV0aG9yaXNhdGlvbi4gIGBQQVlNRU5UX1NUQVRVU19FWEVDVVRFRGA6IFRoZSBmdW5kcyBoYXZlIHN1Y2Nlc3NmdWxseSBsZWZ0IHRoZSBwYXllciBhY2NvdW50IGFuZCBwYXltZW50IGlzIGNvbnNpZGVyZWQgY29tcGxldGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHN1cHBvcnQgdGhpcyBzdGF0dXM6IHN1cHBvcnQgaXMgbW9yZSBjb21tb24gaW4gdGhlIFVLLCBhbmQgbGVzcyBjb21tb24gaW4gdGhlIEVVLiBGb3IgaW5zdGl0dXRpb25zIHdoZXJlIHRoaXMgc3RhdHVzIGlzIG5vdCBzdXBwb3J0ZWQsIHRoZSB0ZXJtaW5hbCBzdGF0dXMgZm9yIGEgc3VjY2Vzc2Z1bCBwYXltZW50IHdpbGwgYmUgYFBBWU1FTlRfU1RBVFVTX0lOSVRJQVRFRGAuICBgUEFZTUVOVF9TVEFUVVNfU0VUVExFRGA6IFRoZSBwYXltZW50IGhhcyBzZXR0bGVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuIEEgcGF5bWVudCB3aWxsIHR5cGljYWxseSBzZXR0bGUgd2l0aGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gd2hpY2ggcGF5bWVudCByYWlsIGlzIHVzZWQuIFRoaXMgc3RhdHVzIGlzIG9ubHkgYXZhaWxhYmxlIHRvIGN1c3RvbWVycyB1c2luZyBbUGxhaWQgVmlydHVhbCBBY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy92aXJ0dWFsLWFjY291bnRzLykuICBgUEFZTUVOVF9TVEFUVVNfRVNUQUJMSVNIRURgOiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RhbmRpbmcgb3JkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGVzdGFibGlzaGVkLiBUaGlzIHN0YXRlIGlzIG9ubHkgdXNlZCBmb3Igc3RhbmRpbmcgb3JkZXJzLiAgYFBBWU1FTlRfU1RBVFVTX1JFSkVDVEVEYDogVGhlIHBheW1lbnQgd2FzIHJlamVjdGVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBEZXByZWNhdGVkOiBUaGVzZSBzdGF0dXNlcyB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gIGBQQVlNRU5UX1NUQVRVU19VTktOT1dOYDogVGhlIHBheW1lbnQgc3RhdHVzIGlzIHVua25vd24uICBgUEFZTUVOVF9TVEFUVVNfUFJPQ0VTU0lOR2A6IFRoZSBwYXltZW50IGlzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIFRoZSBwYXltZW50IHdpbGwgYXV0b21hdGljYWxseSBleGl0IHRoaXMgc3RhdGUgd2hlbiBwcm9jZXNzaW5nIGlzIGNvbXBsZXRlLiAgYFBBWU1FTlRfU1RBVFVTX0NPTVBMRVRFRGA6IEluZGljYXRlcyB0aGF0IHRoZSBzdGFuZGluZyBvcmRlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZXN0YWJsaXNoZWQuIFRoaXMgc3RhdGUgaXMgb25seSB1c2VkIGZvciBzdGFuZGluZyBvcmRlcnMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXMge1xuICAgIElucHV0TmVlZGVkID0gJ1BBWU1FTlRfU1RBVFVTX0lOUFVUX05FRURFRCcsXG4gICAgUHJvY2Vzc2luZyA9ICdQQVlNRU5UX1NUQVRVU19QUk9DRVNTSU5HJyxcbiAgICBJbml0aWF0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfSU5JVElBVEVEJyxcbiAgICBDb21wbGV0ZWQgPSAnUEFZTUVOVF9TVEFUVVNfQ09NUExFVEVEJyxcbiAgICBJbnN1ZmZpY2llbnRGdW5kcyA9ICdQQVlNRU5UX1NUQVRVU19JTlNVRkZJQ0lFTlRfRlVORFMnLFxuICAgIEZhaWxlZCA9ICdQQVlNRU5UX1NUQVRVU19GQUlMRUQnLFxuICAgIEJsb2NrZWQgPSAnUEFZTUVOVF9TVEFUVVNfQkxPQ0tFRCcsXG4gICAgVW5rbm93biA9ICdQQVlNRU5UX1NUQVRVU19VTktOT1dOJyxcbiAgICBFeGVjdXRlZCA9ICdQQVlNRU5UX1NUQVRVU19FWEVDVVRFRCcsXG4gICAgU2V0dGxlZCA9ICdQQVlNRU5UX1NUQVRVU19TRVRUTEVEJyxcbiAgICBBdXRob3Jpc2luZyA9ICdQQVlNRU5UX1NUQVRVU19BVVRIT1JJU0lORycsXG4gICAgQ2FuY2VsbGVkID0gJ1BBWU1FTlRfU1RBVFVTX0NBTkNFTExFRCcsXG4gICAgRXN0YWJsaXNoZWQgPSAnUEFZTUVOVF9TVEFUVVNfRVNUQUJMSVNIRUQnLFxuICAgIFJlamVjdGVkID0gJ1BBWU1FTlRfU1RBVFVTX1JFSkVDVEVEJ1xufVxuXG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYHBheW1lbnRfaWRgIHJldHVybmVkIGZyb20gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBgcGF5bWVudF90b2tlbmAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciB0aGUgcGF5bWVudCBpbml0aWF0aW9uIGZsb3dcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIGF0IHdoaWNoIHRoZSB0b2tlbiB3aWxsIGV4cGlyZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LiBBIGBwYXltZW50X3Rva2VuYCBleHBpcmVzIGFmdGVyIDE1IG1pbnV0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHBheW1lbnRfdG9rZW5fZXhwaXJhdGlvbl90aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50IGRlZmluZXMgYSBwYXltZW50IGluaXRpYXRpb24gcmVjaXBpZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25BZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcmVjaXBpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50XG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRcbiAgICAgKi9cbiAgICBiYWNzPzogUmVjaXBpZW50QkFDU051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC4gV2UgcmVjb21tZW5kIHVzaW5nIHN0cmluZ3Mgb2YgbGVuZ3RoIDE4IG9yIGxlc3MgYW5kIGF2b2lkIHNwZWNpYWwgY2hhcmFjdGVycyB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIGFsbCBpbnN0aXR1dGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgKElCQU4pIGZvciB0aGUgcmVjaXBpZW50LiBJZiBCQUNTIGRhdGEgaXMgbm90IHByb3ZpZGVkLCBhbiBJQkFOIGlzIHJlcXVpcmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGliYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXltZW50SW5pdGlhdGlvbkFkZHJlc3MgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRhdGlvbi9yZWNpcGllbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHJlY2lwaWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjaXBpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogUGF5bWVudEluaXRpYXRpb25BZGRyZXNzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKSBmb3IgdGhlIHJlY2lwaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWJhbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY2lwaWVudEJBQ1NOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGJhY3M/OiBSZWNpcGllbnRCQUNTTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZUFsbE9mXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHBheW1lbnQgcmVjaXBpZW50cyBjcmVhdGVkIGZvciBQYXltZW50IEluaXRpYXRpb25cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY2lwaWVudHM6IEFycmF5PFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50PjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE1ldGFkYXRhIHNwZWNpZmljYWxseSByZWxhdGVkIHRvIHZhbGlkIFBheW1lbnQgSW5pdGlhdGlvbiBzdGFuZGluZyBvcmRlciBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGluc3RpdHV0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgaW5zdGl0dXRpb24gc3VwcG9ydHMgY2xvc2VkLWVuZGVkIHN0YW5kaW5nIG9yZGVycyBieSBwcm92aWRpbmcgYW4gZW5kIGRhdGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfc3RhbmRpbmdfb3JkZXJfZW5kX2RhdGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgdG8gYE1PTlRITFlgIHN0YW5kaW5nIG9yZGVycy4gSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGluc3RpdHV0aW9uIHN1cHBvcnRzIG5lZ2F0aXZlIGludGVnZXJzICgtMSB0byAtNSkgZm9yIHNldHRpbmcgdXAgYSBgTU9OVEhMWWAgc3RhbmRpbmcgb3JkZXIgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRJbml0aWF0aW9uU3RhbmRpbmdPcmRlck1ldGFkYXRhXG4gICAgICovXG4gICAgc3VwcG9ydHNfc3RhbmRpbmdfb3JkZXJfbmVnYXRpdmVfZXhlY3V0aW9uX2RheXM6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSB2YWxpZCBzdGFuZGluZyBvcmRlciBpbnRlcnZhbHMgc3VwcG9ydGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw+fVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50SW5pdGlhdGlvblN0YW5kaW5nT3JkZXJNZXRhZGF0YVxuICAgICAqL1xuICAgIHZhbGlkX3N0YW5kaW5nX29yZGVyX2ludGVydmFsczogQXJyYXk8UGF5bWVudFNjaGVkdWxlSW50ZXJ2YWw+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbiBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0byBpbnRlci1iYW5rIHRyYW5zZmVycy4gSWYgdGhlIHRyYW5zYWN0aW9uIHdhcyBub3QgYW4gaW50ZXItYmFuayB0cmFuc2ZlciwgYWxsIGZpZWxkcyB3aWxsIGJlIGBudWxsYC4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhlIGBwYXltZW50X21ldGFgIGtleSB3aWxsIGFsd2F5cyBhcHBlYXIsIGJ1dCBubyBkYXRhIGVsZW1lbnRzIGFyZSBndWFyYW50ZWVkLiBJZiB0aGUgYHRyYW5zYWN0aW9uc2Agb2JqZWN0IHdhcyByZXR1cm5lZCBieSBhbiBBc3NldHMgZW5kcG9pbnQgc3VjaCBhcyBgL2Fzc2V0X3JlcG9ydC9nZXQvYCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIG9ubHkgYXBwZWFyIGluIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50TWV0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRNZXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gcmVmZXJlbmNlIG51bWJlciBzdXBwbGllZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVmZXJlbmNlX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIFBQRCBJRCBmb3IgdGhlIHBheWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcHBkX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciB0cmFuc2ZlcnMsIHRoZSBwYXJ0eSB0aGF0IGlzIHJlY2VpdmluZyB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXllZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGFydHkgaW5pdGlhdGluZyBhIHdpcmUgdHJhbnNmZXIuIFdpbGwgYmUgYG51bGxgIGlmIHRoZSB0cmFuc2FjdGlvbiBpcyBub3QgYSB3aXJlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgYnlfb3JkZXJfb2Y6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHRyYW5zZmVycywgdGhlIHBhcnR5IHRoYXQgaXMgcGF5aW5nIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50TWV0YVxuICAgICAqL1xuICAgIHBheWVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRyYW5zZmVyLCBlLmcuIFxcJ0FDSFxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRob2Q6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHBheW1lbnQgcHJvY2Vzc29yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudE1ldGFcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2Nlc3Nvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5ZXItc3VwcGxpZWQgZGVzY3JpcHRpb24gb2YgdGhlIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRNZXRhXG4gICAgICovXG4gICAgcmVhc29uOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9wcm9maWxlX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXltZW50UHJvZmlsZUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcGF5bWVudF9wcm9maWxlL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGUgZ2l2ZW4gUGF5bWVudCBQcm9maWxlIHdhcyB1cGRhdGVkIGF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHVwZGF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSB0aW1lIHRoZSBnaXZlbiBQYXltZW50IFByb2ZpbGUgd2FzIGNyZWF0ZWQgYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIHRpbWUgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZSB3YXMgZGVsZXRlZCBhdC4gQWx3YXlzIGBudWxsYCBpZiB0aGUgUGF5bWVudCBQcm9maWxlIGhhcyBub3QgYmVlbiBkZWxldGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRlbGV0ZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRQcm9maWxlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBQYXltZW50UHJvZmlsZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3BheW1lbnRfcHJvZmlsZS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHBheW1lbnQgcHJvZmlsZSB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSBkYXRhIHRoYXQgaXMgYmVpbmcgcmVxdWVzdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXltZW50UHJvZmlsZVJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRQcm9maWxlUmVtb3ZlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIGdpdmVuIFBheW1lbnQgUHJvZmlsZS4gIGBSRUFEWWA6IFRoaXMgUGF5bWVudCBQcm9maWxlIGlzIHJlYWR5IHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycyB1c2luZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBhbmQgYC90cmFuc2Zlci9jcmVhdGVgLiAgYFBFTkRJTkdgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBpcyBub3QgcmVhZHkgdG8gYmUgdXNlZC4gWW914oCZbGwgbmVlZCB0byBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQgdG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLiAgYFJFTU9WRURgOiBUaGlzIFBheW1lbnQgUHJvZmlsZSBoYXMgYmVlbiByZW1vdmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFByb2ZpbGVTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAnUEVORElORycsXG4gICAgUmVhZHkgPSAnUkVBRFknLFxuICAgIFJlbW92ZWQgPSAnUkVNT1ZFRCdcbn1cblxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGludGVydmFsIG9mIHRoZSBwYXltZW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFNjaGVkdWxlSW50ZXJ2YWwge1xuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWSdcbn1cblxuLyoqXG4gKiBQYXltZW50IHNjaGVtZS4gSWYgbm90IHNwZWNpZmllZCAtIHRoZSBkZWZhdWx0IGluIHRoZSByZWdpb24gd2lsbCBiZSB1c2VkIChlLmcuIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmAgZm9yIEVVKS4gVXNpbmcgdW5zdXBwb3J0ZWQgdmFsdWVzIHdpbGwgcmVzdWx0IGluIGEgZmFpbGVkIHBheW1lbnQuICBgTE9DQUxfREVGQVVMVGA6IFRoZSBkZWZhdWx0IHBheW1lbnQgc2NoZW1lIGZvciB0aGUgc2VsZWN0ZWQgbWFya2V0IGFuZCBjdXJyZW5jeSB3aWxsIGJlIHVzZWQuICBgTE9DQUxfSU5TVEFOVGA6IFRoZSBpbnN0YW50IHBheW1lbnQgc2NoZW1lIGZvciB0aGUgc2VsZWN0ZWQgbWFya2V0IGFuZCBjdXJyZW5jeSB3aWxsIGJlIHVzZWQgKGlmIGFwcGxpY2FibGUpLiBGZWVzIG1heSBiZSBhcHBsaWVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSWYgdGhlIG1hcmtldCBkb2VzIG5vdCBzdXBwb3J0IGFuIEluc3RhbnQgU2NoZW1lIChlLmcuIERlbm1hcmspLCB0aGUgZGVmYXVsdCBpbiB0aGUgcmVnaW9uIHdpbGwgYmUgdXNlZC4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUmA6IFRoZSBzdGFuZGFyZCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuICBgU0VQQV9DUkVESVRfVFJBTlNGRVJfSU5TVEFOVGA6IEluc3RhbnQgcGF5bWVudCB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gTWF5IGludm9sdmUgYWRkaXRpb25hbCBmZWVzIGFuZCBtYXkgbm90IGJlIGF2YWlsYWJsZSBhdCBzb21lIGJhbmtzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGF5bWVudFNjaGVtZSB7XG4gICAgTnVsbCA9ICdudWxsJyxcbiAgICBMb2NhbERlZmF1bHQgPSAnTE9DQUxfREVGQVVMVCcsXG4gICAgTG9jYWxJbnN0YW50ID0gJ0xPQ0FMX0lOU1RBTlQnLFxuICAgIFNlcGFDcmVkaXRUcmFuc2ZlciA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUicsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVySW5zdGFudCA9ICdTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UJ1xufVxuXG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQgaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBQQVlNRU5UX0lOSVRJQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEFZTUVOVF9TVEFUVVNfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBmb3IgdGhlIHBheW1lbnQgYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgcGF5bWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBJRCB0aGF0IHRoaXMgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGgsIGlmIGFueS4gVGhpcyBpcyBwcmVzZW50IG9ubHkgd2hlbiBhIHBheW1lbnQgd2FzIGluaXRpYXRlZCB1c2luZyB2aXJ0dWFsIGFjY291bnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3BheW1lbnRfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfcGF5bWVudF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIHJlZmVyZW5jZSB3aGVuIGNyZWF0aW5nIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheW1lbnRTdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgb3JpZ2luYWxfcmVmZXJlbmNlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVmZXJlbmNlIHNlbnQgdG8gdGhlIGJhbmsgYWZ0ZXIgYWRqdXN0bWVudCB0byBwYXNzIGJhbmsgdmFsaWRhdGlvbiBydWxlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFkanVzdGVkX3JlZmVyZW5jZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBgc3RhcnRfZGF0ZWAgcHJvdmlkZWQgZHVyaW5nIHRoZSBjcmVhdGlvbiBvZiBhIHN0YW5kaW5nIG9yZGVyLiBJZiB0aGUgcGF5bWVudCBpcyBub3QgYSBzdGFuZGluZyBvcmRlciwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIG9yaWdpbmFsX3N0YXJ0X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGUgc2VudCB0byB0aGUgYmFuayBhZnRlciBhZGp1c3RpbmcgZm9yIGhvbGlkYXlzIG9yIHdlZWtlbmRzLiAgV2lsbCBiZSBwcm92aWRlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBJZiB0aGUgc3RhcnQgZGF0ZSBkaWQgbm90IHJlcXVpcmUgYWRqdXN0bWVudCwgb3IgaWYgdGhlIHBheW1lbnQgaXMgbm90IGEgc3RhbmRpbmcgb3JkZXIsIHRoaXMgZmllbGQgd2lsbCBiZSBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhZGp1c3RlZF9zdGFydF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0aW1lc3RhbXAgb2YgdGhlIHVwZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0LCBlLmcuIGBcXFwiMjAxNy0wOS0xNFQxNDo0MjoxOS4zNTBaXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRpbWVzdGFtcDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQYXltZW50U3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5bWVudFN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhY2NvdW50IGxldmVsIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVBY2NvdW50RGF0YSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lQWNjb3VudERhdGFcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSW5jb21lUmF0ZU9mUGF5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lQWNjb3VudERhdGFcbiAgICAgKi9cbiAgICByYXRlX29mX3BheTogUGF5cm9sbEluY29tZVJhdGVPZlBheTtcbiAgICAvKipcbiAgICAgKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIGFuIGluZGl2aWR1YWwgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lQWNjb3VudERhdGFcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHBheXJvbGwgZGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEluY29tZU9iamVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxJbmNvbWVPYmplY3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBwYXlyb2xsIHByb3ZpZGVyIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZU9iamVjdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcGF5IHN0dWJzIGZvciB0aGUgdXNlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q3JlZGl0UGF5U3R1Yj59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJbmNvbWVPYmplY3RcbiAgICAgKi9cbiAgICBwYXlfc3R1YnM6IEFycmF5PENyZWRpdFBheVN0dWI+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHRheCBmb3JtIFctMnMuXG4gICAgICogQHR5cGUge0FycmF5PENyZWRpdFcyPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZU9iamVjdFxuICAgICAqL1xuICAgIHcyczogQXJyYXk8Q3JlZGl0VzI+O1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHRheCBmb3JtIDEwOTlzLlxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXQxMDk5Pn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEluY29tZU9iamVjdFxuICAgICAqL1xuICAgIGZvcm0xMDk5czogQXJyYXk8Q3JlZGl0MTA5OT47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIHJhdGUgYXQgd2hpY2ggYW4gaW5kaXZpZHVhbCBpcyBwYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEluY29tZVJhdGVPZlBheSB7XG4gICAgLyoqXG4gICAgICogVGhlIHJhdGUgYXQgd2hpY2ggYW4gZW1wbG95ZWUgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5XG4gICAgICovXG4gICAgcGF5X3JhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgYXQgd2hpY2ggYW4gZW1wbG95ZWUgaXMgcGFpZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSW5jb21lUmF0ZU9mUGF5XG4gICAgICovXG4gICAgcGF5X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXlyb2xsIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXJvbGxJdGVtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5cm9sbEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEluY29tZUFjY291bnREYXRhPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8UGF5cm9sbEluY29tZUFjY291bnREYXRhPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5cm9sbEluY29tZU9iamVjdD59XG4gICAgICogQG1lbWJlcm9mIFBheXJvbGxJdGVtXG4gICAgICovXG4gICAgcGF5cm9sbF9pbmNvbWU6IEFycmF5PFBheXJvbGxJbmNvbWVPYmplY3Q+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlyb2xsSXRlbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFBheXJvbGxJdGVtU3RhdHVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIEl0ZW0gd2FzIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5cm9sbEl0ZW1cbiAgICAgKi9cbiAgICB1cGRhdGVkX2F0OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBzdGF0dXMgb2YgdGhlIHBheXJvbGwgaXRlbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbEl0ZW1TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlyb2xsSXRlbVN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogRGVub3RlcyB0aGUgcHJvY2Vzc2luZyBzdGF0dXMgZm9yIHRoZSB2ZXJpZmljYXRpb24uICBgVU5LTk9XTmA6IFRoZSBwcm9jZXNzaW5nIHN0YXR1cyBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gIGBQUk9DRVNTSU5HX0NPTVBMRVRFYDogVGhlIHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZCBhbmQgdGhlIHVzZXIgaGFzIGFwcHJvdmVkIGZvciBzaGFyaW5nLiBUaGUgZGF0YSBpcyBhdmFpbGFibGUgdG8gYmUgcmV0cmlldmVkLiAgYFBST0NFU1NJTkdgOiBUaGUgdmVyaWZpY2F0aW9uIGlzIHN0aWxsIHByb2Nlc3NpbmcuIFRoZSBkYXRhIGlzIG5vdCBhdmFpbGFibGUgeWV0LiAgYEZBSUxFRGA6IFRoZSBwcm9jZXNzaW5nIGZhaWxlZCB0byBjb21wbGV0ZSBzdWNjZXNzZnVsbHkuICBgQVBQUk9WQUxfU1RBVFVTX1BFTkRJTkdgOiBUaGUgcHJvY2Vzc2luZyBoYXMgY29tcGxldGVkIGJ1dCB0aGUgdXNlciBoYXMgbm90IHlldCBhcHByb3ZlZCB0aGUgc2hhcmluZyBvZiB0aGUgZGF0YS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsSXRlbVN0YXR1c1xuICAgICAqL1xuICAgIHByb2Nlc3Npbmdfc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogT2JqZWN0IGNvbnRhaW5pbmcgZnJhdWQgcmlzayBkYXRhIHBlcnRhaW5pbmcgdG8gdGhlIEl0ZW0gbGlua2VkIGFzIHBhcnQgb2YgdGhlIHZlcmlmaWNhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5cm9sbFJpc2tTaWduYWxzSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXJvbGxSaXNrU2lnbmFsc0l0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsUmlza1NpZ25hbHNJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIHBheXJvbGwgaW5jb21lIGRvY3VtZW50IGF1dGhlbnRpY2l0eSBkYXRhIHJldHJpZXZlZCBmb3IgZWFjaCBvZiB0aGUgdXNlclxcJ3MgYWNjb3VudHMuXG4gICAgICogQHR5cGUge0FycmF5PERvY3VtZW50Umlza1NpZ25hbHNPYmplY3Q+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlyb2xsUmlza1NpZ25hbHNJdGVtXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3Jpc2tfc2lnbmFsczogQXJyYXk8RG9jdW1lbnRSaXNrU2lnbmFsc09iamVjdD47XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgZW5kIHVzZXJcXCdzIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RGVkdWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGRlZHVjdGlvbnM6IERlZHVjdGlvbnM7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGRvY19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFYXJuaW5nc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVhcm5pbmdzOiBFYXJuaW5ncztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKi9cbiAgICBlbXBsb3llZTogRW1wbG95ZWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqL1xuICAgIGVtcGxveWVyOiBQYXlzdHViRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VtcGxveW1lbnREZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBlbXBsb3ltZW50X2RldGFpbHM/OiBFbXBsb3ltZW50RGV0YWlscztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0UGF5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgbmV0X3BheTogTmV0UGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlQZXJpb2REZXRhaWxzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9kZXRhaWxzOiBQYXlQZXJpb2REZXRhaWxzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5c3R1Yl9kZXRhaWxzPzogUGF5c3R1YkRldGFpbHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEluY29tZUJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY29tZV9icmVha2Rvd24/OiBBcnJheTxJbmNvbWVCcmVha2Rvd24+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViWVRERGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YlxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX2Vhcm5pbmdzPzogUGF5c3R1YllURERldGFpbHM7XG59XG4vKipcbiAqIEFkZHJlc3Mgb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZSBFeGFtcGxlOiBgXFxcIk5DXFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0cmVldCBhZGRyZXNzIGxpbmUgMS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGluZTE/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0cmVldCBhZGRyZXNzIGxpbmUgMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViQWRkcmVzc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGluZTI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkFkZHJlc3NcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHN0YXRlX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWR1Y3Rpb24gb24gdGhlIHBheXN0dWJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkRlZHVjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJEZWR1Y3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVkdWN0aW9uLCBhcyBwcm92aWRlZCBvbiB0aGUgcGF5c3R1Yi4gRm9yIGV4YW1wbGU6IGBcXFwiNDAxKGspXFxcImAsIGBcXFwiRklDQSBNRUQgVEFYXFxcImAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRlZHVjdGlvblxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBkZWR1Y3Rpb24gaXMgcHJlLXRheDsgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZWR1Y3Rpb25cbiAgICAgKi9cbiAgICBpc19wcmV0YXg6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGRlZHVjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRGVkdWN0aW9uXG4gICAgICovXG4gICAgdG90YWw6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgZGV0YWlscyB0aGF0IGNhbiBiZSBmb3VuZCBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1YkRldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogQmVnaW5uaW5nIGRhdGUgb2YgdGhlIHBheSBwZXJpb2Qgb24gdGhlIHBheXN0dWIgaW4gdGhlIFxcJ1lZWVktTU0tRERcXCcgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJEZXRhaWxzXG4gICAgICovXG4gICAgcGF5X3BlcmlvZF9zdGFydF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFbmRpbmcgZGF0ZSBvZiB0aGUgcGF5IHBlcmlvZCBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfcGVyaW9kX2VuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQYXkgZGF0ZSBvbiB0aGUgcGF5c3R1YiBpbiB0aGUgXFwnWVlZWS1NTS1ERFxcJyBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIHBheXJvbGwgcHJvdmlkZXIgdGhhdCBnZW5lcmF0ZWQgdGhlIHBheXN0dWIsIGUuZy4gQURQXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlzdHViX3Byb3ZpZGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1YlBheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkRldGFpbHNcbiAgICAgKi9cbiAgICBwYXlfZnJlcXVlbmN5PzogUGF5c3R1YlBheUZyZXF1ZW5jeSB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1YlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViRW1wbG95ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViQWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1YkVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheXN0dWJBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llciBvbiB0aGUgcGF5c3R1Yi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViRW1wbG95ZXJcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIGRhdGEgZnJvbSBhIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJPdmVycmlkZUVtcGxveWVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llZX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lQnJlYWtkb3duPn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNvbWVfYnJlYWtkb3duPzogQXJyYXk8SW5jb21lQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlTmV0UGF5fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBuZXRfcGF5PzogUGF5c3R1Yk92ZXJyaWRlTmV0UGF5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZWR1Y3Rpb25zPzogUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRWFybmluZ3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIGVhcm5pbmdzPzogUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVxuICAgICAqL1xuICAgIHBheV9wZXJpb2RfZGV0YWlscz86IFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHM7XG59XG4vKipcbiAqIEFuIG9iamVjdCB3aXRoIHRoZSBkZWR1Y3Rpb24gaW5mb3JtYXRpb24gZm91bmQgb24gYSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9ucyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zXG4gICAgICovXG4gICAgYnJlYWtkb3duPzogQXJyYXk8UGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93bj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1xuICAgICAqL1xuICAgIHRvdGFsPzogUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc1RvdGFsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBkZWR1Y3Rpb24gbGluZSBpdGVtcyBmb3IgdGhlIHBheSBwZXJpb2RcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjdXJyZW50X2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVzY3JpcHRpb24gb2YgdGhlIGRlZHVjdGlvbiBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zQnJlYWtkb3duXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGVkdWN0aW9uc0JyZWFrZG93blxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSB0b3RhbCBkZWR1Y3Rpb25zIGZvciB0aGUgcGF5IHBlcmlvZFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVEZWR1Y3Rpb25zVG90YWwge1xuICAgIC8qKlxuICAgICAqIFJhdyBhbW91bnQgb2YgdGhlIGRlZHVjdGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIHRvdGFsIGFtb3VudCBvZiB0aGUgZGVkdWN0aW9uc1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURlZHVjdGlvbnNUb3RhbFxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgYWNjb3VudHMgdGhhdCB0aGUgcGF5bWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93biB7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgYWNjb3VudCBmb3IgdGhlIGdpdmVuIGRpc3RyaWJ1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICBhY2NvdW50X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBiYW5rIHRoYXQgdGhlIHBheW1lbnQgaXMgYmVpbmcgZGVwb3NpdGVkIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGJhbmtfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBkaXN0cmlidXRlZCB0byB0aGlzIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVudF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbGFzdCAyLTQgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgb2YgYW4gYWNjb3VudFxcJ3Mgb2ZmaWNpYWwgYWNjb3VudCBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duXG4gICAgICovXG4gICAgbWFzaz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiB0aGUgYWNjb3VudCB0aGF0IHRoZSBwYXlzdHViIHdhcyBzZW50IHRvIChlLmcuIFxcJ2NoZWNraW5nXFwnKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVEaXN0cmlidXRpb25CcmVha2Rvd25cbiAgICAgKi9cbiAgICB0eXBlPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIGEgYnJlYWtkb3duIG9mIGVhcm5pbmdzIG9uIGEgcGF5c3R1YiBhbmQgdGhlIHRvdGFsIGVhcm5pbmdzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd24+fVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1xuICAgICAqL1xuICAgIGJyZWFrZG93bj86IEFycmF5PFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NUb3RhbH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NcbiAgICAgKi9cbiAgICB0b3RhbD86IFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWw7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGVhcm5pbmdzIGxpbmUgaXRlbXMgZm9yIHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RWFybmluZ3NCcmVha2Rvd25DYW5vbmljYWxEZXNjcmlwdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBjYW5vbmljYWxfZGVzY3JpcHRpb24/OiBFYXJuaW5nc0JyZWFrZG93bkNhbm9uaWNhbERlc2NyaXB0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSYXcgYW1vdW50IG9mIHRoZSBlYXJuaW5nIGxpbmUgaXRlbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEZXNjcmlwdGlvbiBvZiB0aGUgZWFybmluZyBsaW5lIGl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGhvdXJzIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIGhvdXJzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgbGluZSBpdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzQnJlYWtkb3duXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEhvdXJseSByYXRlIGFwcGxpY2FibGUgZm9yIHRoaXMgZWFybmluZy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc0JyZWFrZG93blxuICAgICAqL1xuICAgIHJhdGU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IG9mIHRoZSBkZWR1Y3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRWFybmluZ3NCcmVha2Rvd25cbiAgICAgKi9cbiAgICB5dGRfYW1vdW50PzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGFuIGVhcm5pbmcgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVhcm5pbmdzVG90YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsIHtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBudW1iZXIgb2YgaG91cnMgd29ya2VkIGZvciB0aGlzIHBheSBwZXJpb2RcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgaG91cnM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBsaW5lIGl0ZW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgY3VycmVuY3k/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyLXRvLWRhdGUgYW1vdW50IGZvciB0aGUgdG90YWwgZWFybmluZ3NcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFYXJuaW5nc1RvdGFsXG4gICAgICovXG4gICAgeXRkX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBlbXBsb3llZSBvbiB0aGUgcGF5c3R1Yi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlXG4gICAgICovXG4gICAgbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3M7XG4gICAgLyoqXG4gICAgICogTWFyaXRhbCBzdGF0dXMgb2YgdGhlIGVtcGxveWVlIC0gZWl0aGVyIGBzaW5nbGVgIG9yIGBtYXJyaWVkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZVxuICAgICAqL1xuICAgIG1hcml0YWxfc3RhdHVzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRH1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVcbiAgICAgKi9cbiAgICB0YXhwYXllcl9pZD86IFBheXN0dWJPdmVycmlkZVRheHBheWVySUQ7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBlbXBsb3llZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZWVBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVlQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogNSBkaWdpdCBwb3N0YWwgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY291bnRyeSBvZiB0aGUgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZUFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW1wbG95ZXIgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZUVtcGxveWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llclxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyXG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzcztcbn1cbi8qKlxuICogVGhlIGFkZHJlc3Mgb2YgdGhlIGVtcGxveWVyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWdpb24gb3Igc3RhdGUgRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXJBZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA1IGRpZ2l0IHBvc3RhbCBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudHJ5IG9mIHRoZSBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZUVtcGxveWVyQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG5ldCBwYXkgYW1vdW50IG9uIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVOZXRQYXlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVOZXRQYXkge1xuICAgIC8qKlxuICAgICAqIERlc2NyaXB0aW9uIG9mIHRoZSBuZXQgcGF5XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlTmV0UGF5XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBuZXQgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZU5ldFBheVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhci10by1kYXRlIGFtb3VudCBvZiB0aGUgbmV0IHBheVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZU5ldFBheVxuICAgICAqL1xuICAgIHl0ZF9hbW91bnQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IHRoZSBwYXkgcGVyaW9kLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVQYXlQZXJpb2REZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlscyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcGF5Y2hlY2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGNoZWNrX2Ftb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFBheXN0dWJPdmVycmlkZURpc3RyaWJ1dGlvbkJyZWFrZG93bj59XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVBheVBlcmlvZERldGFpbHNcbiAgICAgKi9cbiAgICBkaXN0cmlidXRpb25fYnJlYWtkb3duPzogQXJyYXk8UGF5c3R1Yk92ZXJyaWRlRGlzdHJpYnV0aW9uQnJlYWtkb3duPjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5IHBlcmlvZCBlbmQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUb3RhbCBlYXJuaW5ncyBiZWZvcmUgdGF4L2RlZHVjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5UGVyaW9kRGV0YWlsc1BheUZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHBheV9mcmVxdWVuY3k/OiBQYXlQZXJpb2REZXRhaWxzUGF5RnJlcXVlbmN5IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBvbiB3aGljaCB0aGUgcGF5c3R1YiB3YXMgaXNzdWVkLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFxcXCJ5eXl5LW1tLWRkXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcGF5X2RheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBheSBwZXJpb2Qgc3RhcnQgZGF0ZSwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0OiBcXFwieXl5eS1tbS1kZFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlUGF5UGVyaW9kRGV0YWlsc1xuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUYXhwYXllciBJRCBvZiB0aGUgaW5kaXZpZHVhbCByZWNlaXZpbmcgdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJPdmVycmlkZVRheHBheWVySURcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXlzdHViT3ZlcnJpZGVUYXhwYXllcklEIHtcbiAgICAvKipcbiAgICAgKiBUeXBlIG9mIElELCBlLmcuIFxcJ1NTTlxcJ1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJPdmVycmlkZVRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF90eXBlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJRCBtYXNrOyBpLmUuIGxhc3QgNCBkaWdpdHMgb2YgdGhlIHRheHBheWVyIElEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGF5c3R1Yk92ZXJyaWRlVGF4cGF5ZXJJRFxuICAgICAqL1xuICAgIGlkX21hc2s/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGF0IHdoaWNoIHRoZSBlbXBsb3llZSBpcyBwYWlkLiBQb3NzaWJsZSB2YWx1ZXM6IGBNT05USExZYCwgYEJJLVdFRUtMWWAsIGBXRUVLTFlgLCBgU0VNSS1NT05USExZYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBheXN0dWJQYXlGcmVxdWVuY3kge1xuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQmlXZWVrbHkgPSAnQkktV0VFS0xZJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JLU1PTlRITFknLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBUaGUgYW1vdW50IG9mIGluY29tZSBlYXJuZWQgeWVhciB0byBkYXRlLCBhcyBiYXNlZCBvbiBwYXlzdHViIGRhdGEuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBheXN0dWJZVEREZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGF5c3R1YllURERldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFllYXItdG8tZGF0ZSBncm9zcyBlYXJuaW5ncy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQYXlzdHViWVRERGV0YWlsc1xuICAgICAqL1xuICAgIGdyb3NzX2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZZWFyLXRvLWRhdGUgbmV0ICh0YWtlIGhvbWUpIGVhcm5pbmdzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBheXN0dWJZVEREZXRhaWxzXG4gICAgICovXG4gICAgbmV0X2Vhcm5pbmdzPzogbnVtYmVyIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtIGlzIGV4cGVjdGVkIHRvIGJlIGRpc2Nvbm5lY3RlZC4gVGhlIHdlYmhvb2sgd2lsbCBjdXJyZW50bHkgYmUgZmlyZWQgNyBkYXlzIGJlZm9yZSB0aGUgZXhpc3RpbmcgSXRlbSBpcyBzY2hlZHVsZWQgZm9yIGRpc2Nvbm5lY3Rpb24uIFRoaXMgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIFt1cGRhdGUgbW9kZV0oaHR0cDovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiBDdXJyZW50bHksIHRoaXMgd2ViaG9vayBpcyBmaXJlZCBvbmx5IGZvciBVUyBvciBDYW5hZGlhbiBpbnN0aXR1dGlvbnM7IGluIHRoZSBVSyBvciBFVSwgeW91IHNob3VsZCBjb250aW51ZSB0byBsaXN0ZWQgZm9yIHRoZSBbYFBFTkRJTkdfRVhQSVJBVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2l0ZW1zLyNwZW5kaW5nX2V4cGlyYXRpb24pIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUEVORElOR19ESVNDT05ORUNUYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlbmRpbmdEaXNjb25uZWN0V2ViaG9va1JlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gICAgICovXG4gICAgcmVhc29uOiBQZW5kaW5nRGlzY29ubmVjdFdlYmhvb2tSZWFzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0Rpc2Nvbm5lY3RXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUmVhc29uIHdoeSB0aGUgaXRlbSBpcyBhYm91dCB0byBiZSBkaXNjb25uZWN0ZWQuIGBJTlNUSVRVVElPTl9NSUdSQVRJT05gOiBUaGUgaW5zdGl0dXRpb24gaXMgbW92aW5nIHRvIEFQSSBvciB0byBhIGRpZmZlcmVudCBpbnRlZ3JhdGlvbi4gRm9yIGV4YW1wbGUsIHRoaXMgY2FuIG9jY3VyIHdoZW4gYW4gaW5zdGl0dXRpb24gbW92ZXMgZnJvbSBhIG5vbi1PQXV0aCBpbnRlZ3JhdGlvbiB0byBhbiBPQXV0aCBpbnRlZ3JhdGlvbi4gYElOU1RJVFVUSU9OX1RPS0VOX0VYUElSQVRJT05gOiBUaGUgY29uc2VudCBvbiBhbiBJdGVtIGFzc29jaWF0ZWQgd2l0aCBhIFVTIG9yIENBIGluc3RpdHV0aW9uIGlzIGFib3V0IHRvIGV4cGlyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBlbmRpbmdEaXNjb25uZWN0V2ViaG9va1JlYXNvbiB7XG4gICAgTWlncmF0aW9uID0gJ0lOU1RJVFVUSU9OX01JR1JBVElPTicsXG4gICAgVG9rZW5FeHBpcmF0aW9uID0gJ0lOU1RJVFVUSU9OX1RPS0VOX0VYUElSQVRJT04nXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVt4oCZcyBhY2Nlc3MgY29uc2VudCBpcyBleHBpcmluZyBpbiA3IGRheXMuIFRoaXMgY2FuIGJlIHJlc29sdmVkIGJ5IGhhdmluZyB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmvigJlzIHVwZGF0ZSBtb2RlLiBUaGlzIHdlYmhvb2sgaXMgZmlyZWQgb25seSBmb3IgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGluc3RpdHV0aW9ucyBpbiBFdXJvcGUgKGluY2x1ZGluZyB0aGUgVUspOyBmb3IgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGluc3RpdHV0aW9ucyBpbiB0aGUgVVMgb3IgQ2FuYWRhLCBzZWUgW2BQRU5ESU5HX0RJU0NPTk5FQ1RgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jcGVuZGluZ19kaXNjb25uZWN0KSBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBJVEVNYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBQRU5ESU5HX0VYUElSQVRJT05gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVuZGluZ0V4cGlyYXRpb25XZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBhdCB3aGljaCB0aGUgSXRlbVxcJ3MgYWNjZXNzIGNvbnNlbnQgd2lsbCBleHBpcmUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZW5kaW5nRXhwaXJhdGlvbldlYmhvb2tcbiAgICAgKi9cbiAgICBjb25zZW50X2V4cGlyYXRpb25fdGltZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFBlbmRpbmdFeHBpcmF0aW9uV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIE1vc3QgcmVsZXZhbnQgZm9yIHBlcnNvbmFsIGZpbmFuY2UgdXNlIGNhc2VzLCBidXQgbm90IGxpbWl0ZWQgdG8gc3VjaCB1c2UgY2FzZXMuICBTZWUgdGhlIFtgdGF4b25vbXkgQ1NWIGZpbGVgXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBmb3IgYSBmdWxsIGxpc3Qgb2YgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyB0byBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMgZnJvbSB0aGUgbGVnYWN5IGNhdGVnb3JpZXMsIGFsc28gcmVmZXIgdG8gdGhlIFtgbWlncmF0aW9uIGd1aWRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvcGZjLW1pZ3JhdGlvbi8pLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBlcnNvbmFsRmluYW5jZUNhdGVnb3J5IHtcbiAgICAvKipcbiAgICAgKiBBIGhpZ2ggbGV2ZWwgY2F0ZWdvcnkgdGhhdCBjb21tdW5pY2F0ZXMgdGhlIGJyb2FkIGNhdGVnb3J5IG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIHByaW1hcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGdyYW51bGFyIGNhdGVnb3J5IGNvbnZleWluZyB0aGUgdHJhbnNhY3Rpb25cXCdzIGludGVudC4gVGhpcyBmaWVsZCBjYW4gYWxzbyBiZSB1c2VkIGFzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjYXRlZ29yeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeVxuICAgICAqL1xuICAgIGRldGFpbGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBkZXNjcmlwdGlvbiBvZiBob3cgY29uZmlkZW50IHdlIGFyZSB0aGF0IHRoZSBwcm92aWRlZCBjYXRlZ29yaWVzIGFjY3VyYXRlbHkgZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uIGludGVudC4gIGBWRVJZX0hJR0hgOiBXZSBhcmUgbW9yZSB0aGFuIDk4JSBjb25maWRlbnQgdGhhdCB0aGlzIGNhdGVnb3J5IHJlZmxlY3RzIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBgSElHSGA6IFdlIGFyZSBtb3JlIHRoYW4gOTAlIGNvbmZpZGVudCB0aGF0IHRoaXMgY2F0ZWdvcnkgcmVmbGVjdHMgdGhlIGludGVudCBvZiB0aGUgdHJhbnNhY3Rpb24uIGBNRURJVU1gOiBXZSBhcmUgbW9kZXJhdGVseSBjb25maWRlbnQgdGhhdCB0aGlzIGNhdGVnb3J5IHJlZmxlY3RzIHRoZSBpbnRlbnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBgTE9XYDogVGhpcyBjYXRlZ29yeSBtYXkgcmVmbGVjdCB0aGUgaW50ZW50LCBidXQgdGhlcmUgbWF5IGJlIG90aGVyIGNhdGVnb3JpZXMgdGhhdCBhcmUgbW9yZSBhY2N1cmF0ZS4gYFVOS05PV05gOiBXZSBkb27igJl0IGtub3cgdGhlIGNvbmZpZGVuY2UgbGV2ZWwgZm9yIHRoaXMgY2F0ZWdvcnkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnlcbiAgICAgKi9cbiAgICBjb25maWRlbmNlX2xldmVsPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBwaG9uZSBudW1iZXJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGhvbmVOdW1iZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaG9uZU51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIGRhdGE6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgaWRlbnRpZmllcyB0aGUgcGhvbmUgbnVtYmVyIGFzIHRoZSBwcmltYXJ5IG51bWJlciBvbiBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQaG9uZU51bWJlclxuICAgICAqL1xuICAgIHByaW1hcnk6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBob25lTnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogUGhvbmVOdW1iZXJUeXBlRW51bTtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBQaG9uZU51bWJlclR5cGVFbnVtIHtcbiAgICBIb21lID0gJ2hvbWUnLFxuICAgIFdvcmsgPSAnd29yaycsXG4gICAgT2ZmaWNlID0gJ29mZmljZScsXG4gICAgTW9iaWxlID0gJ21vYmlsZScsXG4gICAgTW9iaWxlMSA9ICdtb2JpbGUxJyxcbiAgICBPdGhlciA9ICdvdGhlcidcbn1cblxuLyoqXG4gKiBTY29yZSBmb3VuZCBieSBtYXRjaGluZyBwaG9uZSBudW1iZXIgcHJvdmlkZWQgYnkgdGhlIEFQSSB3aXRoIHRoZSBwaG9uZSBudW1iZXIgb24gdGhlIGFjY291bnQgYXQgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gMTAwIGlzIGEgcGVyZmVjdCBtYXRjaCBhbmQgMCBpcyBhIG5vIG1hdGNoLiBJZiB0aGUgYWNjb3VudCBjb250YWlucyBtdWx0aXBsZSBvd25lcnMsIHRoZSBtYXhpbXVtIG1hdGNoIHNjb3JlIGlzIGZpbGxlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGhvbmVOdW1iZXJNYXRjaFNjb3JlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGhvbmVOdW1iZXJNYXRjaFNjb3JlIHtcbiAgICAvKipcbiAgICAgKiBNYXRjaCBzY29yZSBmb3Igbm9ybWFsaXplZCBwaG9uZSBudW1iZXIuIDEwMCBpcyBhIHBlcmZlY3QgbWF0Y2gsIDk5LTcwIGlzIGEgcGFydGlhbCBtYXRjaCAobWF0Y2hpbmcgdGhlIHNhbWUgcGhvbmUgbnVtYmVyIHdpdGggZXh0ZW5zaW9uIGFnYWluc3Qgb25lIHdpdGhvdXQgZXh0ZW5zaW9uLCBldGMuKSwgYW55dGhpbmcgYmVsb3cgNzAgaXMgY29uc2lkZXJlZCBhIG1pc21hdGNoLiBUeXBpY2FsbHksIHRoZSBtYXRjaCB0aHJlc2hvbGQgc2hvdWxkIGJlIHNldCB0byBhIHNjb3JlIG9mIDcwIG9yIGhpZ2hlci4gSWYgdGhlIHBob25lIG51bWJlciBpcyBtaXNzaW5nIGZyb20gZWl0aGVyIHRoZSBBUEkgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCB0aGlzIGlzIG51bGwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGhvbmVOdW1iZXJNYXRjaFNjb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBlbnVtIGluZGljYXRpbmcgd2hldGhlciBhIHBob25lIG51bWJlciBpcyBhIHBob25lIGxpbmUgb3IgYSBmYXggbGluZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFBob25lVHlwZSB7XG4gICAgUGhvbmUgPSAncGhvbmUnLFxuICAgIEZheCA9ICdmYXgnXG59XG5cbi8qKlxuICogVGhlIHR5cGUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgZGV0ZWN0ZWQgaW4gdGhlIGltYWdlcyBwcm92aWRlZC4gV2lsbCBhbHdheXMgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgICBgZHJpdmVyc19saWNlbnNlYCAtIEEgZHJpdmVyXFwncyBsaWNlbnNlIGlzc3VlZCBieSB0aGUgYXNzb2NpYXRlZCBjb3VudHJ5LCBlc3RhYmxpc2hpbmcgaWRlbnRpdHkgd2l0aG91dCBhbnkgZ3VhcmFudGVlIGFzIHRvIGNpdGl6ZW5zaGlwLCBhbmQgZ3JhbnRpbmcgZHJpdmluZyBwcml2aWxlZ2VzICAgIGBpZF9jYXJkYCAtIEEgZ2VuZXJhbCBuYXRpb25hbCBpZGVudGlmaWNhdGlvbiBjYXJkLCBkaXN0aW5jdCBmcm9tIGRyaXZlclxcJ3MgbGljZW5zZXMgYXMgaXQgb25seSBlc3RhYmxpc2hlcyBpZGVudGl0eSAgICBgcGFzc3BvcnRgIC0gQSB0cmF2ZWwgcGFzc3BvcnQgaXNzdWVkIGJ5IHRoZSBhc3NvY2lhdGVkIGNvdW50cnkgZm9yIG9uZSBvZiBpdHMgY2l0aXplbnMgICAgYHJlc2lkZW5jZV9wZXJtaXRfY2FyZGAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIHRvIDxlbT50ZW1wb3JhcmlseTwvZW0+IHJlc2lkZSB0aGVyZSAgICBgcmVzaWRlbnRfY2FyZGAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIHRvIDxlbT5wZXJtYW5lbnRseTwvZW0+IHJlc2lkZSB0aGVyZSAgICBgdmlzYWAgLSBBbiBpZGVudGl0eSBkb2N1bWVudCBpc3N1ZWQgYnkgdGhlIGFzc29jaWF0ZWQgY291bnRyeSBwZXJtaXR0aW5nIGEgZm9yZWlnbiBjaXRpemVuIGVudHJ5IGZvciBhIHNob3J0IGR1cmF0aW9uIGFuZCBmb3IgYSBzcGVjaWZpYyBwdXJwb3NlLCB0eXBpY2FsbHkgbm8gbG9uZ2VyIHRoYW4gNiBtb250aHMgIE5vdGU6IFRoaXMgdmFsdWUgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHRoZSBJRCB0eXBlIHRoYXQgdGhlIHVzZXIgc2VsZWN0cyB3aXRoaW4gTGluay4gRm9yIGV4YW1wbGUsIGlmIHRoZXkgc2VsZWN0IFxcXCJEcml2ZXJcXCdzIExpY2Vuc2VcXFwiIGJ1dCB0aGVuIHN1Ym1pdCBhIHBpY3R1cmUgb2YgYSBwYXNzcG9ydCwgdGhpcyBmaWVsZCB3aWxsIHNheSBgcGFzc3BvcnRgXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQaHlzaWNhbERvY3VtZW50Q2F0ZWdvcnkge1xuICAgIERyaXZlcnNMaWNlbnNlID0gJ2RyaXZlcnNfbGljZW5zZScsXG4gICAgSWRDYXJkID0gJ2lkX2NhcmQnLFxuICAgIFBhc3Nwb3J0ID0gJ3Bhc3Nwb3J0JyxcbiAgICBSZXNpZGVuY2VQZXJtaXRDYXJkID0gJ3Jlc2lkZW5jZV9wZXJtaXRfY2FyZCcsXG4gICAgUmVzaWRlbnRDYXJkID0gJ3Jlc2lkZW50X2NhcmQnLFxuICAgIFZpc2EgPSAndmlzYSdcbn1cblxuLyoqXG4gKiBEYXRhIGV4dHJhY3RlZCBmcm9tIGEgdXNlci1zdWJtaXR0ZWQgZG9jdW1lbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGEge1xuICAgIC8qKlxuICAgICAqIEFscGhhLW51bWVyaWMgSUQgbnVtYmVyIGV4dHJhY3RlZCB2aWEgT0NSIGZyb20gdGhlIHVzZXJcXCdzIGRvY3VtZW50IGltYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgaWRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQaHlzaWNhbERvY3VtZW50Q2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IFBoeXNpY2FsRG9jdW1lbnRDYXRlZ29yeTtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFcbiAgICAgKi9cbiAgICBleHBpcmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGlzc3VpbmdfY291bnRyeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgaXNzdWluZ19yZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGV4dHJhY3RlZCBmcm9tIHRoZSBkb2N1bWVudCBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnRBZGRyZXNzUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgYWRkcmVzczogSWRlbnRpdHlWZXJpZmljYXRpb25Eb2N1bWVudEFkZHJlc3NSZXNwb25zZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnROYW1lUmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhXG4gICAgICovXG4gICAgbmFtZT86IElkZW50aXR5VmVyaWZpY2F0aW9uRG9jdW1lbnROYW1lUmVzcG9uc2UgfCBudWxsO1xufVxuLyoqXG4gKiBBbmFseXNpcyBvZiB0aGUgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgc3VibWl0dGVkIGRvY3VtZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50TmFtZU1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIG5hbWU6IERvY3VtZW50TmFtZU1hdGNoQ29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RG9jdW1lbnREYXRlT2ZCaXJ0aE1hdGNoQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEV4dHJhY3RlZERhdGFBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IERvY3VtZW50RGF0ZU9mQmlydGhNYXRjaENvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0V4cGlyYXRpb25EYXRlfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50RXh0cmFjdGVkRGF0YUFuYWx5c2lzXG4gICAgICovXG4gICAgZXhwaXJhdGlvbl9kYXRlOiBFeHBpcmF0aW9uRGF0ZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SXNzdWluZ0NvdW50cnl9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRFeHRyYWN0ZWREYXRhQW5hbHlzaXNcbiAgICAgKi9cbiAgICBpc3N1aW5nX2NvdW50cnk6IElzc3VpbmdDb3VudHJ5O1xufVxuLyoqXG4gKiBVUkxzIGZvciBkb3dubG9hZGluZyBvcmlnaW5hbCBhbmQgY3JvcHBlZCBpbWFnZXMgZm9yIHRoaXMgZG9jdW1lbnQgc3VibWlzc2lvbi4gVGhlIFVSTHMgYXJlIGRlc2lnbmVkIHRvIG9ubHkgYWxsb3cgZG93bmxvYWRpbmcsIG5vdCBob3QgbGlua2luZywgc28gdGhlIFVSTCB3aWxsIG9ubHkgc2VydmUgdGhlIGRvY3VtZW50IGltYWdlIGZvciA2MCBzZWNvbmRzIGJlZm9yZSBleHBpcmluZy4gVGhlIGV4cGlyYXRpb24gdGltZSBpcyA2MCBzZWNvbmRzIGFmdGVyIHRoZSBgR0VUYCByZXF1ZXN0IGZvciB0aGUgYXNzb2NpYXRlZCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdC4gQSBuZXcgZXhwaXJpbmcgVVJMIGlzIGdlbmVyYXRlZCB3aXRoIGVhY2ggcmVxdWVzdCwgc28geW91IGNhbiBhbHdheXMgcmVyZXF1ZXN0IHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBpZiBvbmUgb2YgeW91ciBVUkxzIGV4cGlyZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaHlzaWNhbERvY3VtZW50SW1hZ2VzIHtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyB0aGUgdW5jcm9wcGVkIG9yaWdpbmFsIGltYWdlIG9mIHRoZSBmcm9udCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIG9yaWdpbmFsX2Zyb250OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIHRoZSBvcmlnaW5hbCBpbWFnZSBvZiB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQuIE1pZ2h0IGJlIG51bGwgaWYgdGhlIGJhY2sgb2YgdGhlIGRvY3VtZW50IHdhcyBub3QgY29sbGVjdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBoeXNpY2FsRG9jdW1lbnRJbWFnZXNcbiAgICAgKi9cbiAgICBvcmlnaW5hbF9iYWNrOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRlbXBvcmFyeSBVUkwgdGhhdCBleHBpcmVzIGFmdGVyIDYwIHNlY29uZHMgZm9yIGRvd25sb2FkaW5nIGEgY3JvcHBlZCBpbWFnZSBjb250YWluaW5nIGp1c3QgdGhlIGZyb250IG9mIHRoZSBkb2N1bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQaHlzaWNhbERvY3VtZW50SW1hZ2VzXG4gICAgICovXG4gICAgY3JvcHBlZF9mcm9udDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyBhIGNyb3BwZWQgaW1hZ2UgY29udGFpbmluZyBqdXN0IHRoZSBiYWNrIG9mIHRoZSBkb2N1bWVudC4gTWlnaHQgYmUgbnVsbCBpZiB0aGUgYmFjayBvZiB0aGUgZG9jdW1lbnQgd2FzIG5vdCBjb2xsZWN0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIGNyb3BwZWRfYmFjazogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIHRoYXQgZXhwaXJlcyBhZnRlciA2MCBzZWNvbmRzIGZvciBkb3dubG9hZGluZyBhIGNyb3Agb2YganVzdCB0aGUgdXNlclxcJ3MgZmFjZSBmcm9tIHRoZSBkb2N1bWVudCBpbWFnZS4gTWlnaHQgYmUgbnVsbCBpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgY29udGFpbiBhIGZhY2UgcGhvdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGh5c2ljYWxEb2N1bWVudEltYWdlc1xuICAgICAqL1xuICAgIGZhY2U6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSByZXN1bHRzIG9mIHRoZSBQbGFpZCBDaGVjayBzY29yZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQbGFpZENoZWNrU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFpZENoZWNrU2NvcmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBzY29yZSByZXR1cm5lZCBieSB0aGUgUGxhaWQgQ2hlY2sgU2NvcmUgbW9kZWwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRDaGVja1Njb3JlXG4gICAgICovXG4gICAgc2NvcmU/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSByZWFzb25zIGZvciBhbiBpbmRpdmlkdWFsIGhhdmluZyByaXNrIGFjY29yZGluZyB0byB0aGUgUGxhaWQgQ2hlY2sgc2NvcmUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQ2hlY2tTY29yZVxuICAgICAqL1xuICAgIHJlYXNvbl9jb2Rlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygd2h5IHRoZSBQbGFpZCBDaGVjayBzY29yZSBjb3VsZCBub3QgYmUgY29tcHV0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRDaGVja1Njb3JlXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRXJyb3JzIGFyZSBpZGVudGlmaWVkIGJ5IGBlcnJvcl9jb2RlYCBhbmQgY2F0ZWdvcml6ZWQgYnkgYGVycm9yX3R5cGVgLiBVc2UgdGhlc2UgaW4gcHJlZmVyZW5jZSB0byBIVFRQIHN0YXR1cyBjb2RlcyB0byBpZGVudGlmeSBhbmQgaGFuZGxlIHNwZWNpZmljIGVycm9ycy4gSFRUUCBzdGF0dXMgY29kZXMgYXJlIHNldCBhbmQgcHJvdmlkZSB0aGUgYnJvYWRlc3QgY2F0ZWdvcml6YXRpb24gb2YgZXJyb3JzOiA0eHggY29kZXMgYXJlIGZvciBkZXZlbG9wZXItIG9yIHVzZXItcmVsYXRlZCBlcnJvcnMsIGFuZCA1eHggY29kZXMgYXJlIGZvciBQbGFpZC1yZWxhdGVkIGVycm9ycywgYW5kIHRoZSBzdGF0dXMgd2lsbCBiZSAyeHggaW4gbm9uLWVycm9yIGNhc2VzLiBBbiBJdGVtIHdpdGggYSBub24tYG51bGxgIGVycm9yIG9iamVjdCB3aWxsIG9ubHkgYmUgcGFydCBvZiBhbiBBUEkgcmVzcG9uc2Ugd2hlbiBjYWxsaW5nIGAvaXRlbS9nZXRgIHRvIHZpZXcgSXRlbSBzdGF0dXMuIE90aGVyd2lzZSwgZXJyb3IgZmllbGRzIHdpbGwgYmUgYG51bGxgIGlmIG5vIGVycm9yIGhhcyBvY2N1cnJlZDsgaWYgYW4gZXJyb3IgaGFzIG9jY3VycmVkLCBhbiBlcnJvciBjb2RlIHdpbGwgYmUgcmV0dXJuZWQgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhaWRFcnJvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBsYWlkRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX3R5cGU6IFBsYWlkRXJyb3JUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBwYXJ0aWN1bGFyIGVycm9yIGNvZGUuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3BlY2lmaWMgcmVhc29uIGZvciB0aGUgZXJyb3IgY29kZS4gQ3VycmVudGx5LCByZWFzb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBPQXV0aC1iYXNlZCBpdGVtIGVycm9yczsgYG51bGxgIHdpbGwgYmUgcmV0dXJuZWQgb3RoZXJ3aXNlLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLiAgUG9zc2libGUgdmFsdWVzOiBgT0FVVEhfSU5WQUxJRF9UT0tFTmA6IFRoZSB1c2Vy4oCZcyBPQXV0aCBjb25uZWN0aW9uIHRvIHRoaXMgaW5zdGl0dXRpb24gaGFzIGJlZW4gaW52YWxpZGF0ZWQuICBgT0FVVEhfQ09OU0VOVF9FWFBJUkVEYDogVGhlIHVzZXJcXCdzIGFjY2VzcyBjb25zZW50IGZvciB0aGlzIE9BdXRoIGNvbm5lY3Rpb24gdG8gdGhpcyBpbnN0aXR1dGlvbiBoYXMgZXhwaXJlZC4gIGBPQVVUSF9VU0VSX1JFVk9LRURgOiBUaGUgdXNlcuKAmXMgT0F1dGggY29ubmVjdGlvbiB0byB0aGlzIGluc3RpdHV0aW9uIGlzIGludmFsaWQgYmVjYXVzZSB0aGUgdXNlciByZXZva2VkIHRoZWlyIGNvbm5lY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGVfcmVhc29uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gVGhpcyBtYXkgY2hhbmdlIG92ZXIgdGltZSBhbmQgaXMgbm90IHNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX21lc3NhZ2U6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVzZXItZnJpZW5kbHkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuIGBudWxsYCBpZiB0aGUgZXJyb3IgaXMgbm90IHJlbGF0ZWQgdG8gdXNlciBhY3Rpb24uICBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSByZXF1ZXN0LCB0byBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgcHVycG9zZXMuIFRoaXMgZmllbGQgd2lsbCBiZSBvbWl0dGVkIGluIGVycm9ycyBwcm92aWRlZCBieSB3ZWJob29rcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgcmVxdWVzdF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJbiB0aGlzIHByb2R1Y3QsIGEgcmVxdWVzdCBjYW4gcGVydGFpbiB0byBtb3JlIHRoYW4gb25lIEl0ZW0uIElmIGFuIGVycm9yIGlzIHJldHVybmVkIGZvciBzdWNoIGEgcmVxdWVzdCwgYGNhdXNlc2Agd2lsbCByZXR1cm4gYW4gYXJyYXkgb2YgZXJyb3JzIGNvbnRhaW5pbmcgYSBicmVha2Rvd24gb2YgdGhlc2UgZXJyb3JzIG9uIHRoZSBpbmRpdmlkdWFsIEl0ZW0gbGV2ZWwsIGlmIGFueSBjYW4gYmUgaWRlbnRpZmllZC4gIGBjYXVzZXNgIHdpbGwgb25seSBiZSBwcm92aWRlZCBmb3IgdGhlIGBlcnJvcl90eXBlYCBgQVNTRVRfUkVQT1JUX0VSUk9SYC4gYGNhdXNlc2Agd2lsbCBhbHNvIG5vdCBiZSBwb3B1bGF0ZWQgaW5zaWRlIGFuIGVycm9yIG5lc3RlZCB3aXRoaW4gYSBgd2FybmluZ2Agb2JqZWN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxhbnk+fVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgY2F1c2VzPzogQXJyYXk8YW55PjtcbiAgICAvKipcbiAgICAgKiBUaGUgSFRUUCBzdGF0dXMgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGVycm9yLiBUaGlzIHdpbGwgb25seSBiZSByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYm9keSB3aGVuIHRoZSBlcnJvciBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCB2aWEgYSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBQbGFpZCBkb2N1bWVudGF0aW9uIHBhZ2Ugd2l0aCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkRXJyb3JcbiAgICAgKi9cbiAgICBkb2N1bWVudGF0aW9uX3VybD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdWdnZXN0ZWQgc3RlcHMgZm9yIHJlc29sdmluZyB0aGUgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEVycm9yXG4gICAgICovXG4gICAgc3VnZ2VzdGVkX2FjdGlvbj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLiBTYWZlIGZvciBwcm9ncmFtbWF0aWMgdXNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUGxhaWRFcnJvclR5cGUge1xuICAgIEludmFsaWRSZXF1ZXN0ID0gJ0lOVkFMSURfUkVRVUVTVCcsXG4gICAgSW52YWxpZFJlc3VsdCA9ICdJTlZBTElEX1JFU1VMVCcsXG4gICAgSW52YWxpZElucHV0ID0gJ0lOVkFMSURfSU5QVVQnLFxuICAgIEluc3RpdHV0aW9uRXJyb3IgPSAnSU5TVElUVVRJT05fRVJST1InLFxuICAgIFJhdGVMaW1pdEV4Y2VlZGVkID0gJ1JBVEVfTElNSVRfRVhDRUVERUQnLFxuICAgIEFwaUVycm9yID0gJ0FQSV9FUlJPUicsXG4gICAgSXRlbUVycm9yID0gJ0lURU1fRVJST1InLFxuICAgIEFzc2V0UmVwb3J0RXJyb3IgPSAnQVNTRVRfUkVQT1JUX0VSUk9SJyxcbiAgICBSZWNhcHRjaGFFcnJvciA9ICdSRUNBUFRDSEFfRVJST1InLFxuICAgIE9hdXRoRXJyb3IgPSAnT0FVVEhfRVJST1InLFxuICAgIFBheW1lbnRFcnJvciA9ICdQQVlNRU5UX0VSUk9SJyxcbiAgICBCYW5rVHJhbnNmZXJFcnJvciA9ICdCQU5LX1RSQU5TRkVSX0VSUk9SJyxcbiAgICBJbmNvbWVWZXJpZmljYXRpb25FcnJvciA9ICdJTkNPTUVfVkVSSUZJQ0FUSU9OX0VSUk9SJyxcbiAgICBNaWNyb2RlcG9zaXRzRXJyb3IgPSAnTUlDUk9ERVBPU0lUU19FUlJPUicsXG4gICAgU2FuZGJveEVycm9yID0gJ1NBTkRCT1hfRVJST1InLFxuICAgIFBhcnRuZXJFcnJvciA9ICdQQVJUTkVSX0VSUk9SJyxcbiAgICBUcmFuc2FjdGlvbnNFcnJvciA9ICdUUkFOU0FDVElPTlNfRVJST1InLFxuICAgIFRyYW5zYWN0aW9uRXJyb3IgPSAnVFJBTlNBQ1RJT05fRVJST1InLFxuICAgIFRyYW5zZmVyRXJyb3IgPSAnVFJBTlNGRVJfRVJST1InXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBzZXQgb2YgaWRzIHJlbGF0ZWQgdG8gYW4gZW1wbG95ZWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUGxhdGZvcm1JZHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGF0Zm9ybUlkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIGVtcGxveWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBlbXBsb3llZV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGFuIGVtcGxveWVlIGFzIGdpdmVuIGJ5IHRoZWlyIHBheXJvbGxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQbGF0Zm9ybUlkc1xuICAgICAqL1xuICAgIHBheXJvbGxfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcG9zaXRpb24gb2YgdGhlIGVtcGxveWVlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUGxhdGZvcm1JZHNcbiAgICAgKi9cbiAgICBwb3NpdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBkYXRhIGZyb20gdGhlIENhc2hTY29yZcKuIHByb2R1Y3QgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21DYXNoU2NvcmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbUNhc2hTY29yZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgUHJpc20gRGF0YVxcJ3MgY2FzaCBzY29yZSBtb2RlbCB1c2VkLiBUaGlzIGZpZWxkIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYG1vZGVsX3ZlcnNpb25gLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgUHJpc20gRGF0YVxcJ3MgY2FzaCBzY29yZSBtb2RlbCB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICovXG4gICAgbW9kZWxfdmVyc2lvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc2NvcmUgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS4gUmFuZ2VzIGZyb20gMS05OTksIHdpdGggaGlnaGVyIHNjb3JlIGluZGljYXRpbmcgbG93ZXIgcmlzay5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbnMgZm9yIGFuIGluZGl2aWR1YWwgaGF2aW5nIHJpc2sgYWNjb3JkaW5nIHRvIHRoZSBjYXNoIHNjb3JlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZVxuICAgICAqL1xuICAgIHJlYXNvbl9jb2Rlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtQ2FzaFNjb3JlTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICovXG4gICAgbWV0YWRhdGE/OiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIFRoZSBlcnJvciByZXR1cm5lZCBieSBQcmlzbSBmb3IgdGhpcyBwcm9kdWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlXG4gICAgICovXG4gICAgZXJyb3JfcmVhc29uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBhYm91dCB0aGUgcHJvdmlkZWQgdHJhbnNhY3Rpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21DYXNoU2NvcmVNZXRhZGF0YSB7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbWF4X2FnZTogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtaW5fYWdlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBsYXRlc3QgY3JlZGl0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtaW5fYWdlX2NyZWRpdDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBOdW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgbGF0ZXN0IGRlYml0IHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBtaW5fYWdlX2RlYml0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBvbGRlc3QgZGViaXQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG1heF9hZ2VfZGViaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRheXMgc2luY2UgdGhlIG9sZGVzdCBjcmVkaXQgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21DYXNoU2NvcmVNZXRhZGF0YVxuICAgICAqL1xuICAgIG1heF9hZ2VfY3JlZGl0OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBudW1fdHJ4bl9jcmVkaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRlYml0IHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbnVtX3RyeG5fZGViaXQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgaW4gdGhlIGxhc3QgMzAgZGF5cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUNhc2hTY29yZU1ldGFkYXRhXG4gICAgICovXG4gICAgbDFtX2NyZWRpdF92YWx1ZV9jbnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTnVtYmVyIG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbiB0aGUgbGFzdCAzMCBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByaXNtQ2FzaFNjb3JlTWV0YWRhdGFcbiAgICAgKi9cbiAgICBsMW1fZGViaXRfdmFsdWVfY250OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgdmVyc2lvbiBvZiBQcmlzbSBDYXNoU2NvcmUuIElmIG5vdCBzcGVjaWZpZWQsIHdpbGwgZGVmYXVsdCB0byB2My5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByaXNtQ2FzaFNjb3JlVmVyc2lvbiB7XG4gICAgXzNMaXRlID0gJzNfbGl0ZScsXG4gICAgXzMgPSAnMycsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRoZSBkYXRhIGZyb20gdGhlIEZpcnN0RGV0ZWN0IHByb2R1Y3QgcmV0dXJuZWQgYnkgUHJpc20gRGF0YS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJpc21GaXJzdERldGVjdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByaXNtRmlyc3REZXRlY3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIEZpcnN0RGV0ZWN0IG1vZGVsIHVzZWQuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBgbW9kZWxfdmVyc2lvbmAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIFByaXNtIERhdGFcXCdzIEZpcnN0RGV0ZWN0IG1vZGVsIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIG1vZGVsX3ZlcnNpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNjb3JlIHJldHVybmVkIGJ5IFByaXNtIERhdGEuIFJhbmdlcyBmcm9tIDEtOTk5LCB3aXRoIGhpZ2hlciBzY29yZSBpbmRpY2F0aW5nIGxvd2VyIHJpc2suXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHJlYXNvbnMgZm9yIGFuIGluZGl2aWR1YWwgaGF2aW5nIHJpc2sgYWNjb3JkaW5nIHRvIHRoZSBGaXJzdERldGVjdCBzY29yZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIHJlYXNvbl9jb2Rlcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ByaXNtQ2FzaFNjb3JlTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFByaXNtRmlyc3REZXRlY3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IFByaXNtQ2FzaFNjb3JlTWV0YWRhdGE7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIHJldHVybmVkIGJ5IFByaXNtIGZvciB0aGlzIHByb2R1Y3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21GaXJzdERldGVjdFxuICAgICAqL1xuICAgIGVycm9yX3JlYXNvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgUHJpc20gRmlyc3REZXRlY3QuIElmIG5vdCBzcGVjaWZpZWQsIHdpbGwgZGVmYXVsdCB0byB2My5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByaXNtRmlyc3REZXRlY3RWZXJzaW9uIHtcbiAgICBfMyA9ICczJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGRhdGEgZnJvbSB0aGUgSW5zaWdodHMgcHJvZHVjdCByZXR1cm5lZCBieSBQcmlzbSBEYXRhLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcmlzbUluc2lnaHRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJpc21JbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIHZlcnNpb24gb2YgUHJpc20gRGF0YVxcJ3MgaW5zaWdodHMgbW9kZWwgdXNlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbUluc2lnaHRzXG4gICAgICovXG4gICAgdmVyc2lvbjogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJbnNpZ2h0cyBSZXN1bHQgb2JqZWN0IGlzIGEgbWFwIG9mIGNhc2ggZmxvdyBhdHRyaWJ1dGVzLCB3aGVyZSB0aGUga2V5IGlzIGEgc3RyaW5nLCBhbmQgdGhlIHZhbHVlIGlzIGEgZmxvYXQgb3Igc3RyaW5nLlxuICAgICAqIEB0eXBlIHtvYmplY3R9XG4gICAgICogQG1lbWJlcm9mIFByaXNtSW5zaWdodHNcbiAgICAgKi9cbiAgICByZXN1bHQ/OiBvYmplY3Q7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIHJldHVybmVkIGJ5IFByaXNtIGZvciB0aGlzIHByb2R1Y3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJpc21JbnNpZ2h0c1xuICAgICAqL1xuICAgIGVycm9yX3JlYXNvbj86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHZlcnNpb24gb2YgUHJpc20gSW5zaWdodHMuIElmIG5vdCBzcGVjaWZpZWQsIHdpbGwgZGVmYXVsdCB0byB2My5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByaXNtSW5zaWdodHNWZXJzaW9uIHtcbiAgICBfMyA9ICczJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIFByaXNtIHByb2R1Y3RzIHRoYXQgY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBQbGFpZCBBUElcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByaXNtUHJvZHVjdCB7XG4gICAgSW5zaWdodHMgPSAnaW5zaWdodHMnLFxuICAgIFNjb3JlcyA9ICdzY29yZXMnXG59XG5cbi8qKlxuICogVGhlIHZlcnNpb25zIG9mIFByaXNtIHByb2R1Y3RzIHRvIGV2YWx1YXRlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByaXNtVmVyc2lvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmlzbVZlcnNpb25zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21GaXJzdERldGVjdFZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFByaXNtVmVyc2lvbnNcbiAgICAgKi9cbiAgICBmaXJzdGRldGVjdD86IFByaXNtRmlyc3REZXRlY3RWZXJzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21DYXNoU2NvcmVWZXJzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBQcmlzbVZlcnNpb25zXG4gICAgICovXG4gICAgY2FzaHNjb3JlPzogUHJpc21DYXNoU2NvcmVWZXJzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJpc21JbnNpZ2h0c1ZlcnNpb259XG4gICAgICogQG1lbWJlcm9mIFByaXNtVmVyc2lvbnNcbiAgICAgKi9cbiAgICBpbnNpZ2h0cz86IFByaXNtSW5zaWdodHNWZXJzaW9uIHwgbnVsbDtcbn1cbi8qKlxuICogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2FjY291bnQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYWNjb3VudC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBY2NvdW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgSW5zdGl0dXRpb24gSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSBBY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCB2YWx1ZSBvYnRhaW5lZCBmcm9tIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBpbiBMaW5rXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQXV0aEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYXV0aC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckF1dGhHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yTnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBudW1iZXJzOiBQcm9jZXNzb3JOdW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRCYXNlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JBdXRoR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50OiBBY2NvdW50QmFzZTtcbn1cbi8qKlxuICogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIE9wdGlvbmFsIHBhcmFtZXRlcnMgdG8gYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApIGluZGljYXRpbmcgdGhlIG9sZGVzdCBhY2NlcHRhYmxlIGJhbGFuY2Ugd2hlbiBtYWtpbmcgYSByZXF1ZXN0IHRvIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgLiAgVGhpcyBmaWVsZCBpcyBvbmx5IG5lY2Vzc2FyeSB3aGVuIHRoZSBpbnN0aXR1dGlvbiBpcyBgaW5zXzEyODAyNmAgKENhcGl0YWwgT25lKSwgKmFuZCogb25lIG9yIG1vcmUgYWNjb3VudCB0eXBlcyBiZWluZyByZXF1ZXN0ZWQgaXMgYSBub24tZGVwb3NpdG9yeSBhY2NvdW50IChzdWNoIGFzIGEgY3JlZGl0IGNhcmQpIGFzIENhcGl0YWwgT25lIGRvZXMgbm90IHByb3ZpZGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBJbiB0aGlzIGNhc2UsIGEgdmFsdWUgbXVzdCBiZSBwcm92aWRlZCBvciBhbiBgSU5WQUxJRF9SRVFVRVNUYCBlcnJvciB3aXRoIHRoZSBjb2RlIG9mIGBJTlZBTElEX0ZJRUxEYCB3aWxsIGJlIHJldHVybmVkLiBGb3IgYWxsIG90aGVyIGluc3RpdHV0aW9ucywgYXMgd2VsbCBhcyBmb3IgZGVwb3NpdG9yeSBhY2NvdW50cyBhdCBDYXBpdGFsIE9uZSAoaW5jbHVkaW5nIGFsbCBjaGVja2luZyBhbmQgc2F2aW5ncyBhY2NvdW50cykgdGhpcyBmaWVsZCBpcyBpZ25vcmVkIGFuZCByZWFsLXRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiB3aWxsIGJlIGZldGNoZWQuICBJZiB0aGlzIGZpZWxkIGlzIG5vdCBpZ25vcmVkLCBhbmQgbm8gYWNjZXB0YWJsZSBiYWxhbmNlIGlzIGF2YWlsYWJsZSwgYW4gYElOVkFMSURfUkVTVUxUYCBlcnJvciB3aXRoIHRoZSBjb2RlIGBMQVNUX1VQREFURURfREFURVRJTUVfT1VUX09GX1JBTkdFYCB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG1pbl9sYXN0X3VwZGF0ZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGJhbmsgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIGJhbmsgdHJhbnNmZXIgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QmFua1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU6IEJhbmtUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBCYW5rVHJhbnNmZXJOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIGJhbmsgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQg4oCTIHNob3VsZCBiZSBzZXQgdG8gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDEwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlclVzZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBCYW5rVHJhbnNmZXJVc2VyO1xuICAgIC8qKlxuICAgICAqIEFuIGFyYml0cmFyeSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCBmb3Igc3RvcmFnZSB3aXRoIHRoZSBiYW5rIHRyYW5zZmVyLiBNYXkgYmUgdXAgdG8gMTAwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGN1c3RvbV90YWc/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBNZXRhZGF0YSBvYmplY3QgaXMgYSBtYXBwaW5nIG9mIGNsaWVudC1wcm92aWRlZCBzdHJpbmcgZmllbGRzIHRvIGFueSBzdHJpbmcgdmFsdWUuIFRoZSBmb2xsb3dpbmcgbGltaXRhdGlvbnMgYXBwbHk6IFRoZSBKU09OIHZhbHVlcyBtdXN0IGJlIFN0cmluZ3MgKG5vIG5lc3RlZCBKU09OIG9iamVjdHMgYWxsb3dlZCkgT25seSBBU0NJSSBjaGFyYWN0ZXJzIG1heSBiZSB1c2VkIE1heGltdW0gb2YgNTAga2V5L3ZhbHVlIHBhaXJzIE1heGltdW0ga2V5IGxlbmd0aCBvZiA0MCBjaGFyYWN0ZXJzIE1heGltdW0gdmFsdWUgbGVuZ3RoIG9mIDUwMCBjaGFyYWN0ZXJzIFxuICAgICAqIEB0eXBlIHt7IFtrZXk6IHN0cmluZ106IHN0cmluZzsgfX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoaXMgdHJhbnNmZXIuIElmIHlvdSBoYXZlIG1vcmUgdGhhbiBvbmUgb3JpZ2luYXRpb24gYWNjb3VudCwgdGhpcyB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYmFua190cmFuc2ZlcjogQmFua1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbiBkYXRhIGlzIGF2YWlsYWJsZSBmb3IgYW4gSXRlbS4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbiBkYXRhIHNldmVyYWwgdGltZXMgYSBkYXkuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC4gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgREVGQVVMVF9VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBkZXRlY3RlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoaXMgd2ViaG9vayB3YXMgZmlyZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yRGVmYXVsdFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckRlZmF1bHRVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gcHVsbCBpcyBjb21wbGV0ZWQgYW5kIFBsYWlkIGhhcyBwcmVwYXJlZCBhcyBtdWNoIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gZGF0YSBhcyBwb3NzaWJsZSBmb3IgdGhlIEl0ZW0uIE9uY2UgdGhpcyB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLCB0cmFuc2FjdGlvbiBkYXRhIGJleW9uZCB0aGUgbW9zdCByZWNlbnQgMzAgZGF5cyBjYW4gYmUgZmV0Y2hlZCBmb3IgdGhlIEl0ZW0uIFRoaXMgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgaWYgYWNjb3VudCBzZWxlY3Rpb25zIGZvciB0aGUgSXRlbSBhcmUgdXBkYXRlZCwgd2l0aCBgbmV3X3RyYW5zYWN0aW9uc2Agc2V0IHRvIHRoZSBudW1iZXIgb2YgbmV0IG5ldyB0cmFuc2FjdGlvbnMgcHVsbGVkIGFmdGVyIHRoZSBhY2NvdW50IHNlbGVjdGlvbiB1cGRhdGUuICBUaGlzIHdlYmhvb2sgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgOyBpZiB5b3UgYXJlIHVzaW5nIHRoZSBuZXdlciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySGlzdG9yaWNhbFVwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBISVNUT1JJQ0FMX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBuZXcgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvckhpc3RvcmljYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JIaXN0b3JpY2FsVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaWRlbnRpdHkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FjY291bnRJZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRJZGVudGl0eTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlNYXRjaFVzZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IElkZW50aXR5TWF0Y2hVc2VyO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudElkZW50aXR5TWF0Y2hTY29yZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudElkZW50aXR5TWF0Y2hTY29yZTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gYW4gSXRlbVxcJ3MgaW5pdGlhbCB0cmFuc2FjdGlvbiBwdWxsIGlzIGNvbXBsZXRlZC4gT25jZSB0aGlzIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQsIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBtb3N0IHJlY2VudCAzMCBkYXlzIGNhbiBiZSBmZXRjaGVkIGZvciB0aGUgSXRlbS4gVGhpcyB3ZWJob29rIHdpbGwgYWxzbyBiZSBmaXJlZCBpZiBhY2NvdW50IHNlbGVjdGlvbnMgZm9yIHRoZSBJdGVtIGFyZSB1cGRhdGVkLCB3aXRoIGBuZXdfdHJhbnNhY3Rpb25zYCBzZXQgdG8gdGhlIG51bWJlciBvZiBuZXQgbmV3IHRyYW5zYWN0aW9ucyBwdWxsZWQgYWZ0ZXIgdGhlIGFjY291bnQgc2VsZWN0aW9uIHVwZGF0ZS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGA7IGlmIHlvdSBhcmUgdXNpbmcgdGhlIG5ld2VyIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCwgdGhpcyB3ZWJob29rIHdpbGwgc3RpbGwgYmUgZmlyZWQgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIGFuZCByZXNwb25kIHRvIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJbml0aWFsVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYElOSVRJQUxfVVBEQVRFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVycm9yIGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3ZWJob29rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZXJyb3I/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgbmV3IHRyYW5zYWN0aW9ucyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW5pdGlhbFVwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBuZXdfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckluaXRpYWxVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzbWVudHMvaG9sZGluZ3MvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGhvbGRpbmdzIGJlbG9uZ2luZyB0byBpbnZlc3RtZW50IGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gRGV0YWlscyBvZiB0aGUgc2VjdXJpdGllcyBpbiB0aGUgaG9sZGluZ3MgYXJlIHByb3ZpZGVkIGluIHRoZSBgc2VjdXJpdGllc2AgZmllbGQuIFxuICAgICAqIEB0eXBlIHtBcnJheTxIb2xkaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaG9sZGluZ3M6IEFycmF5PEhvbGRpbmc+O1xuICAgIC8qKlxuICAgICAqIE9iamVjdHMgZGVzY3JpYmluZyB0aGUgc2VjdXJpdGllcyBoZWxkIGluIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHNlY3VyaXRpZXM6IEFycmF5PFNlY3VyaXR5PjtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoYXQgdGhlIEl0ZW1cXCdzIHBvcnRmb2xpbyB3YXMgbWFudWFsbHkgY3JlYXRlZCB3aXRoIHRoZSBJbnZlc3RtZW50cyBGYWxsYmFjayBmbG93LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19pbnZlc3RtZW50c19mYWxsYmFja19pdGVtOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBlYXJsaWVzdCBkYXRlIGZvciB3aGljaCBkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gSW52ZXN0bWVudHMgdHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxJbnZlc3RtZW50VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW52ZXN0bWVudF90cmFuc2FjdGlvbnM6IEFycmF5PEludmVzdG1lbnRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQWxsIHNlY3VyaXRpZXMgZm9yIHdoaWNoIHRoZXJlIGlzIGEgY29ycmVzcG9uZGluZyB0cmFuc2FjdGlvbiBiZWluZyBmZXRjaGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxTZWN1cml0eT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWN1cml0aWVzOiBBcnJheTxTZWN1cml0eT47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgaXMgbGFyZ2VyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGB0cmFuc2FjdGlvbnNgIGFycmF5LCBtb3JlIHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlIGFuZCBjYW4gYmUgZmV0Y2hlZCB2aWEgbWFuaXB1bGF0aW5nIHRoZSBgb2Zmc2V0YCBwYXJhbWV0ZXIuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX2ludmVzdG1lbnRfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGlzIGZpZWxkIGluZGljYXRlcyB0aGF0IHRoZSBJdGVtXFwncyBwb3J0Zm9saW8gd2FzIG1hbnVhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgSW52ZXN0bWVudHMgRmFsbGJhY2sgZmxvdy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2ludmVzdG1lbnRzX2ZhbGxiYWNrX2l0ZW0/OiBib29sZWFuO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnQ6IEFjY291bnRCYXNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtMaWFiaWxpdGllc09iamVjdH1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxpYWJpbGl0aWVzOiBMaWFiaWxpdGllc09iamVjdDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgaWRlbnRpZnlpbmcgbnVtYmVycyB1c2VkIGZvciBtYWtpbmcgZWxlY3Ryb25pYyB0cmFuc2ZlcnMgdG8gYW5kIGZyb20gdGhlIGBhY2NvdW50YC4gVGhlIGlkZW50aWZ5aW5nIG51bWJlciB0eXBlIChBQ0gsIEVGVCwgSUJBTiwgb3IgQkFDUykgdXNlZCB3aWxsIGRlcGVuZCBvbiB0aGUgY291bnRyeSBvZiB0aGUgYWNjb3VudC4gQW4gYWNjb3VudCBtYXkgaGF2ZSBtb3JlIHRoYW4gb25lIG51bWJlciB0eXBlLiBJZiBhIHBhcnRpY3VsYXIgaWRlbnRpZnlpbmcgbnVtYmVyIHR5cGUgaXMgbm90IHVzZWQgYnkgdGhlIGBhY2NvdW50YCBmb3Igd2hpY2ggYXV0aCBkYXRhIGhhcyBiZWVuIHJlcXVlc3RlZCwgYSBudWxsIHZhbHVlIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3Nvck51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3Nvck51bWJlciB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNBQ0hOdWxsYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yTnVtYmVyXG4gICAgICovXG4gICAgYWNoPzogTnVtYmVyc0FDSE51bGxhYmxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TnVtYmVyc0VGVE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBlZnQ/OiBOdW1iZXJzRUZUTnVsbGFibGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSW50ZXJuYXRpb25hbE51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JOdW1iZXJcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogTnVtYmVyc0ludGVybmF0aW9uYWxOdWxsYWJsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge051bWJlcnNCQUNTTnVsbGFibGV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3Nvck51bWJlclxuICAgICAqL1xuICAgIGJhY3M/OiBOdW1iZXJzQkFDU051bGxhYmxlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIHJlY3VycmluZyB0cmFuc2FjdGlvbnMgZGF0YSBpcyB1cGRhdGVkLiBUaGlzIGluY2x1ZGVzIHdoZW4gYSBuZXcgcmVjdXJyaW5nIHN0cmVhbSBpcyBkZXRlY3RlZCBvciB3aGVuIGEgbmV3IHRyYW5zYWN0aW9uIGlzIGFkZGVkIHRvIGFuIGV4aXN0aW5nIHJlY3VycmluZyBzdHJlYW0uIFRoZSBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgIHdlYmhvb2sgd2lsbCBhbHNvIGZpcmUgd2hlbiBvbmUgb3IgbW9yZSBhdHRyaWJ1dGVzIG9mIHRoZSByZWN1cnJpbmcgc3RyZWFtIGNoYW5nZXMsIHdoaWNoIGlzIHVzdWFsbHkgYSByZXN1bHQgb2YgdGhlIGFkZGl0aW9uLCB1cGRhdGUsIG9yIHJlbW92YWwgb2YgdHJhbnNhY3Rpb25zIHRvIHRoZSBzdHJlYW0uICBBZnRlciByZWNlaXB0IG9mIHRoaXMgd2ViaG9vaywgdGhlIHVwZGF0ZWQgZGF0YSBjYW4gYmUgZmV0Y2hlZCBmcm9tIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3RyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgYGZhbHNlYCBvdGhlcndpc2UuICBUaGlzIGZpZWxkIG11c3QgYmUgcmV0dXJuZWQgYXMgYSBib29sZWFuLiBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGluaXRpYXRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgYWN0dWFsIG51bWJlciBvZiBkYXlzIChob2xkIHRpbWUpIHNpbmNlIHRoZSBBQ0ggZGViaXQgdHJhbnNhY3Rpb24gdGhhdCB5b3Ugd2FpdCBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gVGhlIGhvbGRpbmcgdGltZSBjb3VsZCBhZmZlY3QgdGhlIEFDSCByZXR1cm4gcmF0ZS4gIEZvciBleGFtcGxlLCB1c2UgMCBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IG9yIHRoZSBzYW1lIGRheSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLCBvciAxIGlmIHlvdSBtYWtlIGZ1bmRzIGF2YWlsYWJsZSB0aGUgbmV4dCBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCBpbml0aWFsaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkYXlzX2Z1bmRzX29uX2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxEZWNpc2lvbk91dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGRlY2lzaW9uX291dGNvbWU/OiBTaWduYWxEZWNpc2lvbk91dGNvbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQYXltZW50TWV0aG9kfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X21ldGhvZD86IFNpZ25hbFBheW1lbnRNZXRob2QgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgKGluIFVTRCkgbWFkZSBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMgaW5zdGFudGx5IGZvbGxvd2luZyB0aGUgZGViaXQgdHJhbnNhY3Rpb24uIEl0IGNvdWxkIGJlIGEgcGFydGlhbCBhbW91bnQgb2YgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbiAoZXhhbXBsZTogMTAyLjA1KS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnRfaW5zdGFudGx5X2F2YWlsYWJsZT86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgdGhhdCB5b3Ugd291bGQgbGlrZSB0byB1c2UgdG8gcmVmZXIgdG8gdGhpcyB0cmFuc2FjdGlvbi4gRm9yIHlvdXIgY29udmVuaWVuY2UgbWFwcGluZyB5b3VyIGludGVybmFsIGRhdGEsIHlvdSBjb3VsZCB1c2UgeW91ciBpbnRlcm5hbCBJRC9pZGVudGlmaWVyIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBUaGUgbWF4IGxlbmd0aCBmb3IgdGhpcyBmaWVsZCBpcyAzNiBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQsIGluIFVTRCAoZS5nLiBgMTAyLjA1YClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIGVuZCB1c2VyIGlzIHByZXNlbnQgd2hpbGUgaW5pdGlhdGluZyB0aGUgQUNIIHRyYW5zZmVyIGFuZCB0aGUgZW5kcG9pbnQgaXMgYmVpbmcgY2FsbGVkOyBgZmFsc2VgIG90aGVyd2lzZSAoZm9yIGV4YW1wbGUsIHdoZW4gdGhlIEFDSCB0cmFuc2ZlciBpcyBzY2hlZHVsZWQgYW5kIHRoZSBlbmQgdXNlciBpcyBub3QgcHJlc2VudCwgb3IgeW91IGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB0aGUgQUNIIHRyYW5zZmVyIGJ1dCBiZWZvcmUgc3VibWl0dGluZyB0aGUgTmFjaGEgZmlsZSBmb3IgQUNIIHByb2Nlc3NpbmcpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGlzIHVzZWQgdG8gY29ycmVsYXRlIHJlcXVlc3RzIGJ5IGEgdXNlciB3aXRoIG11bHRpcGxlIEl0ZW1zLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqICoqdHJ1ZSoqIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gaXMgYSByZWN1cnJpbmcgdHJhbnNhY3Rpb247ICoqZmFsc2UqKiBvdGhlcndpc2UgXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IEFDSCBvciBub24tQUNIIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbi4gYFNBTUVfREFZX0FDSGA6IFNhbWUgRGF5IEFDSCBieSBOQUNIQS4gVGhlIGRlYml0IHRyYW5zYWN0aW9uIGlzIHByb2Nlc3NlZCBhbmQgc2V0dGxlZCBvbiB0aGUgc2FtZSBkYXkgYE5FWFRfREFZX0FDSGA6IE5leHQgRGF5IEFDSCBzZXR0bGVtZW50IGZvciBkZWJpdCB0cmFuc2FjdGlvbnMsIG9mZmVyZWQgYnkgc29tZSBwYXltZW50IHByb2Nlc3NvcnMgYFNUQU5EQVJEX0FDSGA6IHN0YW5kYXJkIEFDSCBieSBOQUNIQSBgUkVBTF9USU1FX1BBWU1FTlRTYDogcmVhbC10aW1lIHBheW1lbnRzIHN1Y2ggYXMgUlRQIGFuZCBGZWROb3cgYERFQklUX0NBUkRgOiBpZiB0aGUgZGVmYXVsdCBwYXltZW50IGlzIG92ZXIgZGViaXQgY2FyZCBuZXR3b3JrcyBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgUG9zc2libGUgdmFsdWVzOiAgYFNBTUVfREFZX0FDSGAsIGBORVhUX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYFJFQUxfVElNRV9QQVlNRU5UU2AsIGBERUJJVF9DQVJEYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIFJ1bGVzZXQgdG8gdXNlIGZvciB0aGlzIHRyYW5zYWN0aW9uLiBZb3UgY2FuIGNvbmZpZ3VyZSBhIFJ1bGVzZXQgdXNpbmcgdGhlIFNpZ25hbCBkYXNoYm9hcmQgbG9jYXRlZCB3aXRoaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gSWYgbm90IHByb3ZpZGVkLCBubyBSdWxlc2V0IHdpbGwgYmUgdXNlZC4gVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YTsgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZXNldF9rZXk/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjb3Jlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNjb3JlczogU2lnbmFsU2NvcmVzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvcmVfYXR0cmlidXRlcz86IFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1J1bGVzZXR9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlc2V0PzogUnVsZXNldCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgYmFuayBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZSB0byBiZSB1c2VkIGluIHRoZSBTaWduYWwgbW9kZWwsIHRoaXMgYXJyYXkgY29udGFpbnMgd2FybmluZ3MgZGVzY3JpYmluZyB3aHkgYmFuayBkYXRhIGlzIG1pc3NpbmcuIElmIHlvdSB3YW50IHRvIHJlY2VpdmUgYW4gQVBJIGVycm9yIGluc3RlYWQgb2YgU2lnbmFsIHNjb3JlcyBpbiB0aGUgY2FzZSBvZiBtaXNzaW5nIGJhbmsgZGF0YSwgZmlsZSBhIHN1cHBvcnQgdGlja2V0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFdhcm5pbmc+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgd2FybmluZ3M/OiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBgY2xpZW50X3RyYW5zYWN0aW9uX2lkYCBzdXBwbGllZCB3aGVuIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBNdXN0IGJlIGEgdmFsaWQgQUNIIHJldHVybiBjb2RlIChlLmcuIFxcXCJSMDFcXFwiKSAgSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5fY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiB5b3UgcmVjZWl2ZSB0aGUgcmV0dXJucyBmcm9tIHlvdXIgcGF5bWVudCBwcm9jZXNzb3JzLCBpbiBJU08gODYwMSBmb3JtYXQgKGBZWVlZLU1NLUREVEhIOm1tOnNzWmApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXR1cm5lZF9hdD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIGluIExpbmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB0b2tlbiB0aGF0IGNhbiBiZSBzZW50IHRvIFN0cmlwZSBmb3IgdXNlIGluIG1ha2luZyBBUEkgY2FsbHMgdG8gUGxhaWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdHJpcGVfYmFua19hY2NvdW50X3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyB3ZWJob29rIGlzIG9ubHkgc2VudCB0byBbUGxhaWQgcHJvY2Vzc29yIHBhcnRuZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzLykuICBGaXJlZCB3aGVuIGFuIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyBjaGFuZ2UuIFRoaXMgY2FuIGJlIGR1ZSB0byBhbnkgZXZlbnQgcmVzdWx0aW5nIGluIG5ldyBjaGFuZ2VzLCBzdWNoIGFzIGFuIGluaXRpYWwgMzAtZGF5IHRyYW5zYWN0aW9ucyBmZXRjaCB1cG9uIHRoZSBpbml0aWFsaXphdGlvbiBvZiBhbiBJdGVtIHdpdGggdHJhbnNhY3Rpb25zLCB0aGUgYmFja2ZpbGwgb2YgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgdGhhdCBvY2N1cnMgc2hvcnRseSBhZnRlciwgb3Igd2hlbiBjaGFuZ2VzIGFyZSBwb3B1bGF0ZWQgZnJvbSBhIHJlZ3VsYXJseS1zY2hlZHVsZWQgdHJhbnNhY3Rpb25zIHVwZGF0ZSBqb2IuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIHdoZW4gdXNpbmcgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludC4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHRoZSBvbGRlciB3ZWJob29rcyBgSU5JVElBTF9VUERBVEVgLCBgSElTVE9SSUNBTF9VUERBVEVgLCBgREVGQVVMVF9VUERBVEVgLCBhbmQgYFRSQU5TQUNUSU9OU19SRU1PVkVEYCwgd2hpY2ggYXJlIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgd2lsbCBhbHNvIGNvbnRpbnVlIHRvIGJlIHNlbnQgaW4gb3JkZXIgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aG9zZSB3ZWJob29rcyB3aGVuIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgbmV3IGNoYW5nZXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtIGZyb20gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiAgTm90ZSB0aGF0IHRvIHJlY2VpdmUgdGhpcyB3ZWJob29rIGZvciBhbiBJdGVtLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGF0IGxlYXN0IG9uY2Ugb24gdGhhdCBJdGVtLiBUaGlzIG1lYW5zIHRoYXQsIHVubGlrZSB0aGUgYElOSVRJQUxfVVBEQVRFYCBhbmQgYEhJU1RPUklDQUxfVVBEQVRFYCB3ZWJob29rcywgaXQgd2lsbCBub3QgZmlyZSBpbW1lZGlhdGVseSB1cG9uIEl0ZW0gY3JlYXRpb24uIElmIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGlzIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgd2FzICpub3QqIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zLCB0aGUgd2ViaG9vayB3aWxsIGZpcmUgdHdpY2U6IG9uY2UgdGhlIGZpcnN0IDMwIGRheXMgb2YgdHJhbnNhY3Rpb25zIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZCwgYW5kIGEgc2Vjb25kIHRpbWUgd2hlbiBhbGwgYXZhaWxhYmxlIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGRhdGEgaGFzIGJlZW4gZmV0Y2hlZC4gIFRoaXMgd2ViaG9vayB3aWxsIHR5cGljYWxseSBub3QgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgZHVlIHRvIHRoZSBsYWNrIG9mIGR5bmFtaWMgdHJhbnNhY3Rpb25zIGRhdGEuIFRvIHRlc3QgdGhpcyB3ZWJob29rIGluIFNhbmRib3gsIGNhbGwgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluaXRpYWwgcHVsbCBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGluaXRpYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBoaXN0b3JpY2FsIHB1bGwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIHZhbHVlIG9idGFpbmVkIGZyb20gdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIGluIExpbmtcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB5b3UgYXJlIGludGVncmF0aW5nIHdpdGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yOiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RQcm9jZXNzb3JFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFByb2Nlc3NvckVudW0ge1xuICAgIER3b2xsYSA9ICdkd29sbGEnLFxuICAgIEdhbGlsZW8gPSAnZ2FsaWxlbycsXG4gICAgTW9kZXJuVHJlYXN1cnkgPSAnbW9kZXJuX3RyZWFzdXJ5JyxcbiAgICBPY3JvbHVzID0gJ29jcm9sdXMnLFxuICAgIFZlc3RhID0gJ3Zlc3RhJyxcbiAgICBEcml2ZXdlYWx0aCA9ICdkcml2ZXdlYWx0aCcsXG4gICAgVm9wYXkgPSAndm9wYXknLFxuICAgIEFjaHEgPSAnYWNocScsXG4gICAgQ2hlY2sgPSAnY2hlY2snLFxuICAgIENoZWNrYm9vayA9ICdjaGVja2Jvb2snLFxuICAgIENpcmNsZSA9ICdjaXJjbGUnLFxuICAgIFNpbGFNb25leSA9ICdzaWxhX21vbmV5JyxcbiAgICBSaXplID0gJ3JpemUnLFxuICAgIFN2YkFwaSA9ICdzdmJfYXBpJyxcbiAgICBVbml0ID0gJ3VuaXQnLFxuICAgIFd5cmUgPSAnd3lyZScsXG4gICAgTGl0aGljID0gJ2xpdGhpYycsXG4gICAgQWxwYWNhID0gJ2FscGFjYScsXG4gICAgQXN0cmEgPSAnYXN0cmEnLFxuICAgIE1vb3YgPSAnbW9vdicsXG4gICAgVHJlYXN1cnlQcmltZSA9ICd0cmVhc3VyeV9wcmltZScsXG4gICAgTWFycWV0YSA9ICdtYXJxZXRhJyxcbiAgICBDaGVja291dCA9ICdjaGVja291dCcsXG4gICAgU29saWQgPSAnc29saWQnLFxuICAgIEhpZ2hub3RlID0gJ2hpZ2hub3RlJyxcbiAgICBHZW1pbmkgPSAnZ2VtaW5pJyxcbiAgICBBcGV4Q2xlYXJpbmcgPSAnYXBleF9jbGVhcmluZycsXG4gICAgR3VzdG8gPSAnZ3VzdG8nLFxuICAgIEFkeWVuID0gJ2FkeWVuJyxcbiAgICBBdG9taWMgPSAnYXRvbWljJyxcbiAgICBJMmMgPSAnaTJjJyxcbiAgICBXZXBheSA9ICd3ZXBheScsXG4gICAgUmlza2lmaWVkID0gJ3Jpc2tpZmllZCcsXG4gICAgVXRiID0gJ3V0YicsXG4gICAgQWRwUm9sbCA9ICdhZHBfcm9sbCcsXG4gICAgRm9ydHJlc3NUcnVzdCA9ICdmb3J0cmVzc190cnVzdCcsXG4gICAgQm9uZCA9ICdib25kJyxcbiAgICBCYWtrdCA9ICdiYWtrdCcsXG4gICAgVGVhbCA9ICd0ZWFsJyxcbiAgICBaZXJvSGFzaCA9ICd6ZXJvX2hhc2gnLFxuICAgIFRhYmFQYXkgPSAndGFiYV9wYXknLFxuICAgIEtub3QgPSAna25vdCcsXG4gICAgU2FyZGluZSA9ICdzYXJkaW5lJyxcbiAgICBBbGxveSA9ICdhbGxveScsXG4gICAgRmluaXggPSAnZmluaXgnLFxuICAgIE51dmVpID0gJ251dmVpJyxcbiAgICBMYXllciA9ICdsYXllcicsXG4gICAgQm9vbSA9ICdib29tJyxcbiAgICBQYXlub3RlID0gJ3BheW5vdGUnLFxuICAgIFN0YWtlID0gJ3N0YWtlJyxcbiAgICBXZWRidXNoID0gJ3dlZGJ1c2gnLFxuICAgIEVzdXN1ID0gJ2VzdXN1JyxcbiAgICBBbnNhID0gJ2Fuc2EnLFxuICAgIFNjcmliZXVwID0gJ3NjcmliZXVwJyxcbiAgICBTdHJhZGRsZSA9ICdzdHJhZGRsZScsXG4gICAgTG9hbnBybyA9ICdsb2FucHJvJ1xufVxuXG4vKipcbiAqIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgIGFuZCBgL3Byb2Nlc3Nvci9hcGV4L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYHByb2Nlc3Nvcl90b2tlbmAgdGhhdCBjYW4gdGhlbiBiZSB1c2VkIGJ5IHRoZSBQbGFpZCBwYXJ0bmVyIHRvIG1ha2UgQVBJIHJlcXVlc3RzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoZSBwcm9jZXNzb3IgdG9rZW4gc2hvdWxkIGhhdmUgYWNjZXNzIHRvLiBBbiBlbXB0eSBsaXN0IG1lYW5zIHRoYXQgdGhlIHByb2Nlc3NvciBoYXMgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMsIGluY2x1ZGluZyBmdXR1cmUgcHJvZHVjdHMuXG4gICAgICogQHR5cGUge0FycmF5PFByb2R1Y3RzPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcHJvZHVjdHM6IEFycmF5PFByb2R1Y3RzPjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0XG4gICAgICovXG4gICAgcHJvY2Vzc29yX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHByb2R1Y3RzIHRoZSBwcm9jZXNzb3IgdG9rZW4gc2hvdWxkIGhhdmUgYWNjZXNzIHRvLiBBbiBlbXB0eSBsaXN0IHdpbGwgZ3JhbnQgYWNjZXNzIHRvIGFsbCBwcm9kdWN0cy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UHJvZHVjdHM+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG59XG4vKipcbiAqIFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL3NldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gYSBwcm9jZXNzb3IgdXBkYXRlcyB0aGUgd2ViaG9vayBVUkwgZm9yIGEgcHJvY2Vzc29yIHRva2VuIHZpYSBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZSB7XG4gICAgLyoqXG4gICAgICogYFBST0NFU1NPUl9UT0tFTmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVxuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5ldyB3ZWJob29rIFVSTC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBuZXdfd2ViaG9va191cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkwgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHByb2Nlc3NvciB0b2tlbi4gVG8gcmVtb3ZlIGEgd2ViaG9vayBmcm9tIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgdG8gYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGVhcmxpZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGF0ZXN0IGRhdGUgZm9yIHdoaWNoIGRhdGEgc2hvdWxkIGJlIHJldHVybmVkLiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QWNjb3VudEJhc2V9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC4gVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIsIHdpdGggdGhlIG1vc3QgcmVjZW50IGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5LiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHJldHVybmVkIGlzIGRldGVybWluZWQgYnkgdGhlIGBjb3VudGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZGF0ZSByYW5nZSBzcGVjaWZpZWQuIElmIGB0b3RhbF90cmFuc2FjdGlvbnNgIGlzIGxhcmdlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBgdHJhbnNhY3Rpb25zYCBhcnJheSwgbW9yZSB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSBhbmQgY2FuIGJlIGZldGNoZWQgdmlhIG1hbmlwdWxhdGluZyB0aGUgYG9mZnNldGAgcGFyYW1ldGVyLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdG90YWxfdHJhbnNhY3Rpb25zOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByb2Nlc3NvciB0b2tlbiBvYnRhaW5lZCBmcm9tIHRoZSBQbGFpZCBpbnRlZ3JhdGlvbiBwYXJ0bmVyLiBQcm9jZXNzb3IgdG9rZW5zIGFyZSBpbiB0aGUgZm9ybWF0OiBgcHJvY2Vzc29yLTxlbnZpcm9ubWVudD4tPGlkZW50aWZpZXI+YFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZGVwb3NpdG9yeSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBleHBlbnNlIHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb24gc3RyZWFtcyBmb3IgdGhlIGdpdmVuIGFjY291bnQgd2VyZSB1cGRhdGVkIG9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGV0aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcm9jZXNzb3IgdG9rZW4gb2J0YWluZWQgZnJvbSB0aGUgUGxhaWQgaW50ZWdyYXRpb24gcGFydG5lci4gUHJvY2Vzc29yIHRva2VucyBhcmUgaW4gdGhlIGZvcm1hdDogYHByb2Nlc3Nvci08ZW52aXJvbm1lbnQ+LTxpZGVudGlmaWVyPmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHByb2Nlc3Nvcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGlzIHdlYmhvb2sgaXMgb25seSBzZW50IHRvIFtQbGFpZCBwcm9jZXNzb3IgcGFydG5lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvKS4gIEZpcmVkIHdoZW4gdHJhbnNhY3Rpb24ocykgZm9yIGFuIEl0ZW0gYXJlIGRlbGV0ZWQuIFRoZSBkZWxldGVkIHRyYW5zYWN0aW9uIElEcyBhcmUgaW5jbHVkZWQgaW4gdGhlIHdlYmhvb2sgcGF5bG9hZC4gUGxhaWQgd2lsbCB0eXBpY2FsbHkgY2hlY2sgZm9yIGRlbGV0ZWQgdHJhbnNhY3Rpb24gZGF0YSBzZXZlcmFsIHRpbWVzIGEgZGF5LiAgVGhpcyB3ZWJob29rIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50LCB0aGlzIHdlYmhvb2sgd2lsbCBzdGlsbCBiZSBmaXJlZCB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhlIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYCB3ZWJob29rIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TX1JFTU9WRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGB0cmFuc2FjdGlvbl9pZHNgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJlbW92ZWQgdHJhbnNhY3Rpb25zXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgcmVtb3ZlZF90cmFuc2FjdGlvbnM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlbW92ZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvY2Vzc29yIHRva2VuIG9idGFpbmVkIGZyb20gdGhlIFBsYWlkIGludGVncmF0aW9uIHBhcnRuZXIuIFByb2Nlc3NvciB0b2tlbnMgYXJlIGluIHRoZSBmb3JtYXQ6IGBwcm9jZXNzb3ItPGVudmlyb25tZW50Pi08aWRlbnRpZmllcj5gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3Vyc29yIHZhbHVlIHJlcHJlc2VudHMgdGhlIGxhc3QgdXBkYXRlIHJlcXVlc3RlZC4gUHJvdmlkaW5nIGl0IHdpbGwgY2F1c2UgdGhlIHJlc3BvbnNlIHRvIG9ubHkgcmV0dXJuIGNoYW5nZXMgYWZ0ZXIgdGhpcyB1cGRhdGUuIElmIG9taXR0ZWQsIHRoZSBlbnRpcmUgaGlzdG9yeSBvZiB1cGRhdGVzIHdpbGwgYmUgcmV0dXJuZWQsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0LWFkZGVkIHRyYW5zYWN0aW9ucyBvbiB0aGUgaXRlbS4gTm90ZTogVGhlIHVwcGVyLWJvdW5kIGxlbmd0aCBvZiB0aGlzIGN1cnNvciBpcyAyNTYgY2hhcmFjdGVycyBvZiBiYXNlNjQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIHRvIGZldGNoLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zVXBkYXRlU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfdXBkYXRlX3N0YXR1czogVHJhbnNhY3Rpb25zVXBkYXRlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBY2NvdW50QmFzZX1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgYWNjb3VudDogQWNjb3VudEJhc2U7XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRlZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBvbiB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogQXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgZmV0Y2hpbmcgYW55IGZ1dHVyZSB1cGRhdGVzIGFmdGVyIHRoZSBsYXRlc3QgdXBkYXRlIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2UuIFRoZSBjdXJzb3Igb2J0YWluZWQgYWZ0ZXIgYWxsIHBhZ2VzIGhhdmUgYmVlbiBwdWxsZWQgKGluZGljYXRlZCBieSBgaGFzX21vcmVgIGJlaW5nIGBmYWxzZWApIHdpbGwgYmUgdmFsaWQgZm9yIGF0IGxlYXN0IDEgeWVhci4gVGhpcyBjdXJzb3Igc2hvdWxkIGJlIHBlcnNpc3RlZCBmb3IgbGF0ZXIgY2FsbHMuIElmIHRyYW5zYWN0aW9ucyBhcmUgbm90IHlldCBhdmFpbGFibGUsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGlmIG1vcmUgdGhhbiByZXF1ZXN0ZWQgY291bnQgb2YgdHJhbnNhY3Rpb24gdXBkYXRlcyBleGlzdC4gSWYgdHJ1ZSwgdGhlIGFkZGl0aW9uYWwgdXBkYXRlcyBjYW4gYmUgZmV0Y2hlZCBieSBtYWtpbmcgYW4gYWRkaXRpb25hbCByZXF1ZXN0IHdpdGggYGN1cnNvcmAgc2V0IHRvIGBuZXh0X2N1cnNvcmAuIElmIGBoYXNfbW9yZWAgaXMgdHJ1ZSwgaXTigJlzIGltcG9ydGFudCB0byBwdWxsIGFsbCBhdmFpbGFibGUgcGFnZXMsIHRvIG1ha2UgaXQgbGVzcyBsaWtlbHkgZm9yIHVuZGVybHlpbmcgZGF0YSBjaGFuZ2VzIHRvIGNvbmZsaWN0IHdpdGggcGFnaW5hdGlvbi5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgaGFzX21vcmU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHByb2R1Y3QgYWNjZXNzIGJlaW5nIHJlcXVlc3RlZC4gVXNlZCB0byBvciBkaXNhbGxvdyBwcm9kdWN0IGFjY2VzcyBhY3Jvc3MgYWxsIGFjY291bnRzLiBJZiB1bnNldCwgZGVmYXVsdHMgdG8gYWxsIHByb2R1Y3RzIGFsbG93ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2R1Y3RBY2Nlc3NcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0QWNjZXNzIHtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gc3RhdGVtZW50cy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgc3RhdGVtZW50cz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byB0aGUgSWRlbnRpdHkgcHJvZHVjdCAobmFtZSwgZW1haWwsIHBob25lLCBhZGRyZXNzKS4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgaWRlbnRpdHk/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gYWNjb3VudCBudW1iZXIgZGV0YWlscy4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYXV0aD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFsbG93IGFjY2VzcyB0byB0cmFuc2FjdGlvbiBkZXRhaWxzLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX2RldGFpbHNfdHJhbnNhY3Rpb25zXFxcIi4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfZGV0YWlsc190cmFuc2FjdGlvbnM/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX3JvdXRpbmdfbnVtYmVyXFxcIi4gT25seSB1c2VkIGJ5IGNlcnRhaW4gcGFydG5lcnMuIElmIHJlbGV2YW50IHRvIHRoZSBwYXJ0bmVyIGFuZCB1bnNldCwgZGVmYXVsdHMgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0QWNjZXNzXG4gICAgICovXG4gICAgYWNjb3VudHNfcm91dGluZ19udW1iZXI/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbGxvdyBhY2Nlc3MgdG8gXFxcImFjY291bnRzX3N0YXRlbWVudHNcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBhY2NvdW50c19zdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIFxcXCJhY2NvdW50c190YXhfc3RhdGVtZW50c1xcXCIuIE9ubHkgdXNlZCBieSBjZXJ0YWluIHBhcnRuZXJzLiBJZiByZWxldmFudCB0byB0aGUgcGFydG5lciBhbmQgdW5zZXQsIGRlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdEFjY2Vzc1xuICAgICAqL1xuICAgIGFjY291bnRzX3RheF9zdGF0ZW1lbnRzPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIFxcXCJjdXN0b21lcnNfcHJvZmlsZXNcXFwiLiBPbmx5IHVzZWQgYnkgY2VydGFpbiBwYXJ0bmVycy4gSWYgcmVsZXZhbnQgdG8gdGhlIHBhcnRuZXIgYW5kIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RBY2Nlc3NcbiAgICAgKi9cbiAgICBjdXN0b21lcnNfcHJvZmlsZXM/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBgQUNDRVNTX05PVF9HUkFOVEVEYCBlcnJvciBpcyBoaXQgZm9yIEF1dGguIFRoZSBlcnJvciBjYW4gYmUgcmVzb2x2ZWQgYnkgcHV0dGluZyB0aGUgdXNlciB0aHJvdWdoIHVwZGF0ZSBtb2RlIHdpdGggYGF1dGhgIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LCBhcyB3ZWxsIGFzIHRocm91Z2ggdGhlIGxpbWl0ZWQgYmV0YSBmb3IgdXBkYXRlIG1vZGUgQXV0aGVudGljYXRpb24gcHJvZHVjdCB2YWxpZGF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBBVVRIYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUFJPRFVDVF9QRVJNSVNTSU9OU19SRVFVSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZEF1dGhXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkQXV0aFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRBdXRoV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gYW4gYEFDQ0VTU19OT1RfR1JBTlRFRGAgZXJyb3IgaXMgaGl0IGZvciBJZGVudGl0eS4gVGhlIGVycm9yIGNhbiBiZSByZXNvbHZlZCBieSBwdXR0aW5nIHRoZSB1c2VyIHRocm91Z2ggdXBkYXRlIG1vZGUgd2l0aCBgaWRlbnRpdHlgIGluIHRoZSBgcHJvZHVjdHNgIGFycmF5LCBhcyB3ZWxsIGFzIHRocm91Z2ggdGhlIGxpbWl0ZWQgYmV0YSBmb3IgdXBkYXRlIG1vZGUgSWRlbnRpdHkgcHJvZHVjdCB2YWxpZGF0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWN0UGVybWlzc2lvbnNSZXF1aXJlZElkZW50aXR5V2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElERU5USVRZYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RQZXJtaXNzaW9uc1JlcXVpcmVkSWRlbnRpdHlXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFBST0RVQ1RfUEVSTUlTU0lPTlNfUkVRVUlSRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFBlcm1pc3Npb25zUmVxdWlyZWRJZGVudGl0eVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBzdGF0dXMgaGVhbHRoIG9mIGEgcmVxdWVzdCB0eXBlLiBBdXRoIHJlcXVlc3RzLCBCYWxhbmNlIHJlcXVlc3RzLCBJZGVudGl0eSByZXF1ZXN0cywgSW52ZXN0bWVudHMgcmVxdWVzdHMsIExpYWJpbGl0aWVzIHJlcXVlc3RzLCBUcmFuc2FjdGlvbnMgdXBkYXRlcywgSW52ZXN0bWVudHMgdXBkYXRlcywgTGlhYmlsaXRpZXMgdXBkYXRlcywgYW5kIEl0ZW0gbG9naW5zIGVhY2ggaGF2ZSB0aGVpciBvd24gc3RhdHVzIG9iamVjdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RTdGF0dXMge1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgYGJyZWFrZG93bmAgb2JqZWN0LCB3aGljaCBwcm92aWRlcyBtb3JlIGdyYW51bGFyIGluc3RpdHV0aW9uIGhlYWx0aCBkYXRhLiAgYEhFQUxUSFlgOiB0aGUgbWFqb3JpdHkgb2YgcmVxdWVzdHMgYXJlIHN1Y2Nlc3NmdWwgYERFR1JBREVEYDogb25seSBzb21lIHJlcXVlc3RzIGFyZSBzdWNjZXNzZnVsIGBET1dOYDogYWxsIHJlcXVlc3RzIGFyZSBmYWlsaW5nXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgc3RhdHVzOiBQcm9kdWN0U3RhdHVzU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXR0ZWQgdGltZXN0YW1wIG9mIHRoZSBsYXN0IHN0YXR1cyBjaGFuZ2UgZm9yIHRoZSBpbnN0aXR1dGlvbi4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c1xuICAgICAqL1xuICAgIGxhc3Rfc3RhdHVzX2NoYW5nZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9kdWN0U3RhdHVzQnJlYWtkb3dufVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzXG4gICAgICovXG4gICAgYnJlYWtkb3duOiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RTdGF0dXNTdGF0dXNFbnVtIHtcbiAgICBIZWFsdGh5ID0gJ0hFQUxUSFknLFxuICAgIERlZ3JhZGVkID0gJ0RFR1JBREVEJyxcbiAgICBEb3duID0gJ0RPV04nXG59XG5cbi8qKlxuICogQSBkZXRhaWxlZCBicmVha2Rvd24gb2YgdGhlIGluc3RpdHV0aW9uXFwncyBwZXJmb3JtYW5jZSBmb3IgYSByZXF1ZXN0IHR5cGUuIFRoZSB2YWx1ZXMgZm9yIGBzdWNjZXNzYCwgYGVycm9yX3BsYWlkYCwgYW5kIGBlcnJvcl9pbnN0aXR1dGlvbmAgc3VtIHRvIDEuIFRoZSB0aW1lIHJhbmdlIHVzZWQgZm9yIGNhbGN1bGF0aW5nIHRoZSBicmVha2Rvd24gbWF5IHJhbmdlIGZyb20gdGhlIG1vc3QgcmVjZW50IGZldyBtaW51dGVzIHRvIHRoZSBwYXN0IHNpeCBob3Vycy4gSW4gZ2VuZXJhbCwgc21hbGxlciBpbnN0aXR1dGlvbnMgd2lsbCBzaG93IHN0YXR1cyB0aGF0IHdhcyBjYWxjdWxhdGVkIG92ZXIgYSBsb25nZXIgcGVyaW9kIG9mIHRpbWUuIEZvciBJbnZlc3RtZW50IHVwZGF0ZXMsIHdoaWNoIGFyZSByZWZyZXNoZWQgbGVzcyBmcmVxdWVudGx5LCB0aGUgcGVyaW9kIGFzc2Vzc2VkIG1heSBiZSAyNCBob3VycyBvciBtb3JlLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW0luc3RpdHV0aW9uIHN0YXR1cyBkZXRhaWxzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI2luc3RpdHV0aW9uLXN0YXR1cy1kZXRhaWxzKS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2R1Y3RTdGF0dXNCcmVha2Rvd24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2luIGF0dGVtcHRzIHRoYXQgYXJlIHN1Y2Nlc3NmdWwsIGV4cHJlc3NlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUHJvZHVjdFN0YXR1c0JyZWFrZG93blxuICAgICAqL1xuICAgIHN1Y2Nlc3M6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgcGVyY2VudGFnZSBvZiBsb2dpbnMgdGhhdCBhcmUgZmFpbGluZyBkdWUgdG8gYW4gaW50ZXJuYWwgUGxhaWQgaXNzdWUsIGV4cHJlc3NlZCBhcyBhIGRlY2ltYWwuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICBlcnJvcl9wbGFpZDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIGxvZ2lucyB0aGF0IGFyZSBmYWlsaW5nIGR1ZSB0byBhbiBpc3N1ZSBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIHN5c3RlbSwgZXhwcmVzc2VkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9kdWN0U3RhdHVzQnJlYWtkb3duXG4gICAgICovXG4gICAgZXJyb3JfaW5zdGl0dXRpb246IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBIb3cgZnJlcXVlbnRseSBkYXRhIGZvciBzdWJzY3JpcHRpb24gcHJvZHVjdHMgbGlrZSBJbnZlc3RtZW50cywgVHJhbnNhY3Rpb25zLCBhbmQgTGlhYmlsaXRpZXMsIGlzIGJlaW5nIHJlZnJlc2hlZCwgcmVsYXRpdmUgdG8gdGhlIGluc3RpdHV0aW9uXFwncyBub3JtYWwgc2NoZWR1bGluZy4gVGhlIGByZWZyZXNoX2ludGVydmFsYCBtYXkgYmUgYERFTEFZRURgIG9yIGBTVE9QUEVEYCBldmVuIHdoZW4gdGhlIHN1Y2Nlc3MgcmF0ZSBpcyBoaWdoLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2R1Y3RTdGF0dXNCcmVha2Rvd25cbiAgICAgKi9cbiAgICByZWZyZXNoX2ludGVydmFsPzogUHJvZHVjdFN0YXR1c0JyZWFrZG93blJlZnJlc2hJbnRlcnZhbEVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gUHJvZHVjdFN0YXR1c0JyZWFrZG93blJlZnJlc2hJbnRlcnZhbEVudW0ge1xuICAgIE5vcm1hbCA9ICdOT1JNQUwnLFxuICAgIERlbGF5ZWQgPSAnREVMQVlFRCcsXG4gICAgU3RvcHBlZCA9ICdTVE9QUEVEJ1xufVxuXG4vKipcbiAqIEEgbGlzdCBvZiBwcm9kdWN0cyB0aGF0IGFuIGluc3RpdHV0aW9uIGNhbiBzdXBwb3J0LiBBbGwgSXRlbXMgbXVzdCBiZSBpbml0aWFsaXplZCB3aXRoIGF0IGxlYXN0IG9uZSBwcm9kdWN0LiBUaGUgQmFsYW5jZSBwcm9kdWN0IGlzIGFsd2F5cyBhdmFpbGFibGUgYW5kIGRvZXMgbm90IG5lZWQgdG8gYmUgc3BlY2lmaWVkIGR1cmluZyBpbml0aWFsaXphdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByb2R1Y3RzIHtcbiAgICBBc3NldHMgPSAnYXNzZXRzJyxcbiAgICBBdXRoID0gJ2F1dGgnLFxuICAgIEJhbGFuY2UgPSAnYmFsYW5jZScsXG4gICAgQmFsYW5jZVBsdXMgPSAnYmFsYW5jZV9wbHVzJyxcbiAgICBCZWFjb24gPSAnYmVhY29uJyxcbiAgICBJZGVudGl0eSA9ICdpZGVudGl0eScsXG4gICAgSWRlbnRpdHlNYXRjaCA9ICdpZGVudGl0eV9tYXRjaCcsXG4gICAgSW52ZXN0bWVudHMgPSAnaW52ZXN0bWVudHMnLFxuICAgIEludmVzdG1lbnRzQXV0aCA9ICdpbnZlc3RtZW50c19hdXRoJyxcbiAgICBMaWFiaWxpdGllcyA9ICdsaWFiaWxpdGllcycsXG4gICAgUGF5bWVudEluaXRpYXRpb24gPSAncGF5bWVudF9pbml0aWF0aW9uJyxcbiAgICBJZGVudGl0eVZlcmlmaWNhdGlvbiA9ICdpZGVudGl0eV92ZXJpZmljYXRpb24nLFxuICAgIFRyYW5zYWN0aW9ucyA9ICd0cmFuc2FjdGlvbnMnLFxuICAgIENyZWRpdERldGFpbHMgPSAnY3JlZGl0X2RldGFpbHMnLFxuICAgIEluY29tZSA9ICdpbmNvbWUnLFxuICAgIEluY29tZVZlcmlmaWNhdGlvbiA9ICdpbmNvbWVfdmVyaWZpY2F0aW9uJyxcbiAgICBTdGFuZGluZ09yZGVycyA9ICdzdGFuZGluZ19vcmRlcnMnLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBFbXBsb3ltZW50ID0gJ2VtcGxveW1lbnQnLFxuICAgIFJlY3VycmluZ1RyYW5zYWN0aW9ucyA9ICdyZWN1cnJpbmdfdHJhbnNhY3Rpb25zJyxcbiAgICBUcmFuc2FjdGlvbnNSZWZyZXNoID0gJ3RyYW5zYWN0aW9uc19yZWZyZXNoJyxcbiAgICBTaWduYWwgPSAnc2lnbmFsJyxcbiAgICBTdGF0ZW1lbnRzID0gJ3N0YXRlbWVudHMnLFxuICAgIFByb2Nlc3NvclBheW1lbnRzID0gJ3Byb2Nlc3Nvcl9wYXltZW50cycsXG4gICAgUHJvY2Vzc29ySWRlbnRpdHkgPSAncHJvY2Vzc29yX2lkZW50aXR5JyxcbiAgICBQcm9maWxlID0gJ3Byb2ZpbGUnLFxuICAgIENyYUJhc2VSZXBvcnQgPSAnY3JhX2Jhc2VfcmVwb3J0JyxcbiAgICBDcmFJbmNvbWVJbnNpZ2h0cyA9ICdjcmFfaW5jb21lX2luc2lnaHRzJyxcbiAgICBDcmFQYXJ0bmVySW5zaWdodHMgPSAnY3JhX3BhcnRuZXJfaW5zaWdodHMnLFxuICAgIENyYU5ldHdvcmtJbnNpZ2h0cyA9ICdjcmFfbmV0d29ya19pbnNpZ2h0cycsXG4gICAgQ3JhQ2FzaGZsb3dJbnNpZ2h0cyA9ICdjcmFfY2FzaGZsb3dfaW5zaWdodHMnLFxuICAgIExheWVyID0gJ2xheWVyJyxcbiAgICBQYXlCeUJhbmsgPSAncGF5X2J5X2JhbmsnXG59XG5cbi8qKlxuICogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge05ldHdvcmtTdGF0dXNHZXRVc2VyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBOZXR3b3JrU3RhdHVzR2V0VXNlcjtcbn1cbi8qKlxuICogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvcHJvZmlsZS9uZXR3b3JrX3N0YXR1cy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlTmV0d29ya1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG5ldHdvcmtfc3RhdHVzOiBOZXR3b3JrU3RhdHVzR2V0UmVzcG9uc2VOZXR3b3JrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdmFsaWQgbmFtZSBtYXRjaGluZyBzZW5zaXRpdml0eSBjb25maWd1cmF0aW9ucyBmb3IgYSBzY3JlZW5pbmcgcHJvZ3JhbS4gTm90ZSB0aGF0IHdoaWxlIGNlcnRhaW4gbWF0Y2hpbmcgdGVjaG5pcXVlcyBtYXkgYmUgbW9yZSBwcmV2YWxlbnQgb24gbGVzcyBzdHJpY3Qgc2V0dGluZ3MsIGFsbCBtYXRjaGluZyBhbGdvcml0aG1zIGFyZSBlbmFibGVkIGZvciBldmVyeSBzZW5zaXRpdml0eS4gIGBjb2Fyc2VgIC0gU2VlIG1vcmUgcG90ZW50aWFsIG1hdGNoZXMuIFRoaXMgc2Vuc2l0aXZpdHkgd2lsbCBzZWUgbW9yZSBicm9hZCBwaG9uZXRpYyBtYXRjaGVzIGFjcm9zcyBhbHBoYWJldHMgdGhhdCBtYWtlIG1pc3NpbmcgYSBwb3RlbnRpYWwgaGl0IHZlcnkgdW5saWtlbHkuIFRoaXMgc2V0dGluZyBpcyBub2lzaWVyIGFuZCB3aWxsIHJlcXVpcmUgbW9yZSBtYW51YWwgcmV2aWV3LiAgYGJhbGFuY2VkYCAtIEEgZ29vZCBkZWZhdWx0IGZvciBtb3N0IGNvbXBhbmllcy4gVGhpcyBzZW5zaXRpdml0eSBpcyBiYWxhbmNlZCB0byBzaG93IGhpZ2ggcXVhbGl0eSBoaXRzIHdpdGggcmVkdWNlZCBub2lzZS4gIGBzdHJpY3RgIC0gQWdncmVzc2l2ZSBmYWxzZSBwb3NpdGl2ZSByZWR1Y3Rpb24uIFRoaXMgc2Vuc2l0aXZpdHkgd2lsbCByZXF1aXJlIG5hbWVzIHRvIGJlIG1vcmUgc2ltaWxhciB0aGFuIGBjb2Fyc2VgIGFuZCBgYmFsYW5jZWRgIHNldHRpbmdzLCByZWx5aW5nIGxlc3Mgb24gcGhvbmV0aWNzLCB3aGlsZSBzdGlsbCBhY2NvdW50aW5nIGZvciBjaGFyYWN0ZXIgdHJhbnNwb3NpdGlvbnMsIG1pc3NpbmcgdG9rZW5zLCBhbmQgb3RoZXIgY29tbW9uIHBlcm11dGF0aW9ucy4gIGBleGFjdGAgLSBNYXRjaGVzIG11c3QgYmUgbmVhcmx5IGV4YWN0LiBUaGlzIHNlbnNpdGl2aXR5IHdpbGwgb25seSBzaG93IGhpdHMgd2l0aCBleGFjdCBvciBuZWFybHkgZXhhY3QgbmFtZSBtYXRjaGVzIHdpdGggb25seSBiYXNpYyBjb3JyZWN0aW9uIHN1Y2ggYXMgZXh0cmFuZW91cyBzeW1ib2xzIGFuZCBjYXBpdGFsaXphdGlvbi4gVGhpcyBzZXR0aW5nIGlzIGdlbmVyYWxseSBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdSBoYXZlIGEgdmVyeSBzcGVjaWZpYyB1c2UgY2FzZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFByb2dyYW1OYW1lU2Vuc2l0aXZpdHkge1xuICAgIENvYXJzZSA9ICdjb2Fyc2UnLFxuICAgIEJhbGFuY2VkID0gJ2JhbGFuY2VkJyxcbiAgICBTdHJpY3QgPSAnc3RyaWN0JyxcbiAgICBFeGFjdCA9ICdleGFjdCdcbn1cblxuLyoqXG4gKiBUaGUgZW1wbG95ZWVcXCdzIGVzdGltYXRlZCBhbm51YWwgc2FsYXJ5LCBhcyBkZXJpdmVkIGZyb20gaW5mb3JtYXRpb24gcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBQcm9qZWN0ZWRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFByb2plY3RlZEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHdoZXRoZXIgYSBuZXR3b3JrIHByb3h5IGlzIHByZXNlbnQgYW5kIGlmIHNvIHdoYXQgdHlwZSBpdCBpcy4gIGBub25lX2RldGVjdGVkYCBpbmRpY2F0ZXMgdGhlIHVzZXIgaXMgbm90IG9uIGEgZGV0ZWN0YWJsZSBwcm94eSBuZXR3b3JrLiAgYHRvcmAgaW5kaWNhdGVzIHRoZSB1c2VyIHdhcyB1c2luZyBhIFRvciBicm93c2VyLCB3aGljaCBzZW5kcyBlbmNyeXB0ZWQgdHJhZmZpYyBvbiBhIGRlY2VudHJhbGl6ZWQgbmV0d29yayBhbmQgaXMgc29tZXdoYXQgc2ltaWxhciB0byBhIFZQTiAoVmlydHVhbCBQcml2YXRlIE5ldHdvcmspLiAgYHZwbmAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgVlBOIChWaXJ0dWFsIFByaXZhdGUgTmV0d29yaykgIGB3ZWJfcHJveHlgIGluZGljYXRlcyB0aGUgdXNlciBpcyBvbiBhIHdlYiBwcm94eSBzZXJ2ZXIsIHdoaWNoIG1heSBhbGxvdyB0aGVtIHRvIGNvbmNlYWwgaW5mb3JtYXRpb24gc3VjaCBhcyB0aGVpciBJUCBhZGRyZXNzIG9yIG90aGVyIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAgYHB1YmxpY19wcm94eWAgaW5kaWNhdGVzIHRoZSB1c2VyIGlzIG9uIGEgcHVibGljIHdlYiBwcm94eSBzZXJ2ZXIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gYSB3ZWIgcHJveHkgYnV0IGNhbiBiZSBzaGFyZWQgYnkgbXVsdGlwbGUgdXNlcnMuIFRoaXMgbWF5IGFsbG93IG11bHRpcGxlIHVzZXJzIHRvIGFwcGVhciBhcyBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgSVAgYWRkcmVzcyBmb3IgaW5zdGFuY2UuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBQcm94eVR5cGUge1xuICAgIE5vbmVEZXRlY3RlZCA9ICdub25lX2RldGVjdGVkJyxcbiAgICBUb3IgPSAndG9yJyxcbiAgICBWcG4gPSAndnBuJyxcbiAgICBXZWJQcm94eSA9ICd3ZWJfcHJveHknLFxuICAgIFB1YmxpY1Byb3h5ID0gJ3B1YmxpY19wcm94eSdcbn1cblxuLyoqXG4gKiBUaGUgcmVxdWVzdCB3YXMgZmxhZ2dlZCBieSBQbGFpZFxcJ3MgZnJhdWQgc3lzdGVtLCBhbmQgcmVxdWlyZXMgYWRkaXRpb25hbCB2ZXJpZmljYXRpb24gdG8gZW5zdXJlIHRoZXkgYXJlIG5vdCBhIGJvdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3Ige1xuICAgIC8qKlxuICAgICAqIFJFQ0FQVENIQV9FUlJPUlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICBlcnJvcl90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUkVDQVBUQ0hBX1JFUVVJUkVEXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGVycm9yX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgZGlzcGxheV9tZXNzYWdlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogNDAwXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGh0dHBfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgdXNlciB3aWxsIGJlIHByb21wdGVkIHRvIHNvbHZlIGEgR29vZ2xlIHJlQ0FQVENIQSBjaGFsbGVuZ2UgaW4gdGhlIExpbmsgUmVjYXB0Y2hhIHBhbmUuIElmIHRoZXkgc29sdmUgdGhlIGNoYWxsZW5nZSBzdWNjZXNzZnVsbHksIHRoZSB1c2VyXFwncyByZXF1ZXN0IGlzIHJlc3VibWl0dGVkIGFuZCB0aGV5IGFyZSBkaXJlY3RlZCB0byB0aGUgbmV4dCBJdGVtIGNyZWF0aW9uIHN0ZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjYXB0Y2hhUmVxdWlyZWRFcnJvclxuICAgICAqL1xuICAgIGxpbmtfdXNlcl9leHBlcmllbmNlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIGZyYXVkIHN5c3RlbSBkZXRlY3RzIGFidXNpdmUgdHJhZmZpYyBhbmQgY29uc2lkZXJzIGEgdmFyaWV0eSBvZiBwYXJhbWV0ZXJzIHRocm91Z2hvdXQgSXRlbSBjcmVhdGlvbiByZXF1ZXN0cy4gV2hlbiBhIHJlcXVlc3QgaXMgY29uc2lkZXJlZCByaXNreSBvciBwb3NzaWJseSBmcmF1ZHVsZW50LCBMaW5rIHByZXNlbnRzIGEgcmVDQVBUQ0hBIGZvciB0aGUgdXNlciB0byBzb2x2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNhcHRjaGFSZXF1aXJlZEVycm9yXG4gICAgICovXG4gICAgY29tbW9uX2NhdXNlczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIExpbmsgd2lsbCBhdXRvbWF0aWNhbGx5IGd1aWRlIHlvdXIgdXNlciB0aHJvdWdoIHJlQ0FQVENIQSB2ZXJpZmljYXRpb24uIEFzIGEgZ2VuZXJhbCBydWxlLCB3ZSByZWNvbW1lbmQgaW5zdHJ1bWVudGluZyBiYXNpYyBmcmF1ZCBtb25pdG9yaW5nIHRvIGRldGVjdCBhbmQgcHJvdGVjdCB5b3VyIHdlYnNpdGUgZnJvbSBzcGFtIGFuZCBhYnVzZS4gIElmIHlvdXIgdXNlciBjYW5ub3QgdmVyaWZ5IHRoZWlyIHNlc3Npb24sIHBsZWFzZSBzdWJtaXQgYSBTdXBwb3J0IHRpY2tldCB3aXRoIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6IGBsaW5rX3Nlc3Npb25faWRgIG9yIGByZXF1ZXN0X2lkYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2FwdGNoYVJlcXVpcmVkRXJyb3JcbiAgICAgKi9cbiAgICB0cm91Ymxlc2hvb3Rpbmdfc3RlcHM6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHlvdSBuZWVkIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2lwaWVudEJBQ1Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY2lwaWVudEJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU1xuICAgICAqL1xuICAgIHNvcnRfY29kZT86IHN0cmluZztcbn1cbi8qKlxuICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgYSBCQUNTIGFjY291bnQgbnVtYmVyIGFuZCBzb3J0IGNvZGUuIElmIGFuIElCQU4gaXMgbm90IHByb3ZpZGVkIG9yIGlmIHRoaXMgcmVjaXBpZW50IG5lZWRzIHRvIGFjY2VwdCBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIEJBQ1MgZGF0YSBpcyByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjaXBpZW50QkFDU051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWNpcGllbnRCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjaXBpZW50QkFDU051bGxhYmxlXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgcmVjb21tZW5kYXRpb24gcmVzdWx0IGZvciB0aGF0IGRhdGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZWNvbW1lbmRhdGlvblN0cmluZyB7XG4gICAgUmVjb21tZW5kZWQgPSAnUkVDT01NRU5ERUQnLFxuICAgIE5vdFJlY29tbWVuZGVkID0gJ05PVF9SRUNPTU1FTkRFRCcsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEluc2lnaHRzIHJlbGF0aW5nIHRvIGV4cGVuc2VzIGFuZCBkZXBvc2l0cyB0aGF0IGFyZSBwcmVkaWN0ZWQgdG8gb2NjdXIgb24gYSBzY2hlZHVsZWQgYmFzaXMsIHN1Y2ggYXMgYml3ZWVrbHksIG1vbnRobHksIG9yIGFubnVhbGx5LiAgQ29tbW9uIGV4YW1wbGVzIGluY2x1ZGUgbG9hbiBwYXltZW50cywgYmlsbCBwYXltZW50cywgc3Vic2NyaXB0aW9ucywgYW5kIHBheXJvbGwgaW5jb21lLiAgVGhpcyBpcyBhIGJldGEgZmllbGQsIGF2YWlsYWJsZSB0byBhbGwgdXNlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmVuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJlbmNlIHtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgdHJhbnNhY3Rpb24gaXMgcGVyaW9kaWNhbGx5IHJlY3VycmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyZW5jZVxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdGcmVxdWVuY3l9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmVuY2VcbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdGcmVxdWVuY3kgfCBudWxsO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIGNhbmNlbGxlZCBieSBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdDYW5jZWxsZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFJFQ1VSUklOR19DQU5DRUxMRURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nQ2FuY2VsbGVkV2ViaG9va1xuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0NhbmNlbGxlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYFdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgd2Vlay4gIGBCSVdFRUtMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgMiB3ZWVrcy4gIGBTRU1JX01PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IHR3aWNlIHBlciBtb250aC4gVGhpcyBmcmVxdWVuY3kgaXMgdHlwaWNhbGx5IHNlZW4gZm9yIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zLiAgYE1PTlRITFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IG1vbnRoLiAgYEFOTlVBTExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSB5ZWFyLiAgYERBSUxZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBkYXkuICBgRFlOQU1JQ2A6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgdmFyaWVzIGluIHJlY3VycmVuY2UgZnJlcXVlbmN5LiBUaGlzIGZyZXF1ZW5jeSBpcyB0eXBpY2FsbHkgc2VlbiBmb3IgaW5mbG93IHN0cmVhbXMgaW4gdGhlIGdpZyBlY29ub215LiAgYFVOS05PV05gOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IGlzblxcJ3QgcmVjdXJyaW5nIGluIG5hdHVyZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ0ZyZXF1ZW5jeSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBXZWVrbHkgPSAnV0VFS0xZJyxcbiAgICBCaXdlZWtseSA9ICdCSVdFRUtMWScsXG4gICAgU2VtaU1vbnRobHkgPSAnU0VNSV9NT05USExZJyxcbiAgICBNb250aGx5ID0gJ01PTlRITFknLFxuICAgIEFubnVhbGx5ID0gJ0FOTlVBTExZJyxcbiAgICBEYWlseSA9ICdEQUlMWScsXG4gICAgRHluYW1pYyA9ICdEWU5BTUlDJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIHN0cmVhbXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW0ge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkIGZvciB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgc3RyZWFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudC1wcm92aWRlZCByYXcgZGVzY3JpcHRpb24gb2YgdGhlIG1vc3QgcmVjZW50IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWVyY2hhbnQgb3IgcHJpbWFyeSBjb3VudGVycGFydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgb2xkZXN0X3RyYW5zYWN0aW9uX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gaW4gdGhlIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdmVyYWdlIG51bWJlciBvZiBkYXlzIGJldHdlZW4gZWFjaCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfZGF5c19hcGFydDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBmcmVxdWVuY3k/OiBSZWN1cnJpbmdUcmFuc2FjdGlvbkZyZXF1ZW5jeTtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBpbiB0aGlzIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIFBsYWlkIHRyYW5zYWN0aW9uIElEcyBiZWxvbmdpbmcgdG8gdGhlIHN0cmVhbSwgc29ydGVkIGJ5IHBvc3RlZCBkYXRlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIGF2ZXJhZ2VfYW1vdW50PzogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIG5ld2VzdF90cmFuc2FjdGlvbl9hbW91bnQ/OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ0luc2lnaHRzU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM/OiBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBjYXRlZ29yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbVxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfcHJpbWFyeT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGV0YWlsZWQgY2F0ZWdvcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nSW5zaWdodHNTdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2RldGFpbGVkPzogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGEgbmV3IHRyYW5zZmVyIG9mIGEgcmVjdXJyaW5nIHRyYW5zZmVyIGlzIG9yaWdpbmF0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfTkVXX1RSQU5TRkVSYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ05ld1RyYW5zZmVyV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nTmV3VHJhbnNmZXJXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBmcmVxdWVuY3kgb2YgdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS4gIGBXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IHdlZWsuICBgQklXRUVLTFlgOiBBc3NpZ25lZCB0byBhIHRyYW5zYWN0aW9uIHN0cmVhbSB0aGF0IG9jY3VycyBhcHByb3hpbWF0ZWx5IGV2ZXJ5IDIgd2Vla3MuICBgU0VNSV9NT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSB0d2ljZSBwZXIgbW9udGguIFRoaXMgZnJlcXVlbmN5IGlzIHR5cGljYWxseSBzZWVuIGZvciBpbmZsb3cgdHJhbnNhY3Rpb24gc3RyZWFtcy4gIGBNT05USExZYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBvY2N1cnMgYXBwcm94aW1hdGVseSBldmVyeSBtb250aC4gIGBBTk5VQUxMWWA6IEFzc2lnbmVkIHRvIGEgdHJhbnNhY3Rpb24gc3RyZWFtIHRoYXQgb2NjdXJzIGFwcHJveGltYXRlbHkgZXZlcnkgeWVhci4gIGBVTktOT1dOYDogQXNzaWduZWQgdG8gYSB0cmFuc2FjdGlvbiBzdHJlYW0gdGhhdCBkb2VzIG5vdCBmaXQgYW55IG9mIHRoZSBwcmUtZGVmaW5lZCBmcmVxdWVuY2llcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5IHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIFdlZWtseSA9ICdXRUVLTFknLFxuICAgIEJpd2Vla2x5ID0gJ0JJV0VFS0xZJyxcbiAgICBTZW1pTW9udGhseSA9ICdTRU1JX01PTlRITFknLFxuICAgIE1vbnRobHkgPSAnTU9OVEhMWScsXG4gICAgQW5udWFsbHkgPSAnQU5OVUFMTFknXG59XG5cbi8qKlxuICogSW5zaWdodHMgb2JqZWN0IGZvciByZWN1cnJpbmcgdHJhbnNhY3Rpb25zIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBlbmRwb2ludFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnMge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGluZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBpbmNvbWUpLlxuICAgICAqIEB0eXBlIHtBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1xuICAgICAqL1xuICAgIGluZmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2Ygb3V0ZmxvdyB0cmFuc2FjdGlvbiBzdHJlYW1zIChlLmcuLCBzdWJzY3JpcHRpb25zLCBiaWxscywgbG9hbiBwYXltZW50cykuXG4gICAgICogQHR5cGUge0FycmF5PFJlY3VycmluZ0luc2lnaHRzU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgb3V0Zmxvd19zdHJlYW1zOiBBcnJheTxSZWN1cnJpbmdJbnNpZ2h0c1N0cmVhbT47XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhIGlzIHVwZGF0ZWQuIFRoaXMgaW5jbHVkZXMgd2hlbiBhIG5ldyByZWN1cnJpbmcgc3RyZWFtIGlzIGRldGVjdGVkIG9yIHdoZW4gYSBuZXcgdHJhbnNhY3Rpb24gaXMgYWRkZWQgdG8gYW4gZXhpc3RpbmcgcmVjdXJyaW5nIHN0cmVhbS4gVGhlIGBSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWAgd2ViaG9vayB3aWxsIGFsc28gZmlyZSB3aGVuIG9uZSBvciBtb3JlIGF0dHJpYnV0ZXMgb2YgdGhlIHJlY3VycmluZyBzdHJlYW0gY2hhbmdlcywgd2hpY2ggaXMgdXN1YWxseSBhIHJlc3VsdCBvZiB0aGUgYWRkaXRpb24sIHVwZGF0ZSwgb3IgcmVtb3ZhbCBvZiB0cmFuc2FjdGlvbnMgdG8gdGhlIHN0cmVhbS4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgdXBkYXRlZCBkYXRhIGNhbiBiZSBmZXRjaGVkIGZyb20gYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIGZvciBhY2NvdW50cyB0aGF0IGhhdmUgbmV3IG9yIHVwZGF0ZWQgcmVjdXJyaW5nIHRyYW5zYWN0aW9ucyBkYXRhLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2FjdGlvbnNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNhY3Rpb25zVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gIFRoZSBuZXh0IHRyYW5zZmVyIG9yaWdpbmF0aW9uIGRhdGUgYWZ0ZXIgYmFuayBob2xpZGF5IGFkanVzdG1lbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXh0X29yaWdpbmF0aW9uX2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ05ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyXG4gICAgICovXG4gICAgc2NoZWR1bGU6IFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGU7XG59XG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiAgVGhlIG5leHQgdHJhbnNmZXIgb3JpZ2luYXRpb24gZGF0ZSBhZnRlciBiYW5rIGhvbGlkYXkgYWRqdXN0bWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgbmV4dF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJSZWN1cnJpbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyUmVjdXJyaW5nTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgZnVuZGluZyBhY2NvdW50IHRvIHVzZSwgYXZhaWxhYmxlIGluIHRoZSBQbGFpZCBEYXNoYm9hcmQuIFRoaXMgZGV0ZXJtaW5lcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZVxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFJlY3VycmluZ1RyYW5zZmVyTnVsbGFibGVcbiAgICAgKi9cbiAgICBzY2hlZHVsZTogVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZTtcbn1cbi8qKlxuICogRmlyZWQgd2hlbiBQbGFpZCBpcyB1bmFibGUgdG8gb3JpZ2luYXRlIGEgbmV3IEFDSCB0cmFuc2FjdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIG9uIHRoZSBwbGFubmVkIGRhdGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlY3VycmluZ1RyYW5zZmVyU2tpcHBlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBSRUNVUlJJTkdfVFJBTlNGRVJfU0tJUFBFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9ufVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9kZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25fZGVjaXNpb25fcmF0aW9uYWxlX2NvZGU/OiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGU7XG4gICAgLyoqXG4gICAgICogVGhlIHBsYW5uZWQgZGF0ZSBvbiB3aGljaCBQbGFpZCBpcyB1bmFibGUgdG8gb3JpZ2luYXRlIGEgbmV3IEFDSCB0cmFuc2FjdGlvbiBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSZWN1cnJpbmdUcmFuc2ZlclNraXBwZWRXZWJob29rXG4gICAgICovXG4gICAgc2tpcHBlZF9vcmlnaW5hdGlvbl9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgUmVjdXJyaW5nVHJhbnNmZXJTa2lwcGVkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIEEgcmVwcmVzZW50YXRpb24gb2YgYSByZW1vdmVkIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJlbW92ZWRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW92ZWRUcmFuc2FjdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlbW92ZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IG9mIHRoZSByZW1vdmVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlbW92ZWRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlcG9ydCB0eXBlLiBJdCBjYW4gYmUgYGFzc2V0YC4gSW5jb21lIHJlcG9ydCB0eXBlcyBhcmUgbm90IHlldCBzdXBwb3J0ZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSZXBvcnRUeXBlIHtcbiAgICBBc3NldCA9ICdhc3NldCdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhbiByZXBvcnQgaWRlbnRpZmllciBhbmQgYSByZXBvcnQgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmVwb3J0aW5nSW5mb3JtYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXBvcnRpbmdJbmZvcm1hdGlvbiB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJlcG9ydGluZ0luZm9ybWF0aW9uXG4gICAgICovXG4gICAgUmVwb3J0aW5nSW5mb3JtYXRpb25JZGVudGlmaWVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGJlaGF2aW9yYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2ssIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tCZWhhdmlvclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja0JlaGF2aW9yIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrQmVoYXZpb3JVc2VySW50ZXJhY3Rpb25zTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgdXNlcl9pbnRlcmFjdGlvbnM6IFJpc2tDaGVja0JlaGF2aW9yVXNlckludGVyYWN0aW9uc0xhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckZyYXVkUmluZ0RldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgZnJhdWRfcmluZ19kZXRlY3RlZDogUmlza0NoZWNrQmVoYXZpb3JGcmF1ZFJpbmdEZXRlY3RlZExhYmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgYm90X2RldGVjdGVkOiBSaXNrQ2hlY2tCZWhhdmlvckJvdERldGVjdGVkTGFiZWw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbFdpdGhOb0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0JlaGF2aW9yXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbFdpdGhOb0RhdGE7XG59XG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG91dGNvbWUgb2YgYSBib3QgZGV0ZWN0aW9uIGJlaGF2aW9yIHJpc2sgY2hlY2suICBgeWVzYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBhdXRvbWF0ZWQgYWN0aXZpdHkgd2FzIG5vdCBkZXRlY3RlZC4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgd2FzIG5vdCBlbm91Z2ggaW5mb3JtYXRpb24gYXZhaWxhYmxlIHRvIGdpdmUgYW4gYWNjdXJhdGUgc2lnbmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrQmVoYXZpb3JCb3REZXRlY3RlZExhYmVsIHtcbiAgICBZZXMgPSAneWVzJyxcbiAgICBObyA9ICdubycsXG4gICAgTm9EYXRhID0gJ25vX2RhdGEnXG59XG5cbi8qKlxuICogRmllbGQgZGVzY3JpYmluZyB0aGUgb3V0Y29tZSBvZiBhIGZyYXVkIHJpbmcgYmVoYXZpb3IgcmlzayBjaGVjay4gIGB5ZXNgIGluZGljYXRlcyB0aGF0IGZyYXVkIHJpbmcgYWN0aXZpdHkgd2FzIGRldGVjdGVkLiAgYG5vYCBpbmRpY2F0ZXMgdGhhdCBmcmF1ZCByaW5nIGFjdGl2aXR5IHdhcyBub3QgZGV0ZWN0ZWQuICBgbm9fZGF0YWAgaW5kaWNhdGVzIHRoZXJlIHdhcyBub3QgZW5vdWdoIGluZm9ybWF0aW9uIGF2YWlsYWJsZSB0byBnaXZlIGFuIGFjY3VyYXRlIHNpZ25hbC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0JlaGF2aW9yRnJhdWRSaW5nRGV0ZWN0ZWRMYWJlbCB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEZpZWxkIGRlc2NyaWJpbmcgdGhlIG92ZXJhbGwgdXNlciBpbnRlcmFjdGlvbiBzaWduYWxzIG9mIGEgYmVoYXZpb3IgcmlzayBjaGVjay4gVGhpcyB2YWx1ZSByZXByZXNlbnRzIGhvdyBmYW1pbGlhciB0aGUgdXNlciBpcyB3aXRoIHRoZSBwZXJzb25hbCBkYXRhIHRoZXkgcHJvdmlkZSwgYmFzZWQgb24gYSBudW1iZXIgb2Ygc2lnbmFscyB0aGF0IGFyZSBjb2xsZWN0ZWQgZHVyaW5nIHRoZWlyIHNlc3Npb24uICBgZ2VudWluZWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBoaWdoIGZhbWlsaWFyaXR5IHdpdGggdGhlIGRhdGEgdGhleSBhcmUgcHJvdmlkaW5nLCBhbmQgdGhhdCBmcmF1ZCBpcyB1bmxpa2VseS4gIGBuZXV0cmFsYCBpbmRpY2F0ZXMgc29tZSBzaWduYWxzIGFyZSBwcmVzZW50IGluIGJldHdlZW4gYHJpc2t5YCBhbmQgYGdlbnVpbmVgLCBidXQgdGhlcmUgYXJlIG5vdCBlbm91Z2ggY2xlYXIgc2lnbmFscyB0byBkZXRlcm1pbmUgYW4gb3V0Y29tZS4gIGByaXNreWAgaW5kaWNhdGVzIHRoZSB1c2VyIGhhcyBsb3cgZmFtaWxpYXJpdHkgd2l0aCB0aGUgZGF0YSB0aGV5IGFyZSBwcm92aWRpbmcsIGFuZCB0aGF0IGZyYXVkIGlzIGxpa2VseS4gIGBub19kYXRhYCBpbmRpY2F0ZXMgdGhlcmUgaXMgbm90IHN1ZmZpY2llbnQgaW5mb3JtYXRpb24gdG8gZ2l2ZSBhbiBhY2N1cmF0ZSBzaWduYWwuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tCZWhhdmlvclVzZXJJbnRlcmFjdGlvbnNMYWJlbCB7XG4gICAgR2VudWluZSA9ICdnZW51aW5lJyxcbiAgICBOZXV0cmFsID0gJ25ldXRyYWwnLFxuICAgIFJpc2t5ID0gJ3Jpc2t5JyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgYHJpc2tfY2hlY2tgIHN0ZXAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja0RldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SWRlbnRpdHlWZXJpZmljYXRpb25TdGVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBJZGVudGl0eVZlcmlmaWNhdGlvblN0ZXBTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0JlaGF2aW9yfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgYmVoYXZpb3I6IFJpc2tDaGVja0JlaGF2aW9yIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBlbWFpbDogUmlza0NoZWNrRW1haWwgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tQaG9uZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV0YWlsc1xuICAgICAqL1xuICAgIHBob25lOiBSaXNrQ2hlY2tQaG9uZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXJyYXkgb2YgcmVzdWx0IHN1bW1hcnkgb2JqZWN0cyBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICAgICAqIEB0eXBlIHtBcnJheTxSaXNrQ2hlY2tEZXZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXRhaWxzXG4gICAgICovXG4gICAgZGV2aWNlczogQXJyYXk8Umlza0NoZWNrRGV2aWNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBpZGVudGl0eV9hYnVzZV9zaWduYWxzOiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja05ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldGFpbHNcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogUmlza0NoZWNrTmV0d29yayB8IG51bGw7XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYGRldmljZWAgYXR0cmlidXRlcyBvZiByaXNrIGNoZWNrLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSaXNrQ2hlY2tEZXZpY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tEZXZpY2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm94eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0RldmljZVxuICAgICAqL1xuICAgIGlwX3Byb3h5X3R5cGU6IFByb3h5VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ291bnQgb2Ygc3BhbSBsaXN0cyB0aGUgSVAgYWRkcmVzcyBpcyBhc3NvY2lhdGVkIHdpdGggaWYga25vd24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgaXBfc3BhbV9saXN0X2NvdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFVUQyBvZmZzZXQgb2YgdGhlIHRpbWV6b25lIGFzc29jaWF0ZWQgd2l0aCB0aGUgSVAgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBpcF90aW1lem9uZV9vZmZzZXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRGV2aWNlXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGZhY3RvcnMsIHdoZW4gYXZhaWxhYmxlLCB0aGF0IGNvbnRyaWJ1dGUgdG93YXJkcyB0aGUgcmlzayBsZXZlbCBvZiB0aGUgZ2l2ZW4gcmlzayBjaGVjayB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tEZXZpY2VcbiAgICAgKi9cbiAgICBmYWN0b3JzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBgZW1haWxgIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrRW1haWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tFbWFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsSXNEZWxpdmVyYWJsZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBpc19kZWxpdmVyYWJsZTogUmlza0NoZWNrRW1haWxJc0RlbGl2ZXJhYmxlU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIENvdW50IG9mIGFsbCBrbm93biBicmVhY2hlcyBvZiB0aGlzIGVtYWlsIGFkZHJlc3MgaWYga25vd24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBicmVhY2hfY291bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgZmlyc3RfYnJlYWNoZWRfYXQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIHRoZSBmb3JtYXQgWVlZWS1NTS1ERCAoUkZDIDMzMzkgU2VjdGlvbiA1LjYpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgbGFzdF9icmVhY2hlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5fcmVnaXN0ZXJlZF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxEb21haW5Jc0ZyZWVQcm92aWRlcn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5faXNfZnJlZV9wcm92aWRlcjogUmlza0NoZWNrRW1haWxEb21haW5Jc0ZyZWVQcm92aWRlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0NoZWNrRW1haWxEb21haW5Jc0N1c3RvbX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5faXNfY3VzdG9tOiBSaXNrQ2hlY2tFbWFpbERvbWFpbklzQ3VzdG9tO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tFbWFpbERvbWFpbklzRGlzcG9zYWJsZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBkb21haW5faXNfZGlzcG9zYWJsZTogUmlza0NoZWNrRW1haWxEb21haW5Jc0Rpc3Bvc2FibGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja0VtYWlsVG9wTGV2ZWxEb21haW5Jc1N1c3BpY2lvdXN9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja0VtYWlsXG4gICAgICovXG4gICAgdG9wX2xldmVsX2RvbWFpbl9pc19zdXNwaWNpb3VzOiBSaXNrQ2hlY2tFbWFpbFRvcExldmVsRG9tYWluSXNTdXNwaWNpb3VzO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBvbmxpbmUgc2VydmljZXMgd2hlcmUgdGhpcyBlbWFpbCBhZGRyZXNzIGhhcyBiZWVuIGRldGVjdGVkIHRvIGhhdmUgYWNjb3VudHMgb3Igb3RoZXIgYWN0aXZpdHkuXG4gICAgICogQHR5cGUge1NldDxSaXNrQ2hlY2tMaW5rZWRTZXJ2aWNlPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBsaW5rZWRfc2VydmljZXM6IFNldDxSaXNrQ2hlY2tMaW5rZWRTZXJ2aWNlPjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Umlza0xldmVsfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tFbWFpbFxuICAgICAqL1xuICAgIHJpc2tfbGV2ZWw/OiBSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBmYWN0b3JzLCB3aGVuIGF2YWlsYWJsZSwgdGhhdCBjb250cmlidXRlIHRvd2FyZHMgdGhlIHJpc2sgbGV2ZWwgb2YgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrRW1haWxcbiAgICAgKi9cbiAgICBmYWN0b3JzPzogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIGVtYWlsIGFkZHJlc3MgZG9tYWluIGlzIGN1c3RvbSBpZiBrbm93biwgaS5lLiBhIGNvbXBhbnkgZG9tYWluIGFuZCBub3QgZnJlZSBvciBkaXNwb3NhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxEb21haW5Jc0N1c3RvbSB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBkb21haW4gaXMgbGlzdGVkIGFzIGRpc3Bvc2FibGUgaWYga25vd24uIERpc3Bvc2FibGUgZG9tYWlucyBhcmUgb2Z0ZW4gdXNlZCB0byBjcmVhdGUgZW1haWwgYWRkcmVzc2VzIHRoYXQgYXJlIHBhcnQgb2YgYSBmYWtlIHNldCBvZiB1c2VyIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbERvbWFpbklzRGlzcG9zYWJsZSB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWFpbCBhZGRyZXNzIGRvbWFpbiBpcyBhIGZyZWUgcHJvdmlkZXIgc3VjaCBhcyBHbWFpbCBvciBIb3RtYWlsIGlmIGtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxEb21haW5Jc0ZyZWVQcm92aWRlciB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFNNVFAtTVggY2hlY2sgdG8gY29uZmlybSB0aGUgZW1haWwgYWRkcmVzcyBleGlzdHMgaWYga25vd24uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrQ2hlY2tFbWFpbElzRGVsaXZlcmFibGVTdGF0dXMge1xuICAgIFllcyA9ICd5ZXMnLFxuICAgIE5vID0gJ25vJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZW1haWwgYWRkcmVzcyB0b3AgbGV2ZWwgZG9tYWluLCB3aGljaCBpcyB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBkb21haW4sIGlzIGZyYXVkdWxlbnQgb3Igcmlza3kgaWYga25vd24uIEluIG1vc3QgY2FzZXMsIGEgc3VzcGljaW91cyB0b3AgbGV2ZWwgZG9tYWluIGlzIGFsc28gYXNzb2NpYXRlZCB3aXRoIGEgZGlzcG9zYWJsZSBvciBoaWdoLXJpc2sgZG9tYWluLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0NoZWNrRW1haWxUb3BMZXZlbERvbWFpbklzU3VzcGljaW91cyB7XG4gICAgWWVzID0gJ3llcycsXG4gICAgTm8gPSAnbm8nLFxuICAgIE5vRGF0YSA9ICdub19kYXRhJ1xufVxuXG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBjYXB0dXJpbmcgYWJ1c2Ugc2lnbmFscyByZWxhdGVkIHRvIGBpZGVudGl0eSBhYnVzZWAsIGUuZy4gc3RvbGVuIGFuZCBzeW50aGV0aWMgaWRlbnRpdHkgZnJhdWQuIFRoZXNlIGF0dHJpYnV0ZXMgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBVUyBpZGVudGl0aWVzIGFuZCBzb21lIHNpZ25hbHMgbWF5IG5vdCBiZSBhdmFpbGFibGUgZGVwZW5kaW5nIG9uIHdoYXQgaW5mb3JtYXRpb24gd2FzIGNvbGxlY3RlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFscyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tDaGVja1N5bnRoZXRpY0lkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tJZGVudGl0eUFidXNlU2lnbmFsc1xuICAgICAqL1xuICAgIHN5bnRoZXRpY19pZGVudGl0eTogUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrSWRlbnRpdHlBYnVzZVNpZ25hbHNcbiAgICAgKi9cbiAgICBzdG9sZW5faWRlbnRpdHk6IFJpc2tDaGVja1N0b2xlbklkZW50aXR5IHwgbnVsbDtcbn1cbi8qKlxuICogQW4gZW51bSBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGEgbGlua2VkIHNlcnZpY2UuIE5vdGUgdGhhdCBgYWR1bHRfc2l0ZXNgIHJlZmVyc1xcJyB0byBleHBsaWNpdCB2aWRlbyBjb250ZW50LCBhbmQgaW5jbHVkZXMgYSBudW1iZXIgb2YgcmVsYXRlZCBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tDaGVja0xpbmtlZFNlcnZpY2Uge1xuICAgIEFib3V0bWUgPSAnYWJvdXRtZScsXG4gICAgQWRvYmUgPSAnYWRvYmUnLFxuICAgIEFkdWx0U2l0ZXMgPSAnYWR1bHRfc2l0ZXMnLFxuICAgIEFpcmJuYiA9ICdhaXJibmInLFxuICAgIEFsdGJhbGFqaSA9ICdhbHRiYWxhamknLFxuICAgIEFtYXpvbiA9ICdhbWF6b24nLFxuICAgIEFwcGxlID0gJ2FwcGxlJyxcbiAgICBBcmNoaXZlb3JnID0gJ2FyY2hpdmVvcmcnLFxuICAgIEF0bGFzc2lhbiA9ICdhdGxhc3NpYW4nLFxuICAgIEJpdG1vamkgPSAnYml0bW9qaScsXG4gICAgQm9keWJ1aWxkaW5nID0gJ2JvZHlidWlsZGluZycsXG4gICAgQm9va2luZyA9ICdib29raW5nJyxcbiAgICBCdWthbGFwYWsgPSAnYnVrYWxhcGFrJyxcbiAgICBDb2RlY2FkZW15ID0gJ2NvZGVjYWRlbXknLFxuICAgIERlbGl2ZXJvbyA9ICdkZWxpdmVyb28nLFxuICAgIERpaWdvID0gJ2RpaWdvJyxcbiAgICBEaXNjb3JkID0gJ2Rpc2NvcmQnLFxuICAgIERpc25leXBsdXMgPSAnZGlzbmV5cGx1cycsXG4gICAgRHVvbGluZ28gPSAnZHVvbGluZ28nLFxuICAgIEViYXkgPSAnZWJheScsXG4gICAgRW52YXRvID0gJ2VudmF0bycsXG4gICAgRXZlbnRicml0ZSA9ICdldmVudGJyaXRlJyxcbiAgICBFdmVybm90ZSA9ICdldmVybm90ZScsXG4gICAgRmFjZWJvb2sgPSAnZmFjZWJvb2snLFxuICAgIEZpcmVmb3ggPSAnZmlyZWZveCcsXG4gICAgRmxpY2tyID0gJ2ZsaWNrcicsXG4gICAgRmxpcGthcnQgPSAnZmxpcGthcnQnLFxuICAgIEZvdXJzcXVhcmUgPSAnZm91cnNxdWFyZScsXG4gICAgRnJlZWxhbmNlciA9ICdmcmVlbGFuY2VyJyxcbiAgICBHYWFuYSA9ICdnYWFuYScsXG4gICAgR2lwaHkgPSAnZ2lwaHknLFxuICAgIEdpdGh1YiA9ICdnaXRodWInLFxuICAgIEdvb2dsZSA9ICdnb29nbGUnLFxuICAgIEdyYXZhdGFyID0gJ2dyYXZhdGFyJyxcbiAgICBIdWJzcG90ID0gJ2h1YnNwb3QnLFxuICAgIEltZ3VyID0gJ2ltZ3VyJyxcbiAgICBJbnN0YWdyYW0gPSAnaW5zdGFncmFtJyxcbiAgICBKZGlkID0gJ2pkaWQnLFxuICAgIEtha2FvID0gJ2tha2FvJyxcbiAgICBLb21tbyA9ICdrb21tbycsXG4gICAgS29tb290ID0gJ2tvbW9vdCcsXG4gICAgTGFzdGZtID0gJ2xhc3RmbScsXG4gICAgTGF6YWRhID0gJ2xhemFkYScsXG4gICAgTGluZSA9ICdsaW5lJyxcbiAgICBMaW5rZWRpbiA9ICdsaW5rZWRpbicsXG4gICAgTWFpbHJ1ID0gJ21haWxydScsXG4gICAgTWljcm9zb2Z0ID0gJ21pY3Jvc29mdCcsXG4gICAgTXlzcGFjZSA9ICdteXNwYWNlJyxcbiAgICBOZXRmbGl4ID0gJ25ldGZsaXgnLFxuICAgIE5pa2UgPSAnbmlrZScsXG4gICAgT2sgPSAnb2snLFxuICAgIFBhdHJlb24gPSAncGF0cmVvbicsXG4gICAgUGludGVyZXN0ID0gJ3BpbnRlcmVzdCcsXG4gICAgUGx1cmsgPSAncGx1cmsnLFxuICAgIFF1b3JhID0gJ3F1b3JhJyxcbiAgICBRem9uZSA9ICdxem9uZScsXG4gICAgUmFtYmxlciA9ICdyYW1ibGVyJyxcbiAgICBSYXBwaSA9ICdyYXBwaScsXG4gICAgUmVwbGl0ID0gJ3JlcGxpdCcsXG4gICAgU2Ftc3VuZyA9ICdzYW1zdW5nJyxcbiAgICBTZW9jbGVya3MgPSAnc2VvY2xlcmtzJyxcbiAgICBTaG9wY2x1ZXMgPSAnc2hvcGNsdWVzJyxcbiAgICBTa3lwZSA9ICdza3lwZScsXG4gICAgU25hcGNoYXQgPSAnc25hcGNoYXQnLFxuICAgIFNuYXBkZWFsID0gJ3NuYXBkZWFsJyxcbiAgICBTb3VuZGNsb3VkID0gJ3NvdW5kY2xvdWQnLFxuICAgIFNwb3RpZnkgPSAnc3BvdGlmeScsXG4gICAgU3RhcnogPSAnc3RhcnonLFxuICAgIFN0cmF2YSA9ICdzdHJhdmEnLFxuICAgIFRhcmluZ2EgPSAndGFyaW5nYScsXG4gICAgVGVsZWdyYW0gPSAndGVsZWdyYW0nLFxuICAgIFRpa2kgPSAndGlraScsXG4gICAgVG9rb3BlZGlhID0gJ3Rva29wZWRpYScsXG4gICAgVHJlZWhvdXNlID0gJ3RyZWVob3VzZScsXG4gICAgVHVtYmxyID0gJ3R1bWJscicsXG4gICAgVHdpdHRlciA9ICd0d2l0dGVyJyxcbiAgICBWZW5tbyA9ICd2ZW5tbycsXG4gICAgVmliZXIgPSAndmliZXInLFxuICAgIFZpbWVvID0gJ3ZpbWVvJyxcbiAgICBWaXZpbm8gPSAndml2aW5vJyxcbiAgICBWa29udGFrdGUgPSAndmtvbnRha3RlJyxcbiAgICBXYXR0cGFkID0gJ3dhdHRwYWQnLFxuICAgIFdlaWJvID0gJ3dlaWJvJyxcbiAgICBXaGF0c2FwcCA9ICd3aGF0c2FwcCcsXG4gICAgV29yZHByZXNzID0gJ3dvcmRwcmVzcycsXG4gICAgWGluZyA9ICd4aW5nJyxcbiAgICBZYWhvbyA9ICd5YWhvbycsXG4gICAgWWFuZGV4ID0gJ3lhbmRleCcsXG4gICAgWmFsbyA9ICd6YWxvJyxcbiAgICBab2hvID0gJ3pvaG8nXG59XG5cbi8qKlxuICogUmVzdWx0IHN1bW1hcnkgb2JqZWN0IHNwZWNpZnlpbmcgdmFsdWVzIGZvciBuZXR3b3JrIGF0dHJpYnV0ZXMgb2YgcmlzayBjaGVjay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrTmV0d29ya1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tDaGVja05ldHdvcmsge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja05ldHdvcmtcbiAgICAgKi9cbiAgICByaXNrX2xldmVsOiBSaXNrTGV2ZWw7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBmYWN0b3JzLCB3aGVuIGF2YWlsYWJsZSwgdGhhdCBjb250cmlidXRlIHRvd2FyZHMgdGhlIHJpc2sgbGV2ZWwgb2YgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrTmV0d29ya1xuICAgICAqL1xuICAgIGZhY3RvcnM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFJlc3VsdCBzdW1tYXJ5IG9iamVjdCBzcGVjaWZ5aW5nIHZhbHVlcyBmb3IgYHBob25lYCBhdHRyaWJ1dGVzIG9mIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tDaGVja1Bob25lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza0NoZWNrUGhvbmUge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBvbmxpbmUgc2VydmljZXMgd2hlcmUgdGhpcyBwaG9uZSBudW1iZXIgaGFzIGJlZW4gZGV0ZWN0ZWQgdG8gaGF2ZSBhY2NvdW50cyBvciBvdGhlciBhY3Rpdml0eS5cbiAgICAgKiBAdHlwZSB7U2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tQaG9uZVxuICAgICAqL1xuICAgIGxpbmtlZF9zZXJ2aWNlczogU2V0PFJpc2tDaGVja0xpbmtlZFNlcnZpY2U+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFJpc2tDaGVja1Bob25lXG4gICAgICovXG4gICAgcmlza19sZXZlbD86IFJpc2tMZXZlbDtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGZhY3RvcnMsIHdoZW4gYXZhaWxhYmxlLCB0aGF0IGNvbnRyaWJ1dGUgdG93YXJkcyB0aGUgcmlzayBsZXZlbCBvZiB0aGUgZ2l2ZW4gcmlzayBjaGVjayB0eXBlLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tQaG9uZVxuICAgICAqL1xuICAgIGZhY3RvcnM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBGaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG91dGNvbWUgb2YgdGhlIHN0b2xlbiBpZGVudGl0eSByaXNrIGNoZWNrLiAgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6ICBgc2NvcmVgIC0gQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN0b2xlbiBpZGVudGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTdG9sZW5JZGVudGl0eVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3RvbGVuSWRlbnRpdHlcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsO1xufVxuLyoqXG4gKiBGaWVsZCBjb250YWluaW5nIHRoZSBkYXRhIHVzZWQgaW4gZGV0ZXJtaW5pbmcgdGhlIG91dGNvbWUgb2YgdGhlIHN5bnRoZXRpYyBpZGVudGl0eSByaXNrIGNoZWNrLiAgQ29udGFpbnMgdGhlIGZvbGxvd2luZyBmaWVsZHM6ICBgc2NvcmVgIC0gQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN5bnRoZXRpYyBpZGVudGl0eS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eSB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDAgdG8gMTAwIGluZGljYXRpbmcgdGhlIGxpa2VsaWhvb2QgdGhhdCB0aGUgdXNlciBpcyBhIHN5bnRoZXRpYyBpZGVudGl0eS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICAgICAqL1xuICAgIHNjb3JlOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAgICAgKi9cbiAgICByaXNrX2xldmVsPzogUmlza0xldmVsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTeW50aGV0aWNGcmF1ZH1cbiAgICAgKiBAbWVtYmVyb2YgUmlza0NoZWNrU3ludGhldGljSWRlbnRpdHlcbiAgICAgKi9cbiAgICBmaXJzdF9wYXJ0eV9zeW50aGV0aWNfZnJhdWQ/OiBTeW50aGV0aWNGcmF1ZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N5bnRoZXRpY0ZyYXVkfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrQ2hlY2tTeW50aGV0aWNJZGVudGl0eVxuICAgICAqL1xuICAgIHRoaXJkX3BhcnR5X3N5bnRoZXRpY19mcmF1ZD86IFN5bnRoZXRpY0ZyYXVkIHwgbnVsbDtcbn1cbi8qKlxuICogUmlzayBsZXZlbCBmb3IgdGhlIGdpdmVuIHJpc2sgY2hlY2sgdHlwZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFJpc2tMZXZlbCB7XG4gICAgTG93ID0gJ2xvdycsXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXG4gICAgSGlnaCA9ICdoaWdoJ1xufVxuXG4vKipcbiAqIFJpc2sgbGV2ZWwgZm9yIHRoZSBnaXZlbiByaXNrIGNoZWNrIHR5cGUsIHdoZW4gYXZhaWxhYmxlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza0xldmVsV2l0aE5vRGF0YSB7XG4gICAgTG93ID0gJ2xvdycsXG4gICAgTWVkaXVtID0gJ21lZGl1bScsXG4gICAgSGlnaCA9ICdoaWdoJyxcbiAgICBOb0RhdGEgPSAnbm9fZGF0YSdcbn1cblxuLyoqXG4gKiBSaXNrUHJvZmlsZSBpcyBkZXByZWNhdGVkLCB1c2UgYHJ1bGVzZXRgIGluc3RlYWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tQcm9maWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlza1Byb2ZpbGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIHJpc2sgcHJvZmlsZSB1c2VkIGZvciB0aGlzIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tQcm9maWxlXG4gICAgICovXG4gICAga2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmFsdWF0ZWQgb3V0Y29tZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gWW91IGNhbiBjb25maWd1cmUgYSBsaXN0IG9mIG91dGNvbWVzLCBzdWNoIGFzIFxcXCJhY2NlcHRcXFwiLCBcXFwicmV2aWV3XFxcIiwgYW5kIFxcXCJkZWNsaW5lXFxcIiB1c2luZyB0aGUgU2lnbmFsIGRhc2hib2FyZCBsb2NhdGVkIHdpdGhpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tQcm9maWxlXG4gICAgICovXG4gICAgb3V0Y29tZT86IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBvYmplY3QgaW5jbHVkZXMgYSBjb2RlIGFuZCBkZXNjcmlwdGlvbiB0byBkZXNjcmliZSBtZWRpdW0gcmlzayB0cmFuc2FjdGlvbnMgYW5kIGFib3ZlIG9uIC9hY2NvdW50cy9iYWxhbmNlL2dldC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgUmlza1JlYXNvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tSZWFzb24ge1xuICAgIC8qKlxuICAgICAqIEEgY29kZSB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGUgb2YgcmlzayBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiAgVGhlIGNvZGVzIGFyZSBmcm9tIFBMMDEgdG8gUEwwOCBhbmQgZnJvbSBCSzAxIHRvIEJLMDcuIEZvciBhIGZ1bGwgbGlzdGluZyBvZiByaXNrIHJlYXNvbiBjb2Rlcywgc2VlIFtSaXNrIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2JhbGFuY2UvYmFsYW5jZS1wbHVzLyNyaXNrLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrUmVhc29uXG4gICAgICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gZXhwbGFpbmluZyB0aGUgcmlzayBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvcG9zZWQgdHJhbnNhY3Rpb24gYW5kIHNvbWUgcmVjb21tZW5kZWQgYWN0aW9ucy4gVGhpcyBmaWVsZCBpcyBzdWJqZWN0IHRvIGNoYW5nZTsgYW55IHByb2dyYW1tYXRpYyBsb2dpYyBzaG91bGQgYmUgYmFzZWQgb24gdGhlIGBjb2RlYCBmaWVsZCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tSZWFzb25cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBPYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSBmb3IgdGhlIGRvY3VtZW50XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZSB7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBvZiB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlZCBieSB0aGUgZG9jdW1lbnQgbWV0YWRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgZG9jdW1lbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJpc2tTaWduYWxEb2N1bWVudFJlZmVyZW5jZVxuICAgICAqL1xuICAgIGRvY3VtZW50X25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxEb2N1bWVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgc3RhdHVzPzogUmlza1NpZ25hbERvY3VtZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2VcbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlPzogUmlza1NpZ25hbERvY3VtZW50VHlwZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Jpc2tTaWduYWxGaWxlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlXG4gICAgICovXG4gICAgZmlsZV90eXBlPzogUmlza1NpZ25hbEZpbGVUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogU3RhdHVzIG9mIGEgZG9jdW1lbnQgZm9yIHJpc2sgc2lnbmFsIGFuYWx5c2lzXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBSaXNrU2lnbmFsRG9jdW1lbnRTdGF0dXMge1xuICAgIFByb2Nlc3NpbmcgPSAnUFJPQ0VTU0lORycsXG4gICAgUHJvY2Vzc2luZ0NvbXBsZXRlID0gJ1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdFcnJvciA9ICdQUk9DRVNTSU5HX0VSUk9SJyxcbiAgICBQYXNzd29yZFByb3RlY3RlZCA9ICdQQVNTV09SRF9QUk9URUNURUQnLFxuICAgIFZpcnVzRGV0ZWN0ZWQgPSAnVklSVVNfREVURUNURUQnXG59XG5cbi8qKlxuICogVHlwZSBvZiBhIGRvY3VtZW50IGZvciByaXNrIHNpZ25hbCBhbmFseXNpc1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza1NpZ25hbERvY3VtZW50VHlwZSB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBCYW5rU3RhdGVtZW50ID0gJ0JBTktfU1RBVEVNRU5UJyxcbiAgICBCZW5lZml0c1N0YXRlbWVudCA9ICdCRU5FRklUU19TVEFURU1FTlQnLFxuICAgIEJ1c2luZXNzRmlsaW5nID0gJ0JVU0lORVNTX0ZJTElORycsXG4gICAgQ2hlY2sgPSAnQ0hFQ0snLFxuICAgIERyaXZpbmdMaWNlbnNlID0gJ0RSSVZJTkdfTElDRU5TRScsXG4gICAgRmluYW5jaWFsU3RhdGVtZW50ID0gJ0ZJTkFOQ0lBTF9TVEFURU1FTlQnLFxuICAgIEludm9pY2UgPSAnSU5WT0lDRScsXG4gICAgUGF5c2xpcCA9ICdQQVlTTElQJyxcbiAgICBTb2NpYWxTZWN1cml0eUNhcmQgPSAnU09DSUFMX1NFQ1VSSVRZX0NBUkQnLFxuICAgIFRheEZvcm0gPSAnVEFYX0ZPUk0nLFxuICAgIFV0aWxpdHlCaWxsID0gJ1VUSUxJVFlfQklMTCdcbn1cblxuLyoqXG4gKiBUaGUgZmlsZSB0eXBlIGZvciByaXNrIHNpZ25hbCBhbmFseXNpc1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gUmlza1NpZ25hbEZpbGVUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEltYWdlUGRmID0gJ0lNQUdFX1BERicsXG4gICAgU2Nhbk9jciA9ICdTQ0FOX09DUicsXG4gICAgVHJ1ZVBkZiA9ICdUUlVFX1BERicsXG4gICAgSW1hZ2UgPSAnSU1BR0UnLFxuICAgIE1peGVkUGFnZVBkZiA9ICdNSVhFRF9QQUdFX1BERicsXG4gICAgRW1wdHlQZGYgPSAnRU1QVFlfUERGJyxcbiAgICBGbGF0dGVuZWRQZGYgPSAnRkxBVFRFTkVEX1BERidcbn1cblxuLyoqXG4gKiBBRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JvbGVEZXRhaWx9XG4gICAgICogQG1lbWJlcm9mIFJvbGVcbiAgICAgKi9cbiAgICBST0xFX0RFVEFJTDogUm9sZURldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBSb2xlRGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZURldGFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BhcnR5Um9sZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFJvbGVEZXRhaWxcbiAgICAgKi9cbiAgICBQYXJ0eVJvbGVUeXBlOiBQYXJ0eVJvbGVUeXBlO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJvbGVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUm9sZXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSb2xlfVxuICAgICAqIEBtZW1iZXJvZiBSb2xlc1xuICAgICAqL1xuICAgIFJPTEU6IFJvbGU7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIHRyYW5zYWN0aW9uIHJlc3VsdCBhZnRlciBldmFsdWF0ZWQgYnkgdGhlIHJlcXVlc3RlZCBSdWxlc2V0LiBJZiBhIGBydWxlc2V0X2tleWAgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYmUgb21pdHRlZC4gVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YTsgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFJ1bGVzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSdWxlc2V0IHtcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IG9mIHRoZSBSdWxlc2V0IHVzZWQgZm9yIHRoaXMgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgUnVsZXNldFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBldmFsdWF0ZWQgb3V0Y29tZSBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gWW91IGNhbiBjb25maWd1cmUgYSBsaXN0IG9mIG91dGNvbWVzLCBzdWNoIGFzIFxcXCJhY2NlcHRcXFwiLCBcXFwicmV2aWV3XFxcIiwgYW5kIFxcXCJkZWNsaW5lXFxcIiB1c2luZyB0aGUgU2lnbmFsIGRhc2hib2FyZCBsb2NhdGVkIHdpdGhpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFJ1bGVzZXRcbiAgICAgKi9cbiAgICBvdXRjb21lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgaW5kaXZpZHVhbCBTTVMgdmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTTVNWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTTVNWZXJpZmljYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTTVNWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHN0YXR1czogU01TVmVyaWZpY2F0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhdHRlbXB0IGZpZWxkIGJlZ2lucyB3aXRoIDEgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIHN1YnNlcXVlbnQgU01TIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNNU1ZlcmlmaWNhdGlvblxuICAgICAqL1xuICAgIHBob25lX251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRlbGl2ZXJ5IGF0dGVtcHRzIG1hZGUgd2l0aGluIHRoZSB2ZXJpZmljYXRpb24gdG8gc2VuZCB0aGUgU01TIGNvZGUgdG8gdGhlIHVzZXIuIEVhY2ggZGVsaXZlcnkgYXR0ZW1wdCByZXByZXNlbnRzIHRoZSB1c2VyIHRha2luZyBhY3Rpb24gZnJvbSB0aGUgZnJvbnQgZW5kIFVJIHRvIHJlcXVlc3QgY3JlYXRpb24gYW5kIGRlbGl2ZXJ5IG9mIGEgbmV3IFNNUyB2ZXJpZmljYXRpb24gY29kZSwgb3IgdG8gcmVzZW5kIGFuIGV4aXN0aW5nIFNNUyB2ZXJpZmljYXRpb24gY29kZS4gVGhlcmUgaXMgYSBsaW1pdCBvZiAzIGRlbGl2ZXJ5IGF0dGVtcHRzIHBlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgZGVsaXZlcnlfYXR0ZW1wdF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgYXR0ZW1wdHMgbWFkZSBieSB0aGUgdXNlciB3aXRoaW4gdGhlIHZlcmlmaWNhdGlvbiB0byB2ZXJpZnkgdGhlIFNNUyBjb2RlIGJ5IGVudGVyaW5nIGl0IGludG8gdGhlIGZyb250IGVuZCBVSS4gVGhlcmUgaXMgYSBsaW1pdCBvZiAzIHNvbHZlIGF0dGVtcHRzIHBlciB2ZXJpZmljYXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgc29sdmVfYXR0ZW1wdF9jb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBpbml0aWFsbHlfc2VudF9hdDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU01TVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgbGFzdF9zZW50X2F0OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTTVNWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICByZWRhY3RlZF9hdDogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIG91dGNvbWUgc3RhdHVzIGZvciB0aGUgaW5kaXZpZHVhbCBTTVMgdmVyaWZpY2F0aW9uLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU01TVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCcsXG4gICAgQ2FuY2VsZWQgPSAnY2FuY2VsZWQnXG59XG5cbi8qKlxuICogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgdG8gd2hpY2ggdGhlIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuIElmIHByb3ZpZGVkLCB0aGlzIHdpbGwgb3ZlcnJpZGUgdGhlIFVSTCBzZXQgaW4gdGhlIGRhc2hib2FyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2tfb3ZlcnJpZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19maWVsZHM6IFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcztcbn1cbi8qKlxuICogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfaW5jb21lL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgd2ViaG9vayBjb2RlcyB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHRlc3RcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGUge1xuICAgIFVwZGF0ZSA9ICdCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURScsXG4gICAgQ29tcGxldGUgPSAnQkFOS19JTkNPTUVfUkVGUkVTSF9DT01QTEVURSdcbn1cblxuLyoqXG4gKiBPcHRpb25hbCBmaWVsZHMgd2hpY2ggd2lsbCBiZSBwb3B1bGF0ZWQgaW4gdGhlIHNpbXVsYXRlZCB3ZWJob29rXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rSW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0ZpZWxkcyB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgaWQgdG8gYmUgcmV0dXJuZWQgaW4gSU5DT01FIHdlYmhvb2tzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rRmllbGRzXG4gICAgICovXG4gICAgdXNlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5jb21lUmVmcmVzaENvbXBsZXRlUmVzdWx0fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua0luY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tGaWVsZHNcbiAgICAgKi9cbiAgICBiYW5rX2luY29tZV9yZWZyZXNoX2NvbXBsZXRlX3Jlc3VsdD86IEJhbmtJbmNvbWVSZWZyZXNoQ29tcGxldGVSZXN1bHQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCB0byB3aGljaCB0aGUgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vazogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIGJhbmsgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGJhbmtfdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYXN5bmNocm9ub3VzIGV2ZW50IHRvIGJlIHNpbXVsYXRlZC4gTWF5IGJlOiBgcG9zdGVkYCwgYGZhaWxlZGAsIG9yIGByZXZlcnNlZGAuICBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBldmVudCB0eXBlIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBjdXJyZW50IHRyYW5zZmVyIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGBwZW5kaW5nYCAtLT4gYGZhaWxlZGAgIGBwZW5kaW5nYCAtLT4gYHBvc3RlZGAgIGBwb3N0ZWRgIC0tPiBgcmV2ZXJzZWRgIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0JhbmtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IEJhbmtUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvY2FzaGZsb3dfdXBkYXRlcy91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGBzYW5kYm94L2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJdGVtIElEIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19DT01QTEVURWA6IFRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHN0YXR1cyBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuIElmIHRoZSB1c2VyIHVwbG9hZGVkIG11bHRpcGxlIGRvY3VtZW50cywgdGhpcyB3ZWJob29rIHdpbGwgZmlyZSB3aGVuIGFsbCBkb2N1bWVudHMgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nLiBDYWxsIHRoZSBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCBlbmRwb2ludCBhbmQgY2hlY2sgdGhlIGRvY3VtZW50IG1ldGFkYXRhIHRvIHNlZSB3aGljaCBkb2N1bWVudHMgd2VyZSBzdWNjZXNzZnVsbHkgcGFyc2VkLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUFJPQ0VTU0lOR19GQUlMRURgOiBBIGZhaWx1cmUgb2NjdXJyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIHByb2Nlc3MgdGhlIHZlcmlmaWNhdGlvbiBkb2N1bWVudGF0aW9uLiAgYFZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTGA6IChkZXByZWNhdGVkKSBUaGUgaW5jb21lIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSB1c2VyIGZvciByZXZpZXcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM/OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0VmVyaWZpY2F0aW9uU3RhdHVzRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveEluY29tZVdlYmhvb2tGaXJlUmVxdWVzdFdlYmhvb2tDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBTYW5kYm94SW5jb21lV2ViaG9va0ZpcmVSZXF1ZXN0V2ViaG9va0NvZGU7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIFByb2Nlc3NpbmdDb21wbGV0ZSA9ICdWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEUnLFxuICAgIFByb2Nlc3NpbmdGYWlsZWQgPSAnVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0ZBSUxFRCcsXG4gICAgUGVuZGluZ0FwcHJvdmFsID0gJ1ZFUklGSUNBVElPTl9TVEFUVVNfUEVORElOR19BUFBST1ZBTCdcbn1cblxuLyoqXG4gKiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pbmNvbWUvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSB3ZWJob29rIGNvZGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJbmNvbWVXZWJob29rRmlyZVJlcXVlc3RXZWJob29rQ29kZSB7XG4gICAgVmVyaWZpY2F0aW9uID0gJ0lOQ09NRV9WRVJJRklDQVRJT04nLFxuICAgIFZlcmlmaWNhdGlvblJpc2tTaWduYWxzID0gJ0lOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU/OiBXZWJob29rVHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBjb2RlcyB0aGF0IGNhbiBiZSBmaXJlZCBieSB0aGlzIHRlc3QgZW5kcG9pbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0V2ViaG9va0NvZGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0V2ViaG9va0NvZGVFbnVtIHtcbiAgICBEZWZhdWx0VXBkYXRlID0gJ0RFRkFVTFRfVVBEQVRFJyxcbiAgICBOZXdBY2NvdW50c0F2YWlsYWJsZSA9ICdORVdfQUNDT1VOVFNfQVZBSUxBQkxFJyxcbiAgICBTbXNNaWNyb2RlcG9zaXRzVmVyaWZpY2F0aW9uID0gJ1NNU19NSUNST0RFUE9TSVRTX1ZFUklGSUNBVElPTicsXG4gICAgQXV0aG9yaXphdGlvbkdyYW50ZWQgPSAnQVVUSE9SSVpBVElPTl9HUkFOVEVEJyxcbiAgICBQZW5kaW5nRGlzY29ubmVjdCA9ICdQRU5ESU5HX0RJU0NPTk5FQ1QnLFxuICAgIFJlY3VycmluZ1RyYW5zYWN0aW9uc1VwZGF0ZSA9ICdSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURScsXG4gICAgTG9naW5SZXBhaXJlZCA9ICdMT0dJTl9SRVBBSVJFRCcsXG4gICAgU3luY1VwZGF0ZXNBdmFpbGFibGUgPSAnU1lOQ19VUERBVEVTX0FWQUlMQUJMRScsXG4gICAgUHJvZHVjdFJlYWR5ID0gJ1BST0RVQ1RfUkVBRFknLFxuICAgIEVycm9yID0gJ0VSUk9SJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1GaXJlV2ViaG9va1Jlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBpcyBgdHJ1ZWAgIGlmIHRoZSB0ZXN0YCB3ZWJob29rX2NvZGVgICB3YXMgc3VjY2Vzc2Z1bGx5IGZpcmVkLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3ZWJob29rX2ZpcmVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtUmVzZXRMb2dpblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgY2FsbCBzdWNjZWVkZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXNldF9sb2dpbjogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB3aG9zZSB2ZXJpZmljYXRpb24gc3RhdHVzIGlzIHRvIGJlIG1vZGlmaWVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIHRvIHNldCB0aGUgYWNjb3VudCB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RcbiAgICAgKi9cbiAgICB2ZXJpZmljYXRpb25fc3RhdHVzOiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3RWZXJpZmljYXRpb25TdGF0dXNFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdFZlcmlmaWNhdGlvblN0YXR1c0VudW0ge1xuICAgIEF1dG9tYXRpY2FsbHlWZXJpZmllZCA9ICdhdXRvbWF0aWNhbGx5X3ZlcmlmaWVkJyxcbiAgICBWZXJpZmljYXRpb25FeHBpcmVkID0gJ3ZlcmlmaWNhdGlvbl9leHBpcmVkJ1xufVxuXG4vKipcbiAqIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2BcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYHNhbmRib3gvb2F1dGgvc2VsZWN0X2FjY291bnRzYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdFxuICAgICAqL1xuICAgIG9hdXRoX3N0YXRlX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbmBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgY2FsbCBzdWNjZWVkZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlc3BvbnNlXG4gICAgICovXG4gICAgcmVzZXRfbG9naW46IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHBheW1lbnQgdG8gc2ltdWxhdGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdHVzIHRvIHNldCB0aGUgcGF5bWVudCB0by4gICBWYWxpZCBzdGF0dXNlcyBpbmNsdWRlOiAtIGBQQVlNRU5UX1NUQVRVU19JTklUSUFURURgIC0gYFBBWU1FTlRfU1RBVFVTX0lOU1VGRklDSUVOVF9GVU5EU2AgLSBgUEFZTUVOVF9TVEFUVVNfRkFJTEVEYCAtIGBQQVlNRU5UX1NUQVRVU19FWEVDVVRFRGAgLSBgUEFZTUVOVF9TVEFUVVNfU0VUVExFRGAgLSBgUEFZTUVOVF9TVEFUVVNfQ0FOQ0VMTEVEYCAtIGBQQVlNRU5UX1NUQVRVU19SRUpFQ1RFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1czogc3RyaW5nO1xufVxuLyoqXG4gKiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFBheW1lbnRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9sZF9zdGF0dXM6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXdfc3RhdHVzOiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRTdGF0dXM7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIHNldCBvZiBvcHRpb25zIHRvIGJlIHVzZWQgd2hlbiBjb25maWd1cmluZyB0aGUgSXRlbS4gSWYgc3BlY2lmaWVkLCBtdXN0IG5vdCBiZSBgbnVsbGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRlc3QgdXNlcm5hbWUgdG8gdXNlIGZvciB0aGUgY3JlYXRpb24gb2YgdGhlIFNhbmRib3ggSXRlbS4gRGVmYXVsdCB2YWx1ZSBpcyBgdXNlcl9nb29kYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIG92ZXJyaWRlX3VzZXJuYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZXN0IHBhc3N3b3JkIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHBhc3NfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV9wYXNzd29yZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgcHJvY2Vzc29yIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgYC9wcm9jZXNzb3IvYCBlbmRwb2ludHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBwcm9jZXNzb3JfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgaW5zdGl0dXRpb24gdGhlIEl0ZW0gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGhcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5zdGl0dXRpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJvZHVjdHMgdG8gaW5pdGlhbGx5IHB1bGwgZm9yIHRoZSBJdGVtLiBNYXkgYmUgYW55IHByb2R1Y3RzIHRoYXQgdGhlIHNwZWNpZmllZCBgaW5zdGl0dXRpb25faWRgICBzdXBwb3J0cy4gVGhpcyBhcnJheSBtYXkgbm90IGJlIGVtcHR5LlxuICAgICAqIEB0eXBlIHtBcnJheTxQcm9kdWN0cz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWFsX3Byb2R1Y3RzOiBBcnJheTxQcm9kdWN0cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyBvcHRpb25zIGZvciBCYW5rIEluY29tZS4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheSBhbmQgYGJhbmtgIGlzIHNwZWNpZmllZCBpbiBgaW5jb21lX3NvdXJjZV90eXBlc2AuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBvZiBkYXRhIHRvIHJlcXVlc3QgZm9yIHRoZSBCYW5rIEluY29tZSBwcm9kdWN0XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdEluY29tZVZlcmlmaWNhdGlvbkJhbmtJbmNvbWVcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgc2V0IG9mIG9wdGlvbnMgdG8gYmUgdXNlZCB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBJdGVtLiBJZiBzcGVjaWZpZWQsIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSBhIHdlYmhvb2sgdG8gYXNzb2NpYXRlIHdpdGggdGhlIG5ldyBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUZXN0IHVzZXJuYW1lIHRvIHVzZSBmb3IgdGhlIGNyZWF0aW9uIG9mIHRoZSBTYW5kYm94IEl0ZW0uIERlZmF1bHQgdmFsdWUgaXMgYHVzZXJfZ29vZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBvdmVycmlkZV91c2VybmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGVzdCBwYXNzd29yZCB0byB1c2UgZm9yIHRoZSBjcmVhdGlvbiBvZiB0aGUgU2FuZGJveCBJdGVtLiBEZWZhdWx0IHZhbHVlIGlzIGBwYXNzX2dvb2RgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb3ZlcnJpZGVfcGFzc3dvcmQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9ucztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIHN0YXRlbWVudHM/OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1N0YXRlbWVudHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNvbWVfdmVyaWZpY2F0aW9uPzogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb247XG59XG4vKipcbiAqIEEgc2V0IG9mIHBhcmFtZXRlcnMgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gb3B0aW9ucy4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgaXMgaW5jbHVkZWQgaW4gdGhlIGBpbml0aWFsX3Byb2R1Y3RzYCBhcnJheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc0luY29tZVZlcmlmaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGVzIG9mIHNvdXJjZSBpbmNvbWUgZGF0YSB0aGF0IHVzZXJzIHdpbGwgYmUgcGVybWl0dGVkIHRvIHNoYXJlLiBPcHRpb25zIGluY2x1ZGUgYGJhbmtgIGFuZCBgcGF5cm9sbGAuIEN1cnJlbnRseSB5b3UgY2FuIG9ubHkgc3BlY2lmeSBvbmUgb2YgdGhlc2Ugb3B0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8SW5jb21lVmVyaWZpY2F0aW9uU291cmNlVHlwZT59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zSW5jb21lVmVyaWZpY2F0aW9uXG4gICAgICovXG4gICAgaW5jb21lX3NvdXJjZV90eXBlcz86IEFycmF5PEluY29tZVZlcmlmaWNhdGlvblNvdXJjZVR5cGU+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0SW5jb21lVmVyaWZpY2F0aW9uQmFua0luY29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNJbmNvbWVWZXJpZmljYXRpb25cbiAgICAgKi9cbiAgICBiYW5rX2luY29tZT86IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RJbmNvbWVWZXJpZmljYXRpb25CYW5rSW5jb21lO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHN0YXRlbWVudHMgb3B0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggc3RhdGVtZW50cyBoaXN0b3J5LiBEYXRlcyBzaG91bGQgYmUgZm9ybWF0dGVkIGFzIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNTdGF0ZW1lbnRzXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtb3N0IHJlY2VudCBkYXRlIGZvciB3aGljaCB0byBmZXRjaCBzdGF0ZW1lbnRzIGhpc3RvcnkuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1N0YXRlbWVudHNcbiAgICAgKi9cbiAgICBlbmRfZGF0ZTogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBzZXQgb2YgcGFyYW1ldGVycyBjb3JyZXNwb25kaW5nIHRvIHRyYW5zYWN0aW9ucyBvcHRpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0T3B0aW9uc1RyYW5zYWN0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbW9zdCByZWNlbnQgZGF0ZSBmb3Igd2hpY2ggdG8gZmV0Y2ggdHJhbnNhY3Rpb24gaGlzdG9yeS4gRGF0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3RPcHRpb25zVHJhbnNhY3Rpb25zXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIGRheXMgb2YgdHJhbnNhY3Rpb24gaGlzdG9yeSB0byByZXF1ZXN0IGZvciB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdE9wdGlvbnNUcmFuc2FjdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbn1cbi8qKlxuICogU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBwdWJsaWMgdG9rZW4gdGhhdCBjYW4gYmUgZXhjaGFuZ2VkIGZvciBhbiBhY2Nlc3MgdG9rZW4gdXNpbmcgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHB1YmxpY190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIHRvIHdoaWNoIHRoZSB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZS4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgb25seSB0aGUgcGVuZGluZyBiYWxhbmNlIHRoYXQgaXMgZHVlIGJlZm9yZSB0aGUgYHZpcnR1YWxfdGltZXN0YW1wYCBvbiB0aGUgdGVzdCBjbG9jayB3aWxsIGJlIGNvbnZlcnRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgdG8gd2hpY2ggYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlclN3ZWVwU2ltdWxhdGVFdmVudFR5cGV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJMZWRnZXJTd2VlcFNpbXVsYXRlRXZlbnRUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGByZWZ1bmQucG9zdGVkYCwgYHJlZnVuZC5zZXR0bGVkYCwgYHJlZnVuZC5mYWlsZWRgLCBvciBgcmVmdW5kLnJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgcmVmdW5kIHN0YXR1cy4gQ29tcGF0aWJsZSBzdGF0dXMgLS0+IGV2ZW50IHR5cGUgdHJhbnNpdGlvbnMgaW5jbHVkZTogIGByZWZ1bmQucGVuZGluZ2AgLS0+IGByZWZ1bmQuZmFpbGVkYCAgYHJlZnVuZC5wZW5kaW5nYCAtLT4gYHJlZnVuZC5wb3N0ZWRgICBgcmVmdW5kLnBvc3RlZGAgLS0+IGByZWZ1bmQucmV0dXJuZWRgICBgcmVmdW5kLnBvc3RlZGAgLS0+IGByZWZ1bmQuc2V0dGxlZGAgIGByZWZ1bmQucG9zdGVkYCBldmVudHMgY2FuIG9ubHkgYmUgc2ltdWxhdGVkIGlmIHRoZSByZWZ1bmRlZCB0cmFuc2ZlciBoYXMgYmVlbiB0cmFuc2l0aW9uZWQgdG8gc2V0dGxlZC4gVGhpcyBtaW1pY3MgdGhlIG9yZGVyaW5nIG9mIGV2ZW50cyBpbiBQcm9kdWN0aW9uLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBldmVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZmFpbHVyZV9yZWFzb24/OiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHdlYmhvb2s/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBJZiBwcm92aWRlZCwgdGhlIGV2ZW50IHRvIGJlIHNpbXVsYXRlZCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBgZnVuZHNfYXZhaWxhYmxlYCwgb3IgYHJldHVybmVkYC4gIEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV2ZW50IHR5cGUgaXMgaW5jb21wYXRpYmxlIHdpdGggdGhlIGN1cnJlbnQgdHJhbnNmZXIgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHBlbmRpbmdgIC0tPiBgZmFpbGVkYCAgYHBlbmRpbmdgIC0tPiBgcG9zdGVkYCAgYHBvc3RlZGAgLS0+IGByZXR1cm5lZGAgIGBwb3N0ZWRgIC0tPiBgc2V0dGxlZGAgIGBzZXR0bGVkYCAtLT4gYGZ1bmRzX2F2YWlsYWJsZWAgKG9ubHkgYXBwbGljYWJsZSB0byBBQ0ggZGViaXRzLikgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgdG8gd2hpY2ggYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBzaG91bGQgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3ZWJob29rPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay4gSWYgcHJvdmlkZWQsIHRoZSBzd2VlcCB0byBiZSBzaW11bGF0ZWQgaXMgY3JlYXRlZCBvbiB0aGUgZGF5IG9mIHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgYHRlc3RfY2xvY2tgLiBJZiB0aGUgZGF0ZSBvZiBgdmlydHVhbF90aW1lYCBpcyBvbiB3ZWVrZW5kIG9yIGEgZmVkZXJhbCBob2xpZGF5LCB0aGUgbmV4dCBhdmFpbGFibGUgYmFua2luZyBkYXkgaXMgdXNlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJob29rIFVSTCB0byB3aGljaCBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIHNob3VsZCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvc3dlZXAvc2ltdWxhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpbXVsYXRlZFRyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwPzogU2ltdWxhdGVkVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ld192aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHZpcnR1YWwgdGltZXN0YW1wIG9uIHRoZSB0ZXN0IGNsb2NrLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IHRpbWVzdGFtcCB3aWxsIGJlIHVzZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB2aXJ0dWFsX3RpbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVGVzdENsb2NrfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2s6IFRyYW5zZmVyVGVzdENsb2NrO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdGVzdCBjbG9jay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVGVzdENsb2NrfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRlc3RfY2xvY2s6IFRyYW5zZmVyVGVzdENsb2NrO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGFydCB2aXJ0dWFsIHRpbWVzdGFtcCBvZiB0ZXN0IGNsb2NrcyB0byByZXR1cm4uIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIHZpcnR1YWwgdGltZXN0YW1wIG9mIHRlc3QgY2xvY2tzIHRvIHJldHVybi4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdmlydHVhbF90aW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGVzdCBjbG9ja3MgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+fVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0ZXN0X2Nsb2NrczogQXJyYXk8VHJhbnNmZXJUZXN0Q2xvY2s+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBgaXRlbV9pZGBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciB0byBiZSByZXNldC4gIElmIGVtcHR5IG9yIGBudWxsYCwgdGhpcyBmaWVsZCB3aWxsIGRlZmF1bHQgdG8gcmVzZXR0aW5nIGFsbCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3RcbiAgICAgKi9cbiAgICBpdGVtX2lkcz86IEFycmF5PHN0cmluZz4gfCBudWxsO1xufVxuLyoqXG4gKiBTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhbmRib3hVc2VyUmVzZXRMb2dpblJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2FuZGJveFVzZXJSZXNldExvZ2luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzY29wZXMgb2JqZWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjb3Blc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1Byb2R1Y3RBY2Nlc3N9XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIHByb2R1Y3RfYWNjZXNzPzogUHJvZHVjdEFjY2VzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8QWNjb3VudEFjY2Vzcz59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8QWNjb3VudEFjY2Vzcz47XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIG5ld2x5IG9wZW5lZCBhY2NvdW50cyBhcyB0aGV5IGFyZSBvcGVuZWQuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc1xuICAgICAqL1xuICAgIG5ld19hY2NvdW50cz86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBBbiBpbmRpY2F0b3IgZm9yIHdoZW4gc2NvcGVzIGFyZSBiZWluZyB1cGRhdGVkLiBXaGVuIHNjb3BlcyBhcmUgdXBkYXRlZCB2aWEgZW5yb2xsbWVudCAoaS5lLiBPQXV0aCksIHRoZSBwYXJ0bmVyIG11c3Qgc2VuZCBgRU5ST0xMTUVOVGAuIFdoZW4gc2NvcGVzIGFyZSB1cGRhdGVkIGluIGEgcG9zdC1lbnJvbGxtZW50IHZpZXcsIHRoZSBwYXJ0bmVyIG11c3Qgc2VuZCBgUE9SVEFMYC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNjb3Blc0NvbnRleHQge1xuICAgIEVucm9sbG1lbnQgPSAnRU5ST0xMTUVOVCcsXG4gICAgUG9ydGFsID0gJ1BPUlRBTCdcbn1cblxuLyoqXG4gKiBUaGUgc2NvcGVzIG9iamVjdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY29wZXNOdWxsYWJsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjb3Blc051bGxhYmxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UHJvZHVjdEFjY2Vzc31cbiAgICAgKiBAbWVtYmVyb2YgU2NvcGVzTnVsbGFibGVcbiAgICAgKi9cbiAgICBwcm9kdWN0X2FjY2Vzcz86IFByb2R1Y3RBY2Nlc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRBY2Nlc3M+fVxuICAgICAqIEBtZW1iZXJvZiBTY29wZXNOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnRzPzogQXJyYXk8QWNjb3VudEFjY2Vzcz47XG4gICAgLyoqXG4gICAgICogQWxsb3cgYWNjZXNzIHRvIG5ld2x5IG9wZW5lZCBhY2NvdW50cyBhcyB0aGV5IGFyZSBvcGVuZWQuIElmIHVuc2V0LCBkZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNjb3Blc051bGxhYmxlXG4gICAgICovXG4gICAgbmV3X2FjY291bnRzPzogYm9vbGVhbiB8IG51bGw7XG59XG4vKipcbiAqIEFuYWx5c2lzIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgd2h5IGEgc2NyZWVuaW5nIGhpdCBtYXRjaGVkIHRoZSBwcm92aWRlZCB1c2VyIGluZm9ybWF0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0QW5hbHlzaXMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGRhdGVzX29mX2JpcnRoPzogTWF0Y2hTdW1tYXJ5Q29kZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0QW5hbHlzaXNcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtNYXRjaFN1bW1hcnlDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIGxvY2F0aW9ucz86IE1hdGNoU3VtbWFyeUNvZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdEFuYWx5c2lzXG4gICAgICovXG4gICAgbmFtZXM/OiBNYXRjaFN1bW1hcnlDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBzY3JlZW5pbmdcXCdzIGBzZWFyY2hfdGVybXNgIHRoYXQgd2VyZSBjb21wYXJlZCB3aGVuIHRoZSBzY3JlZW5pbmcgaGl0IHdhcyBhZGRlZC4gc2NyZWVuaW5nIGhpdHMgYXJlIGltbXV0YWJsZSBvbmNlIHRoZXkgaGF2ZSBiZWVuIHJldmlld2VkLiBJZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZCBkdWUgdG8gdXBkYXRlcyB0byB0aGUgc2NyZWVuaW5nXFwncyBgc2VhcmNoX3Rlcm1zYCwgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbSwgb3IgdGhlIGxpc3RcXCdzIHNvdXJjZSBkYXRhIHByaW9yIHRvIHJldmlldywgdGhlIHNjcmVlbmluZyBoaXQgd2lsbCBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgdGhvc2UgY2hhbmdlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXRBbmFseXNpc1xuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtc192ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0RGF0YSB7XG4gICAgLyoqXG4gICAgICogRGF0ZXMgb2YgYmlydGggYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkYXRlc19vZl9iaXJ0aD86IEFycmF5PFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbT47XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBkb2N1bWVudHM/OiBBcnJheTxTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtcz47XG4gICAgLyoqXG4gICAgICogTG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2F0Y2hsaXN0IGhpdFxuICAgICAqIEB0eXBlIHtBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz59XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdERhdGFcbiAgICAgKi9cbiAgICBsb2NhdGlvbnM/OiBBcnJheTxHZW5lcmljU2NyZWVuaW5nSGl0TG9jYXRpb25JdGVtcz47XG4gICAgLyoqXG4gICAgICogTmFtZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YXRjaGxpc3QgaGl0XG4gICAgICogQHR5cGUge0FycmF5PFNjcmVlbmluZ0hpdE5hbWVzSXRlbXM+fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREYXRhXG4gICAgICovXG4gICAgbmFtZXM/OiBBcnJheTxTY3JlZW5pbmdIaXROYW1lc0l0ZW1zPjtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZGF0ZSBvZiBiaXJ0aCBmb3IgdGhlIGFzc29jaWF0ZWQgaGl0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERhdGVPZkJpcnRoSXRlbSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtXG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBNYXRjaFN1bW1hcnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RhdGVSYW5nZX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RGF0ZU9mQmlydGhJdGVtXG4gICAgICovXG4gICAgZGF0YT86IERhdGVSYW5nZTtcbn1cbi8qKlxuICogQW5hbHl6ZWQgZG9jdW1lbnQgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmVlbmluZ0hpdERvY3VtZW50c0l0ZW1zIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TWF0Y2hTdW1tYXJ5fVxuICAgICAqIEBtZW1iZXJvZiBTY3JlZW5pbmdIaXREb2N1bWVudHNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudH1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0RG9jdW1lbnRzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnQ7XG59XG4vKipcbiAqIEFuYWx5emVkIG5hbWUgaW5mb3JtYXRpb24gZm9yIHRoZSBhc3NvY2lhdGVkIGhpdFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTY3JlZW5pbmdIaXROYW1lc0l0ZW1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nSGl0TmFtZXNJdGVtcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01hdGNoU3VtbWFyeX1cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nSGl0TmFtZXNJdGVtc1xuICAgICAqL1xuICAgIGFuYWx5c2lzPzogTWF0Y2hTdW1tYXJ5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJbmRpdmlkdWFsU2NyZWVuaW5nSGl0TmFtZXN9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ0hpdE5hbWVzSXRlbXNcbiAgICAgKi9cbiAgICBkYXRhPzogSW5kaXZpZHVhbFNjcmVlbmluZ0hpdE5hbWVzO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIGluZGl2aWR1YWwgc2NyZWVuaW5nIHN0YXR1cyBoYXMgY2hhbmdlZCwgd2hpY2ggY2FuIG9jY3VyIG1hbnVhbGx5IHZpYSB0aGUgZGFzaGJvYXJkIG9yIGR1cmluZyBvbmdvaW5nIG1vbml0b3JpbmcuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBTQ1JFRU5JTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgU1RBVFVTX1VQREFURURgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNjcmVlbmluZ1N0YXR1c1VwZGF0ZWRXZWJob29rXG4gICAgICovXG4gICAgc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgU2NyZWVuaW5nU3RhdHVzVXBkYXRlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBDb250YWlucyBkZXRhaWxzIGFib3V0IGEgc2VjdXJpdHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWN1cml0eSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIFBsYWlkLXNwZWNpZmljIGlkZW50aWZpZXIgZm9yIHRoZSBzZWN1cml0eSwgdXNlZCB0byBhc3NvY2lhdGUgc2VjdXJpdGllcyB3aXRoIGhvbGRpbmdzLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGBzZWN1cml0eV9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuIFRoZSBgc2VjdXJpdHlfaWRgIG1heSBjaGFuZ2UgaWYgaW5oZXJlbnQgZGV0YWlscyBvZiB0aGUgc2VjdXJpdHkgY2hhbmdlIGR1ZSB0byBhIGNvcnBvcmF0ZSBhY3Rpb24sIGZvciBleGFtcGxlLCBpbiB0aGUgZXZlbnQgb2YgYSB0aWNrZXIgc3ltYm9sIGNoYW5nZSBvciBDVVNJUCBjaGFuZ2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBzZWN1cml0eV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDEyLWNoYXJhY3RlciBJU0lOLCBhIGdsb2JhbGx5IHVuaXF1ZSBzZWN1cml0aWVzIGlkZW50aWZpZXIuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2Ugc3RhcnQgdGhlIHZlcmlmaWNhdGlvbiBwcm9jZXNzIFtoZXJlXShodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNkOWFzSEVZRWZtZjhmeEpUSFpUQWZBelc0ZHVnc25TdS1IUzJKNTFmMW14d2Q2U3cvdmlld2Zvcm0pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNpbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIHN0YXJ0IHRoZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBbaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGN1c2lwOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2Vkb2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciBnaXZlbiB0byB0aGUgc2VjdXJpdHkgYnkgdGhlIGluc3RpdHV0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zZWN1cml0eV9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBgaW5zdGl0dXRpb25fc2VjdXJpdHlfaWRgIGlzIHByZXNlbnQsIHRoaXMgZmllbGQgaW5kaWNhdGVzIHRoZSBQbGFpZCBgaW5zdGl0dXRpb25faWRgIG9mIHRoZSBpbnN0aXR1dGlvbiB0byB3aG9tIHRoZSBpZGVudGlmaWVyIGJlbG9uZ3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbiBjZXJ0YWluIGNhc2VzLCBQbGFpZCB3aWxsIHByb3ZpZGUgdGhlIElEIG9mIGFub3RoZXIgc2VjdXJpdHkgd2hvc2UgcGVyZm9ybWFuY2UgcmVzZW1ibGVzIHRoaXMgc2VjdXJpdHksIHR5cGljYWxseSB3aGVuIHRoZSBvcmlnaW5hbCBzZWN1cml0eSBoYXMgbG93IHZvbHVtZSwgb3Igd2hlbiBhIHByaXZhdGUgc2VjdXJpdHkgY2FuIGJlIG1vZGVsZWQgd2l0aCBhIHB1YmxpY2x5IHRyYWRlZCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHByb3h5X3NlY3VyaXR5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpdmUgbmFtZSBmb3IgdGhlIHNlY3VyaXR5LCBzdWl0YWJsZSBmb3IgZGlzcGxheS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIG5hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHRpY2tlcl9zeW1ib2w6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHRoYXQgYSBzZWN1cml0eSBpcyBhIGhpZ2hseSBsaXF1aWQgYXNzZXQgYW5kIGNhbiBiZSB0cmVhdGVkIGxpa2UgY2FzaC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBpc19jYXNoX2VxdWl2YWxlbnQ6IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZWN1cml0eSB0eXBlIG9mIHRoZSBob2xkaW5nLiAgSW4gcmFyZSBpbnN0YW5jZXMsIGEgbnVsbCB2YWx1ZSBpcyByZXR1cm5lZCB3aGVuIGluc3RpdHV0aW9uYWwgZGF0YSBpcyBpbnN1ZmZpY2llbnQgdG8gZGV0ZXJtaW5lIHRoZSBzZWN1cml0eSB0eXBlLiAgVmFsaWQgc2VjdXJpdHkgdHlwZXMgYXJlOiAgYGNhc2hgOiBDYXNoLCBjdXJyZW5jeSwgYW5kIG1vbmV5IG1hcmtldCBmdW5kcyAgYGNyeXB0b2N1cnJlbmN5YDogRGlnaXRhbCBvciB2aXJ0dWFsIGN1cnJlbmNpZXMgIGBkZXJpdmF0aXZlYDogT3B0aW9ucywgd2FycmFudHMsIGFuZCBvdGhlciBkZXJpdmF0aXZlIGluc3RydW1lbnRzICBgZXF1aXR5YDogRG9tZXN0aWMgYW5kIGZvcmVpZ24gZXF1aXRpZXMgIGBldGZgOiBNdWx0aS1hc3NldCBleGNoYW5nZS10cmFkZWQgaW52ZXN0bWVudCBmdW5kcyAgYGZpeGVkIGluY29tZWA6IEJvbmRzIGFuZCBjZXJ0aWZpY2F0ZXMgb2YgZGVwb3NpdCAoQ0RzKSAgYGxvYW5gOiBMb2FucyBhbmQgbG9hbiByZWNlaXZhYmxlcyAgYG11dHVhbCBmdW5kYDogT3Blbi0gYW5kIGNsb3NlZC1lbmQgdmVoaWNsZXMgcG9vbGluZyBmdW5kcyBvZiBtdWx0aXBsZSBpbnZlc3RvcnMgIGBvdGhlcmA6IFVua25vd24gb3Igb3RoZXIgaW52ZXN0bWVudCB0eXBlc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgdHlwZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQcmljZSBvZiB0aGUgc2VjdXJpdHkgYXQgdGhlIGNsb3NlIG9mIHRoZSBwcmV2aW91cyB0cmFkaW5nIHNlc3Npb24uIE51bGwgZm9yIG5vbi1wdWJsaWMgc2VjdXJpdGllcy4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGZvcmVpZ24gY3VycmVuY3kgdGhpcyBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgZGFpbHkgYW5kIHdpbGwgYmUgcHJpY2VkIGluIFVTRC4gIElmIHRoZSBzZWN1cml0eSBpcyBhIGNyeXB0b2N1cnJlbmN5LCB0aGlzIGZpZWxkIHdpbGwgYmUgdXBkYXRlZCBtdWx0aXBsZSB0aW1lcyBhIGRheS4gQXMgY3J5cHRvIHByaWNlcyBjYW4gZmx1Y3R1YXRlIHF1aWNrbHkgYW5kIGRhdGEgbWF5IGJlY29tZSBzdGFsZSBzb29uZXIgdGhhbiBvdGhlciBhc3NldCBjbGFzc2VzLCByZWZlciB0byBgdXBkYXRlX2RhdGV0aW1lYCB3aXRoIHRoZSB0aW1lIHdoZW4gdGhlIHByaWNlIHdhcyBsYXN0IHVwZGF0ZWQuIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgY2xvc2VfcHJpY2U6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBmb3Igd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZS4gQWx3YXlzIGBudWxsYCBpZiBgY2xvc2VfcHJpY2VgIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGNsb3NlX3ByaWNlX2FzX29mOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgYXQgd2hpY2ggYGNsb3NlX3ByaWNlYCBpcyBhY2N1cmF0ZSwgaW4gSVNPIDg2MDEgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikuIEFsd2F5cyBgbnVsbGAgaWYgYGNsb3NlX3ByaWNlYCBpcyBgbnVsbGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICB1cGRhdGVfZGF0ZXRpbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBwcmljZSBnaXZlbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3VyaXR5LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTEwMzgzIE1hcmtldCBJZGVudGlmaWVyIENvZGUgb2YgdGhlIGV4Y2hhbmdlIG9yIG1hcmtldCBpbiB3aGljaCB0aGUgc2VjdXJpdHkgaXMgYmVpbmcgdHJhZGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgbWFya2V0X2lkZW50aWZpZXJfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VjdG9yIGNsYXNzaWZpY2F0aW9uIG9mIHRoZSBzZWN1cml0eSwgc3VjaCBhcyBGaW5hbmNlLCBIZWFsdGggVGVjaG5vbG9neSwgZXRjLiAgRm9yIGEgY29tcGxldGUgbGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXMsIHBsZWFzZSByZWZlciB0byB0aGUgW1xcXCJTZWN0b3JzIGFuZCBJbmR1c3RyaWVzXFxcIiBzcHJlYWRzaGVldF0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMUw3YVhVZHFMaHhnTThxZTdoSzY3cXFLWGlVZFFxSUxwd1owTHB4dkNWbmMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgc2VjdG9yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBpbmR1c3RyeSBjbGFzc2lmaWNhdGlvbiBvZiB0aGUgc2VjdXJpdHksIHN1Y2ggYXMgQmlvdGVjaG5vbG9neSwgQWlybGluZXMsIGV0Yy4gIEZvciBhIGNvbXBsZXRlIGxpc3Qgb2YgcG9zc2libGUgdmFsdWVzLCBwbGVhc2UgcmVmZXIgdG8gdGhlIFtcXFwiU2VjdG9ycyBhbmQgSW5kdXN0cmllc1xcXCIgc3ByZWFkc2hlZXRdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL3NwcmVhZHNoZWV0cy9kLzFMN2FYVWRxTGh4Z004cWU3aEs2N3FxS1hpVWRRcUlMcHdaMExweHZDVm5jKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eVxuICAgICAqL1xuICAgIGluZHVzdHJ5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcHRpb25Db250cmFjdH1cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlcbiAgICAgKi9cbiAgICBvcHRpb25fY29udHJhY3Q6IE9wdGlvbkNvbnRyYWN0IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Rml4ZWRJbmNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5XG4gICAgICovXG4gICAgZml4ZWRfaW5jb21lOiBGaXhlZEluY29tZSB8IG51bGw7XG59XG4vKipcbiAqIFNwZWNpZnkgdGhlIHNlY3VyaXR5IGFzc29jaWF0ZWQgd2l0aCB0aGUgaG9sZGluZyBvciBpbnZlc3RtZW50IHRyYW5zYWN0aW9uLiBXaGVuIGlucHV0dGluZyBjdXN0b20gc2VjdXJpdHkgZGF0YSB0byB0aGUgU2FuZGJveCwgUGxhaWQgd2lsbCBwZXJmb3JtIHBvc3QtZGF0YS1yZXRyaWV2YWwgbm9ybWFsaXphdGlvbiBhbmQgZW5yaWNobWVudC4gVGhlc2UgcHJvY2Vzc2VzIG1heSBjYXVzZSB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgU2FuZGJveCB0byBiZSBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSB0aGUgZGF0YSB5b3UgaW5wdXQuIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgYW5kIGEgc2VjdXJpdHkgaWRlbnRpZmllciAoYHRpY2tlcl9zeW1ib2xgLCBgY3VzaXBgLCBgaXNpbmAsIG9yIGBzZWRvbGApIGFyZSByZXF1aXJlZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VjdXJpdHlPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlY3VyaXR5T3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIDEyLWNoYXJhY3RlciBJU0lOLCBhIGdsb2JhbGx5IHVuaXF1ZSBzZWN1cml0aWVzIGlkZW50aWZpZXIuIEEgdmVyaWZpZWQgQ1VTSVAgR2xvYmFsIFNlcnZpY2VzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gcmVjZWl2ZSB0aGlzIGRhdGEuIFRoaXMgZmllbGQgd2lsbCBiZSBudWxsIGJ5IGRlZmF1bHQgZm9yIG5ldyBjdXN0b21lcnMsIGFuZCBudWxsIGZvciBleGlzdGluZyBjdXN0b21lcnMgc3RhcnRpbmcgTWFyY2ggMTIsIDIwMjQuIElmIHlvdSB3b3VsZCBsaWtlIGFjY2VzcyB0byB0aGlzIGZpZWxkLCBwbGVhc2UgW3JlcXVlc3QgSVNJTi9DVVNJUCBhY2Nlc3MgaGVyZV0oaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZm9ybXMvZC9lLzFGQUlwUUxTZDlhc0hFWUVmbWY4ZnhKVEhaVEFmQXpXNGR1Z3NuU3UtSFMySjUxZjFteHdkNlN3L3ZpZXdmb3JtKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgaXNpbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiA5LWNoYXJhY3RlciBDVVNJUCwgYW4gaWRlbnRpZmllciBhc3NpZ25lZCB0byBOb3J0aCBBbWVyaWNhbiBzZWN1cml0aWVzLiBBIHZlcmlmaWVkIENVU0lQIEdsb2JhbCBTZXJ2aWNlcyBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIHJlY2VpdmUgdGhpcyBkYXRhLiBUaGlzIGZpZWxkIHdpbGwgYmUgbnVsbCBieSBkZWZhdWx0IGZvciBuZXcgY3VzdG9tZXJzLCBhbmQgbnVsbCBmb3IgZXhpc3RpbmcgY3VzdG9tZXJzIHN0YXJ0aW5nIE1hcmNoIDEyLCAyMDI0LiBJZiB5b3Ugd291bGQgbGlrZSBhY2Nlc3MgdG8gdGhpcyBmaWVsZCwgcGxlYXNlIFtyZXF1ZXN0IElTSU4vQ1VTSVAgYWNjZXNzIGhlcmVdKGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2Q5YXNIRVlFZm1mOGZ4SlRIWlRBZkF6VzRkdWdzblN1LUhTMko1MWYxbXh3ZDZTdy92aWV3Zm9ybSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1c2lwPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIDctY2hhcmFjdGVyIFNFRE9MLCBhbiBpZGVudGlmaWVyIGFzc2lnbmVkIHRvIHNlY3VyaXRpZXMgaW4gdGhlIFVLLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlY3VyaXR5T3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzZWRvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aXZlIG5hbWUgZm9yIHRoZSBzZWN1cml0eSwgc3VpdGFibGUgZm9yIGRpc3BsYXkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIG5hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHNlY3VyaXR54oCZcyB0cmFkaW5nIHN5bWJvbCBmb3IgcHVibGljbHkgdHJhZGVkIHNlY3VyaXRpZXMsIGFuZCBvdGhlcndpc2UgYSBzaG9ydCBpZGVudGlmaWVyIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZWN1cml0eU92ZXJyaWRlXG4gICAgICovXG4gICAgdGlja2VyX3N5bWJvbD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBFaXRoZXIgYSB2YWxpZCBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VjdXJpdHlPdmVycmlkZVxuICAgICAqL1xuICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBIaWdoIGxldmVsIGRlc2NyaXB0aW9ucyBvZiBob3cgdGhlIGFzc29jaWF0ZWQgc2VsZmllIHdhcyBwcm9jZXNzZWQuIElmIGEgc2VsZmllIGZhaWxzIHZlcmlmaWNhdGlvbiwgdGhlIGRldGFpbHMgaW4gdGhlIGBhbmFseXNpc2Agb2JqZWN0IHNob3VsZCBoZWxwIGNsYXJpZnkgd2h5IHRoZSBzZWxmaWUgd2FzIHJlamVjdGVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlbGZpZUFuYWx5c2lzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb259XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzXG4gICAgICovXG4gICAgZG9jdW1lbnRfY29tcGFyaXNvbjogU2VsZmllQW5hbHlzaXNEb2N1bWVudENvbXBhcmlzb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzTGl2ZW5lc3NDaGVja31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNcbiAgICAgKi9cbiAgICBsaXZlbmVzc19jaGVjazogU2VsZmllQW5hbHlzaXNMaXZlbmVzc0NoZWNrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc1xuICAgICAqL1xuICAgIGZhY2lhbF9hbmFseXNpcz86IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXMgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBzZWxmaWUgYW5kIHRoZSBkb2N1bWVudCAoaWYgZG9jdW1lbnRhcnkgdmVyaWZpY2F0aW9uIGFsc28gcmFuKS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlbGZpZUFuYWx5c2lzRG9jdW1lbnRDb21wYXJpc29uIHtcbiAgICBNYXRjaCA9ICdtYXRjaCcsXG4gICAgTm9NYXRjaCA9ICdub19tYXRjaCcsXG4gICAgTm9JbnB1dCA9ICdub19pbnB1dCdcbn1cblxuLyoqXG4gKiBBbmFseXNpcyBvZiB0aGUgZmFjaWFsIGZlYXR1cmVzIG9mIHRoZSBzZWxmaWUgd2hlbiBjb21wYXJlZCB0byB0aGUgZmFjZSBpbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnQsIGlmIG9uZSBpcyBwcmVzZW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9leWU6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIHJpZ2h0X2V5ZTogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9icm93OiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICByaWdodF9icm93OiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBmb3JlaGVhZDogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbWlkZGxlX2ZvcmVoZWFkOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBub3NlOiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNcbiAgICAgKi9cbiAgICBwaGlsdHJ1bTogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbW91dGg6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZX1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc1xuICAgICAqL1xuICAgIGphdzogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgbGVmdF9jaGVlazogU2VsZmllQW5hbHlzaXNGYWNpYWxBbmFseXNpc091dGNvbWU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzXG4gICAgICovXG4gICAgcmlnaHRfY2hlZWs6IFNlbGZpZUFuYWx5c2lzRmFjaWFsQW5hbHlzaXNPdXRjb21lO1xufVxuLyoqXG4gKiBPdXRjb21lIG9mIHRoZSBmYWNpYWwgYW5hbHlzaXMgZm9yIGEgc3BlY2lmaWMgZmFjaWFsIGZlYXR1cmUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVBbmFseXNpc0ZhY2lhbEFuYWx5c2lzT3V0Y29tZSB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIEFzc2Vzc21lbnQgb2Ygd2hldGhlciB0aGUgc2VsZmllIGNhcHR1cmUgaXMgb2YgYSByZWFsIGh1bWFuIGJlaW5nLCBhcyBvcHBvc2VkIHRvIGEgcGljdHVyZSBvZiBhIGh1bWFuIG9uIGEgc2NyZWVuLCBhIHBpY3R1cmUgb2YgYSBwYXBlciBjdXQgb3V0LCBzb21lb25lIHdlYXJpbmcgYSBtYXNrLCBvciBhIGRlZXBmYWtlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2VsZmllQW5hbHlzaXNMaXZlbmVzc0NoZWNrIHtcbiAgICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnXG59XG5cbi8qKlxuICogVGhlIGltYWdlIG9yIHZpZGVvIGNhcHR1cmUgb2YgYSBzZWxmaWUuIE9ubHkgb25lIG9mIGltYWdlIG9yIHZpZGVvIFVSTCB3aWxsIGJlIHBvcHVsYXRlZCBwZXIgc2VsZmllLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZWxmaWVDYXB0dXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2FwdHVyZSB7XG4gICAgLyoqXG4gICAgICogVGVtcG9yYXJ5IFVSTCBmb3IgZG93bmxvYWRpbmcgYW4gaW1hZ2Ugc2VsZmllIGNhcHR1cmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2FwdHVyZVxuICAgICAqL1xuICAgIGltYWdlX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUZW1wb3JhcnkgVVJMIGZvciBkb3dubG9hZGluZyBhIHZpZGVvIHNlbGZpZSBjYXB0dXJlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNhcHR1cmVcbiAgICAgKi9cbiAgICB2aWRlb191cmw6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYmUgYG51bGxgIHVubGVzcyBgc3RlcHMuc2VsZmllX2NoZWNrYCBoYXMgcmVhY2hlZCBhIHRlcm1pbmFsIHN0YXRlIG9mIGVpdGhlciBgc3VjY2Vzc2Agb3IgYGZhaWxlZGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUNoZWNrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2sge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVDaGVja1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tcbiAgICAgKi9cbiAgICBzdGF0dXM6IFNlbGZpZUNoZWNrU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHNlbGZpZXMgc3VibWl0dGVkIHRvIHRoZSBgc2VsZmllX2NoZWNrYCBzdGVwLiBFYWNoIGVudHJ5IHJlcHJlc2VudHMgb25lIHVzZXIgc3VibWlzc2lvbi5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2VsZmllQ2hlY2tTZWxmaWU+fVxuICAgICAqIEBtZW1iZXJvZiBTZWxmaWVDaGVja1xuICAgICAqL1xuICAgIHNlbGZpZXM6IEFycmF5PFNlbGZpZUNoZWNrU2VsZmllPjtcbn1cbi8qKlxuICogQ2FwdHVyZXMgYW5kIGFuYWx5c2lzIGZyb20gYSB1c2VyXFwncyBzZWxmaWUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlbGZpZUNoZWNrU2VsZmllXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZmllQ2hlY2tTZWxmaWUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZWxmaWVTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgc3RhdHVzOiBTZWxmaWVTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIGBhdHRlbXB0YCBmaWVsZCBiZWdpbnMgd2l0aCAxIGFuZCBpbmNyZW1lbnRzIHdpdGggZWFjaCBzdWJzZXF1ZW50IHNlbGZpZSB1cGxvYWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2VsZmllQ2hlY2tTZWxmaWVcbiAgICAgKi9cbiAgICBhdHRlbXB0OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlbGZpZUNhcHR1cmV9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgY2FwdHVyZTogU2VsZmllQ2FwdHVyZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VsZmllQW5hbHlzaXN9XG4gICAgICogQG1lbWJlcm9mIFNlbGZpZUNoZWNrU2VsZmllXG4gICAgICovXG4gICAgYW5hbHlzaXM6IFNlbGZpZUFuYWx5c2lzO1xufVxuLyoqXG4gKiBUaGUgb3V0Y29tZSBzdGF0dXMgZm9yIHRoZSBhc3NvY2lhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbiBhdHRlbXB0XFwncyBgc2VsZmllX2NoZWNrYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLnNlbGZpZV9jaGVja2AuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVDaGVja1N0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIEFuIG91dGNvbWUgc3RhdHVzIGZvciB0aGlzIHNwZWNpZmljIHNlbGZpZS4gRGlzdGluY3QgZnJvbSB0aGUgb3ZlcmFsbCBgc2VsZmllX2NoZWNrLnN0YXR1c2AgdGhhdCBzdW1tYXJpemVzIHRoZSB2ZXJpZmljYXRpb24gb3V0Y29tZSBmcm9tIG9uZSBvciBtb3JlIHNlbGZpZXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTZWxmaWVTdGF0dXMge1xuICAgIFN1Y2Nlc3MgPSAnc3VjY2VzcycsXG4gICAgRmFpbGVkID0gJ2ZhaWxlZCdcbn1cblxuLyoqXG4gKiBBbiBvYmplY3QgY29udGFpbmluZyBhIEJBQ1MgYWNjb3VudCBudW1iZXIgYW5kIHNvcnQgY29kZS4gSWYgYW4gSUJBTiBpcyBub3QgcHJvdmlkZWQgb3IgaWYgdGhpcyByZWNpcGllbnQgbmVlZHMgdG8gYWNjZXB0IGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgQkFDUyBkYXRhIGlzIHJlcXVpcmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZW5kZXJCQUNTTnVsbGFibGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IG51bWJlciBvZiB0aGUgYWNjb3VudC4gTWF4aW11bSBvZiAxMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlbmRlckJBQ1NOdWxsYWJsZVxuICAgICAqL1xuICAgIGFjY291bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIDYtY2hhcmFjdGVyIHNvcnQgY29kZSBvZiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZW5kZXJCQUNTTnVsbGFibGVcbiAgICAgKi9cbiAgICBzb3J0X2NvZGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBkZXRhaWxzIHJlbGF0ZWQgdG8gYSBmdWxmaWxsbWVudCBzZXJ2aWNlIG9yIHByb2R1Y3QgaW4gdGVybXMgb2YgcmVxdWVzdCwgcHJvY2VzcyBhbmQgcmVzdWx0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1ZlcmlmaWNhdGlvbk9mQXNzZXR9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVQ6IFZlcmlmaWNhdGlvbk9mQXNzZXQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXR1c2VzfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlXG4gICAgICovXG4gICAgU1RBVFVTRVM6IFN0YXR1c2VzO1xufVxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgZGV0YWlscyByZWxhdGVkIHRvIGEgZnVsZmlsbG1lbnQgc2VydmljZSBvciBwcm9kdWN0IGluIHRlcm1zIG9mIHJlcXVlc3QsIHByb2Nlc3MgYW5kIHJlc3VsdC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UX0RFVEFJTDogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbDtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50RGV0YWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbCB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgdHlwZSBvZiBvcmRlciBWZXJpZmljYXRpb24gb2YgQXNzZXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudERldGFpbFxuICAgICAqL1xuICAgIFZlbmRvck9yZGVySWRlbnRpZmllcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXJ9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnREZXRhaWxcbiAgICAgKi9cbiAgICBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50SWRlbnRpZmllcjogU2VydmljZVByb2R1Y3RGdWxmaWxsbWVudElkZW50aWZpZXI7XG59XG4vKipcbiAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNlcnZpY2VQcm9kdWN0RnVsZmlsbG1lbnRJZGVudGlmaWVyIHtcbiAgICBWb2EgPSAnVk9BJyxcbiAgICBWb2UgPSAnVk9FJ1xufVxuXG4vKipcbiAqIFRoZSBhZGRyZXNzIG9mIHRoZSBzdHVkZW50IGxvYW4gc2VydmljZXIuIFRoaXMgaXMgZ2VuZXJhbGx5IHRoZSByZW1pdHRhbmNlIGFkZHJlc3MgdG8gd2hpY2ggcGF5bWVudHMgc2hvdWxkIGJlIHNlbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlckFkZHJlc3NEYXRhIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VyQWRkcmVzc0RhdGFcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MgRXhhbXBsZTogYFxcXCI1NjQgTWFpbiBTdHJlZXQsIEFQVCAxNVxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2VydmljZXJBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyAzMTY2LTEgYWxwaGEtMiBjb3VudHJ5IGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTZXJ2aWNlckFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdGhhdCBkZXNjcmliZSByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGZvciBzZXJ2aWNlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2VydmljZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZXJ2aWNlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2V9XG4gICAgICogQG1lbWJlcm9mIFNlcnZpY2VzXG4gICAgICovXG4gICAgU0VSVklDRTogU2VydmljZTtcbn1cbi8qKlxuICogRGF0YSBhYm91dCB0aGUgY29tcG9uZW50cyBjb21wcmlzaW5nIGFuIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEFkZHJlc3NEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsQWRkcmVzc0RhdGEge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVnaW9uIG9yIHN0YXRlIEV4YW1wbGU6IGBcXFwiTkNcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgcmVnaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBzdHJlZXQgYWRkcmVzcyBFeGFtcGxlOiBgXFxcIjU2NCBNYWluIFN0cmVldCwgQVBUIDE1XFxcImBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGVcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxBZGRyZXNzRGF0YVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEFkZHJlc3NEYXRhXG4gICAgICovXG4gICAgY291bnRyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IGRlY2lzaW9uIGZyb20gdGhlIHJpc2sgYXNzZXNzbWVudC4gIGBBUFBST1ZFYDogYXBwcm92ZSB0aGUgdHJhbnNhY3Rpb24gd2l0aG91dCByZXF1aXJpbmcgZnVydGhlciBhY3Rpb25zIGZyb20geW91ciBjdXN0b21lcnMuIEZvciBleGFtcGxlLCB1c2UgdGhpcyBmaWVsZCBpZiB5b3UgYXJlIHBsYWNpbmcgYSBzdGFuZGFyZCBob2xkIGZvciBhbGwgdGhlIGFwcHJvdmVkIHRyYW5zYWN0aW9ucyBiZWZvcmUgbWFraW5nIGZ1bmRzIGF2YWlsYWJsZSB0byB5b3VyIGN1c3RvbWVycy4gWW91IHNob3VsZCBhbHNvIHVzZSB0aGlzIGZpZWxkIGlmIHlvdSBkZWNpZGUgdG8gYWNjZWxlcmF0ZSB0aGUgZnVuZCBhdmFpbGFiaWxpdHkgZm9yIHlvdXIgY3VzdG9tZXJzLiAgYFJFVklFV2A6IHRoZSB0cmFuc2FjdGlvbiByZXF1aXJlcyBtYW51YWwgcmV2aWV3ICBgUkVKRUNUYDogcmVqZWN0IHRoZSB0cmFuc2FjdGlvbiAgYFRBS0VfT1RIRVJfUklTS19NRUFTVVJFU2A6IGZvciBleGFtcGxlLCBwbGFjaW5nIGEgbG9uZ2VyIGhvbGQgb24gZnVuZHMgdGhhbiB0aG9zZSBhcHByb3ZlZCB0cmFuc2FjdGlvbnMgb3IgaW50cm9kdWNpbmcgY3VzdG9tZXIgZnJpY3Rpb25zIHN1Y2ggYXMgc3RlcC11cCB2ZXJpZmljYXRpb24vYXV0aGVudGljYXRpb24gIGBOT1RfRVZBTFVBVEVEYDogaWYgb25seSBsb2dnaW5nIHRoZSBTaWduYWwgcmVzdWx0cyB3aXRob3V0IHVzaW5nIHRoZW0gIFBvc3NpYmxlIHZhbHVlczogIGBBUFBST1ZFYCwgYFJFVklFV2AsIGBSRUpFQ1RgLCBgVEFLRV9PVEhFUl9SSVNLX01FQVNVUkVTYCwgYE5PVF9FVkFMVUFURURgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsRGVjaXNpb25PdXRjb21lIHtcbiAgICBBcHByb3ZlID0gJ0FQUFJPVkUnLFxuICAgIFJldmlldyA9ICdSRVZJRVcnLFxuICAgIFJlamVjdCA9ICdSRUpFQ1QnLFxuICAgIFRha2VPdGhlclJpc2tNZWFzdXJlcyA9ICdUQUtFX09USEVSX1JJU0tfTUVBU1VSRVMnLFxuICAgIE5vdEV2YWx1YXRlZCA9ICdOT1RfRVZBTFVBVEVEJ1xufVxuXG4vKipcbiAqIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgYGNsaWVudF90cmFuc2FjdGlvbl9pZGAgc3VwcGxpZWQgd2hlbiBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgQUNIIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLiAgVGhpcyBmaWVsZCBtdXN0IGJlIHJldHVybmVkIGFzIGEgYm9vbGVhbi4gSWYgZm9ybWF0dGVkIGluY29ycmVjdGx5LCB0aGlzIHdpbGwgcmVzdWx0IGluIGFuIFtgSU5WQUxJRF9GSUVMRGBdKC9kb2NzL2Vycm9ycy9pbnZhbGlkLXJlcXVlc3QvI2ludmFsaWRfZmllbGQpIGVycm9yLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBpbml0aWF0ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIGFjdHVhbCBudW1iZXIgb2YgZGF5cyAoaG9sZCB0aW1lKSBzaW5jZSB0aGUgQUNIIGRlYml0IHRyYW5zYWN0aW9uIHRoYXQgeW91IHdhaXQgYmVmb3JlIG1ha2luZyBmdW5kcyBhdmFpbGFibGUgdG8geW91ciBjdXN0b21lcnMuIFRoZSBob2xkaW5nIHRpbWUgY291bGQgYWZmZWN0IHRoZSBBQ0ggcmV0dXJuIHJhdGUuICBGb3IgZXhhbXBsZSwgdXNlIDAgaWYgeW91IG1ha2UgZnVuZHMgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzIGluc3RhbnRseSBvciB0aGUgc2FtZSBkYXkgZm9sbG93aW5nIHRoZSBkZWJpdCB0cmFuc2FjdGlvbiwgb3IgMSBpZiB5b3UgbWFrZSBmdW5kcyBhdmFpbGFibGUgdGhlIG5leHQgZGF5IGZvbGxvd2luZyB0aGUgZGViaXQgaW5pdGlhbGl6YXRpb24uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgZGF5c19mdW5kc19vbl9ob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsRGVjaXNpb25PdXRjb21lfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWNpc2lvbl9vdXRjb21lPzogU2lnbmFsRGVjaXNpb25PdXRjb21lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsUGF5bWVudE1ldGhvZH1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgcGF5bWVudF9tZXRob2Q/OiBTaWduYWxQYXltZW50TWV0aG9kIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IChpbiBVU0QpIG1hZGUgYXZhaWxhYmxlIHRvIHlvdXIgY3VzdG9tZXJzIGluc3RhbnRseSBmb2xsb3dpbmcgdGhlIGRlYml0IHRyYW5zYWN0aW9uLiBJdCBjb3VsZCBiZSBhIHBhcnRpYWwgYW1vdW50IG9mIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb24gKGV4YW1wbGU6IDEwMi4wNSkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50X2luc3RhbnRseV9hdmFpbGFibGU/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERlY2lzaW9uUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERldGFpbHMgYWJvdXQgdGhlIGVuZCB1c2VyXFwncyBkZXZpY2UuIFdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgb3IgYC9zaWduYWwvcHJvY2Vzc29yL2V2YWx1YXRlYCwgdGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluY3JlYXNlIHRoZSBhY2N1cmFjeSBvZiBTaWduYWwgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRGV2aWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRoYXQgaW5pdGlhdGVkIHRoZSB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbERldmljZVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGFnZW50IG9mIHRoZSBkZXZpY2UgdGhhdCBpbml0aWF0ZWQgdGhlIHRyYW5zYWN0aW9uIChlLmcuIFxcXCJNb3ppbGxhLzUuMFxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjb3JlIGF0dHJpYnV0ZXMgb2JqZWN0IGNvbnRhaW5zIGFkZGl0aW9uYWwgZGF0YSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFzc2VzcyB0aGUgQUNIIHJldHVybiByaXNrLiBFeGFtcGxlcyBvZiBkYXRhIGluY2x1ZGU6ICBgZGF5c19zaW5jZV9maXJzdF9wbGFpZF9jb25uZWN0aW9uYDogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBmaXJzdCB0aW1lIHRoZSBJdGVtIHdhcyBjb25uZWN0ZWQgdG8gYW4gYXBwbGljYXRpb24gdmlhIFBsYWlkIGBwbGFpZF9jb25uZWN0aW9uc19jb3VudF83ZGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXMgYHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudGA6IFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgYGlzX3NhdmluZ3Nfb3JfbW9uZXlfbWFya2V0X2FjY291bnRgOiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgQUNIIHRyYW5zYWN0aW9uIGZ1bmRpbmcgYWNjb3VudCBpcyBhIHNhdmluZ3MvbW9uZXkgbWFya2V0IGFjY291bnQgIEZvciB0aGUgZnVsbCBsaXN0IGFuZCBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIG9mIGNvcmUgYXR0cmlidXRlcyBhdmFpbGFibGUsIG9yIHRvIHJlcXVlc3QgdGhhdCBjb3JlIGF0dHJpYnV0ZXMgbm90IGJlIHJldHVybmVkLCBjb250YWN0IFNhbGVzIG9yIHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzIHtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNyBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIHVuYXV0aG9yaXplZCB0cmFuc2FjdGlvbnMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHVuYXV0aG9yaXplZF90cmFuc2FjdGlvbnNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byB1bmF1dGhvcml6ZWQgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gdW5hdXRob3JpemVkIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCA3IGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdlIHBhcnNlIGFuZCBhbmFseXplIGhpc3RvcmljYWwgdHJhbnNhY3Rpb24gbWV0YWRhdGEgdG8gaWRlbnRpZnkgdGhlIG51bWJlciBvZiBwb3NzaWJsZSBwYXN0IHJldHVybnMgZHVlIHRvIG5vbi1zdWZmaWNpZW50IGZ1bmRzL292ZXJkcmFmdHMgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIG5zZl9vdmVyZHJhZnRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2UgcGFyc2UgYW5kIGFuYWx5emUgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbiBtZXRhZGF0YSB0byBpZGVudGlmeSB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIHBhc3QgcmV0dXJucyBkdWUgdG8gbm9uLXN1ZmZpY2llbnQgZnVuZHMvb3ZlcmRyYWZ0cyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgbnNmX292ZXJkcmFmdF90cmFuc2FjdGlvbnNfY291bnRfNjBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXZSBwYXJzZSBhbmQgYW5hbHl6ZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9uIG1ldGFkYXRhIHRvIGlkZW50aWZ5IHRoZSBudW1iZXIgb2YgcG9zc2libGUgcGFzdCByZXR1cm5zIGR1ZSB0byBub24tc3VmZmljaWVudCBmdW5kcy9vdmVyZHJhZnRzIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBuc2Zfb3ZlcmRyYWZ0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSB0aGUgZmlyc3QgdGltZSB0aGUgSXRlbSB3YXMgY29ubmVjdGVkIHRvIGFuIGFwcGxpY2F0aW9uIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2ZpcnN0X3BsYWlkX2Nvbm5lY3Rpb24/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcGxhaWRfY29ubmVjdGlvbnNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIEl0ZW0gaGFzIGJlZW4gY29ubmVjdGVkIHRvIGFwcGxpY2F0aW9ucyB2aWEgUGxhaWQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX2Nvbm5lY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB0aGUgSXRlbSBoYXMgYmVlbiBjb25uZWN0ZWQgdG8gYXBwbGljYXRpb25zIHZpYSBQbGFpZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0b3RhbF9wbGFpZF9jb25uZWN0aW9uc19jb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSBBQ0ggdHJhbnNhY3Rpb24gZnVuZGluZyBhY2NvdW50IGlzIGEgc2F2aW5ncy9tb25leSBtYXJrZXQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgaXNfc2F2aW5nc19vcl9tb25leV9tYXJrZXRfYWNjb3VudD86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAxMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGNyZWRpdCAoaW5mbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9jcmVkaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSA1MHRoIHBlcmNlbnRpbGUgb2YgYWxsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnRzIG92ZXIgdGhlIHBhc3QgMjggZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHA1MF9kZWJpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzI4ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDk1dGggcGVyY2VudGlsZSBvZiBhbGwgZGViaXQgKG91dGZsb3cpIHRyYW5zYWN0aW9uIGFtb3VudHMgb3ZlciB0aGUgcGFzdCAyOCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDk1X2RlYml0X3RyYW5zYWN0aW9uc19hbW91bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgd2l0aGluIHRoZSBwYXN0IDkwIGRheXMgd2hlbiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBoYWQgYSBuZWdhdGl2ZSBlbmQtb2YtZGF5IGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRheXNfd2l0aF9uZWdhdGl2ZV9iYWxhbmNlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDkwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDEwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQXZhaWxhYmxlIGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGF2YWlsYWJsZV9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDdXJyZW50IGJhbGFuY2UsIGFzIG9mIHRoZSBgYmFsYW5jZV9sYXN0X3VwZGF0ZWRgIHRpbWUuIFRoZSBjdXJyZW50IGJhbGFuY2UgaXMgdGhlIHRvdGFsIGFtb3VudCBvZiBmdW5kcyBpbiB0aGUgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgY3VycmVudF9iYWxhbmNlPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVEhIOm1tOnNzWikgaW5kaWNhdGluZyB0aGUgbGFzdCB0aW1lIHRoYXQgdGhlIGJhbGFuY2UgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhcyBiZWVuIHVwZGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGJhbGFuY2VfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfMjhkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBwaG9uZSBudW1iZXJzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgOTAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwaG9uZV9jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBhY2NvdW50XFwncyBlbWFpbCBhZGRyZXNzZXMgb24gZmlsZSBoYXZlIGNoYW5nZWQgb3ZlciB0aGUgcGFzdCAyOCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGVtYWlsX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGVtYWlsIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZW1haWxfY2hhbmdlX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYWNjb3VudFxcJ3MgYWRkcmVzc2VzIG9uIGZpbGUgaGF2ZSBjaGFuZ2VkIG92ZXIgdGhlIHBhc3QgMjggZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBhZGRyZXNzX2NoYW5nZV9jb3VudF8yOGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGFjY291bnRcXCdzIGFkZHJlc3NlcyBvbiBmaWxlIGhhdmUgY2hhbmdlZCBvdmVyIHRoZSBwYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgYWRkcmVzc19jaGFuZ2VfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBub24tT0F1dGggYXV0aGVudGljYXRpb24gYXR0ZW1wdHMgdmlhIFBsYWlkIGZvciB0aGlzIGJhbmsgYWNjb3VudCBvdmVyIHRoZSBwYXN0IDcgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygbm9uLU9BdXRoIGF1dGhlbnRpY2F0aW9uIGF0dGVtcHRzIHZpYSBQbGFpZCBmb3IgdGhpcyBiYW5rIGFjY291bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHBsYWlkX25vbl9vYXV0aF9hdXRoZW50aWNhdGlvbl9hdHRlbXB0c19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGZhaWxlZF9wbGFpZF9ub25fb2F1dGhfYXV0aGVudGljYXRpb25fYXR0ZW1wdHNfY291bnRfN2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZmFpbGVkIG5vbi1PQXV0aCBhdXRoZW50aWNhdGlvbiBhdHRlbXB0cyB2aWEgUGxhaWQgZm9yIHRoaXMgYmFuayBhY2NvdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBmYWlsZWRfcGxhaWRfbm9uX29hdXRoX2F1dGhlbnRpY2F0aW9uX2F0dGVtcHRzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8xMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDEwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzEwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDMwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDYwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZWJpdCAob3V0ZmxvdykgdHJhbnNhY3Rpb25zIG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRlYml0X3RyYW5zYWN0aW9uc19jb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgY3JlZGl0IChpbmZsb3cpIHRyYW5zYWN0aW9ucyBvdmVyIHRoZSBwYXN0IDkwIGRheXMgZnJvbSB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBjcmVkaXRfdHJhbnNhY3Rpb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCAzMCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgMzAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA2MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF82MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGRlYml0IChvdXRmbG93KSB0cmFuc2FjdGlvbiBhbW91bnQgb3ZlciB0aGUgcGFzdCA5MCBkYXlzIGZyb20gdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgdG90YWxfZGViaXRfdHJhbnNhY3Rpb25zX2Ftb3VudF85MGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBjcmVkaXQgKGluZmxvdykgdHJhbnNhY3Rpb24gYW1vdW50IG92ZXIgdGhlIHBhc3QgOTAgZGF5cyBmcm9tIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIHRvdGFsX2NyZWRpdF90cmFuc2FjdGlvbnNfYW1vdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDMwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDYwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBvdmVyIHRoZSBwYXN0IDkwIGRheXMgb2YgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcDUwX2VvZF9iYWxhbmNlXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDUwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwNTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDkwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwOTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSAzMSBhbmQgZGF5IDYwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfMzFkX3RvXzYwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIDEwdGggcGVyY2VudGlsZSBvZiB0aGUgZW5kLW9mLWRheSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIGRheSA2MSBhbmQgZGF5IDkwIG92ZXIgdGhlIHBhc3QgNjAgZGF5cyBvZiB0aGUgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwMTBfZW9kX2JhbGFuY2VfNjFkX3RvXzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGltZXN0YW1wIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERFRISDptbTpzc1opIGluZGljYXRpbmcgdGhlIGxhc3QgdGltZSB0aGF0IHRoZSB0cmFuc2FjdGlvbnMgZm9yIHRoZSBnaXZlbiBhY2NvdW50IGhhdmUgYmVlbiB1cGRhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnNfbGFzdF91cGRhdGVkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHJlY2VpdmVyIGJhbmsgYWNjb3VudCBpcyBjbG9zZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGlzX2FjY291bnRfY2xvc2VkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIHRoZSByZWNlaXZlciBiYW5rIGFjY291bnQgaXMgZWl0aGVyIGZyb3plbiBvciByZXN0cmljdGVkXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBpc19hY2NvdW50X2Zyb3plbl9vcl9yZXN0cmljdGVkPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF8zZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X2lwX2FkZHJlc3Nlc19jb3VudF83ZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgMzAgZGF5cyAobWF4IDEwMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzMwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCBJUCBhZGRyZXNzZXMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgOTAgZGF5cyAobWF4IDEwMClcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfaXBfYWRkcmVzc2VzX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2VyIGFnZW50cyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfM2Q/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgdXNlciBhZ2VudHMgbGlua2VkIHRvIHRoZSBzYW1lIGJhbmsgYWNjb3VudCBkdXJpbmcgUGxhaWQgYXV0aGVudGljYXRpb24gaW4gdGhlIGxhc3QgNyBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3VzZXJfYWdlbnRzX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfMzBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IHVzZXIgYWdlbnRzIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3RfdXNlcl9hZ2VudHNfY291bnRfOTBkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3Rfc3NsX3Rsc19jb25uZWN0aW9uX3Nlc3Npb25zX2NvdW50XzNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCA3IGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3Rfc3NsX3Rsc19jb25uZWN0aW9uX3Nlc3Npb25zX2NvdW50XzdkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGRpc3RpbmN0IFNTTC9UTFMgY29ubmVjdGlvbiBzZXNzaW9ucyBsaW5rZWQgdG8gdGhlIHNhbWUgYmFuayBhY2NvdW50IGR1cmluZyBQbGFpZCBhdXRoZW50aWNhdGlvbiBpbiB0aGUgbGFzdCAzMCBkYXlzXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVDb3JlQXR0cmlidXRlc1xuICAgICAqL1xuICAgIGRpc3RpbmN0X3NzbF90bHNfY29ubmVjdGlvbl9zZXNzaW9uc19jb3VudF8zMGQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgU1NML1RMUyBjb25uZWN0aW9uIHNlc3Npb25zIGxpbmtlZCB0byB0aGUgc2FtZSBiYW5rIGFjY291bnQgZHVyaW5nIFBsYWlkIGF1dGhlbnRpY2F0aW9uIGluIHRoZSBsYXN0IDkwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgZGlzdGluY3Rfc3NsX3Rsc19jb25uZWN0aW9uX3Nlc3Npb25zX2NvdW50XzkwZD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBkYXlzIHNpbmNlIHRoZSBiYW5rIGFjY291bnQgd2FzIG9wZW5lZCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvblxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBkYXlzX3NpbmNlX2FjY291bnRfb3BlbmluZz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvZXZhbHVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB0aGF0IGlzIHRoZSBmdW5kaW5nIHNvdXJjZSBmb3IgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiBUaGUgYGFjY291bnRfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgYXMgd2VsbCBhcyB0aGUgW2BvblN1Y2Nlc3NgXSgvZG9jcy9saW5rL2lvcy8jbGluay1pb3Mtb25zdWNjZXNzLWxpbmtTdWNjZXNzLW1ldGFkYXRhLWFjY291bnRzLWlkKSBjYWxsYmFjayBtZXRhZGF0YS4gIFRoaXMgd2lsbCByZXR1cm4gYW4gW2BJTlZBTElEX0FDQ09VTlRfSURgXSgvZG9jcy9lcnJvcnMvaW52YWxpZC1pbnB1dC8jaW52YWxpZF9hY2NvdW50X2lkKSBlcnJvciBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiByZW1vdmVkIGF0IHRoZSBiYW5rIG9yIGlmIHRoZSBgYWNjb3VudF9pZGAgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgSUQvaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LCBpbiBVU0QgKGUuZy4gYDEwMi4wNWApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogYHRydWVgIGlmIHRoZSBlbmQgdXNlciBpcyBwcmVzZW50IHdoaWxlIGluaXRpYXRpbmcgdGhlIEFDSCB0cmFuc2ZlciBhbmQgdGhlIGVuZHBvaW50IGlzIGJlaW5nIGNhbGxlZDsgYGZhbHNlYCBvdGhlcndpc2UgKGZvciBleGFtcGxlLCB3aGVuIHRoZSBBQ0ggdHJhbnNmZXIgaXMgc2NoZWR1bGVkIGFuZCB0aGUgZW5kIHVzZXIgaXMgbm90IHByZXNlbnQsIG9yIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgdGhlIEFDSCB0cmFuc2ZlciBidXQgYmVmb3JlIHN1Ym1pdHRpbmcgdGhlIE5hY2hhIGZpbGUgZm9yIEFDSCBwcm9jZXNzaW5nKS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl9wcmVzZW50PzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBpcyB1c2VkIHRvIGNvcnJlbGF0ZSByZXF1ZXN0cyBieSBhIHVzZXIgd2l0aCBtdWx0aXBsZSBJdGVtcy4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgdGhlIEFDSCB0cmFuc2FjdGlvbiBpcyBhIHJlY3VycmluZyB0cmFuc2FjdGlvbjsgYGZhbHNlYCBvdGhlcndpc2UgXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzX3JlY3VycmluZz86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZWZhdWx0IEFDSCBvciBub24tQUNIIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbi4gYFNBTUVfREFZX0FDSGA6IFNhbWUgRGF5IEFDSCBieSBOQUNIQS4gVGhlIGRlYml0IHRyYW5zYWN0aW9uIGlzIHByb2Nlc3NlZCBhbmQgc2V0dGxlZCBvbiB0aGUgc2FtZSBkYXkgYE5FWFRfREFZX0FDSGA6IE5leHQgRGF5IEFDSCBzZXR0bGVtZW50IGZvciBkZWJpdCB0cmFuc2FjdGlvbnMsIG9mZmVyZWQgYnkgc29tZSBwYXltZW50IHByb2Nlc3NvcnMgYFNUQU5EQVJEX0FDSGA6IHN0YW5kYXJkIEFDSCBieSBOQUNIQSBgUkVBTF9USU1FX1BBWU1FTlRTYDogcmVhbC10aW1lIHBheW1lbnRzIHN1Y2ggYXMgUlRQIGFuZCBGZWROb3cgYERFQklUX0NBUkRgOiBpZiB0aGUgZGVmYXVsdCBwYXltZW50IGlzIG92ZXIgZGViaXQgY2FyZCBuZXR3b3JrcyBgTVVMVElQTEVfUEFZTUVOVF9NRVRIT0RTYDogaWYgdGhlcmUgaXMgbm8gZGVmYXVsdCBkZWJpdCByYWlsIG9yIHRoZXJlIGFyZSBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgUG9zc2libGUgdmFsdWVzOiAgYFNBTUVfREFZX0FDSGAsIGBORVhUX0RBWV9BQ0hgLCBgU1RBTkRBUkRfQUNIYCwgYFJFQUxfVElNRV9QQVlNRU5UU2AsIGBERUJJVF9DQVJEYCwgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZWZhdWx0X3BheW1lbnRfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2lnbmFsVXNlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcj86IFNpZ25hbFVzZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbERldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGV2aWNlPzogU2lnbmFsRGV2aWNlO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnlpbmcgYHJpc2tfcHJvZmlsZV9rZXlgIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBwcm92aWRlIGBydWxlc2V0YCBpbnN0ZWFkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmlza19wcm9maWxlX2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGtleSBvZiB0aGUgUnVsZXNldCB0byB1c2UgZm9yIHRoaXMgdHJhbnNhY3Rpb24uIFlvdSBjYW4gY29uZmlndXJlIGEgUnVsZXNldCB1c2luZyB0aGUgU2lnbmFsIGRhc2hib2FyZCBsb2NhdGVkIHdpdGhpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBub3QgcHJvdmlkZWQsIG5vIFJ1bGVzZXQgd2lsbCBiZSB1c2VkLiBUaGlzIGZlYXR1cmUgaXMgY3VycmVudGx5IGluIGNsb3NlZCBiZXRhOyB0byByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBydWxlc2V0X2tleT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9ldmFsdWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxTY29yZXN9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY29yZXM6IFNpZ25hbFNjb3JlcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbEV2YWx1YXRlQ29yZUF0dHJpYnV0ZXN9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbEV2YWx1YXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3JlX2F0dHJpYnV0ZXM/OiBTaWduYWxFdmFsdWF0ZUNvcmVBdHRyaWJ1dGVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrUHJvZmlsZX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcmlza19wcm9maWxlPzogUmlza1Byb2ZpbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSdWxlc2V0fVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxFdmFsdWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcnVsZXNldD86IFJ1bGVzZXQgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsRXZhbHVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHdhcm5pbmdzOiBBcnJheTxTaWduYWxXYXJuaW5nPjtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgbWV0aG9kIHRvIGNvbXBsZXRlIHRoZSB0cmFuc2FjdGlvbiBhZnRlciB0aGUgcmlzayBhc3Nlc3NtZW50LiBJdCBtYXkgYmUgZGlmZmVyZW50IGZyb20gdGhlIGRlZmF1bHQgcGF5bWVudCBtZXRob2QuICBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIGJ5IE5BQ0hBLiBUaGUgZGViaXQgdHJhbnNhY3Rpb24gaXMgcHJvY2Vzc2VkIGFuZCBzZXR0bGVkIG9uIHRoZSBzYW1lIGRheSAgYE5FWFRfREFZX0FDSGA6IE5leHQgRGF5IEFDSCBzZXR0bGVtZW50IGZvciBkZWJpdCB0cmFuc2FjdGlvbnMsIG9mZmVyZWQgYnkgc29tZSBwYXltZW50IHByb2Nlc3NvcnMgIGBTVEFOREFSRF9BQ0hgOiBzdGFuZGFyZCBBQ0ggYnkgTkFDSEEgIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiByZWFsLXRpbWUgcGF5bWVudHMgc3VjaCBhcyBSVFAgYW5kIEZlZE5vdyAgYERFQklUX0NBUkRgOiBpZiB0aGUgZGVmYXVsdCBwYXltZW50IGlzIG92ZXIgZGViaXQgY2FyZCBuZXR3b3JrcyAgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2A6IGlmIHRoZXJlIGlzIG5vIGRlZmF1bHQgZGViaXQgcmFpbCBvciB0aGVyZSBhcmUgbXVsdGlwbGUgcGF5bWVudCBtZXRob2RzICBQb3NzaWJsZSB2YWx1ZXM6IGBTQU1FX0RBWV9BQ0hgLCBgTkVYVF9EQVlfQUNIYCwgYFNUQU5EQVJEX0FDSGAsIGBSRUFMX1RJTUVfUEFZTUVOVFNgLCBgREVCSVRfQ0FSRGAsIGBNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFNgIFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU2lnbmFsUGF5bWVudE1ldGhvZCB7XG4gICAgU2FtZURheUFjaCA9ICdTQU1FX0RBWV9BQ0gnLFxuICAgIE5leHREYXlBY2ggPSAnTkVYVF9EQVlfQUNIJyxcbiAgICBTdGFuZGFyZEFjaCA9ICdTVEFOREFSRF9BQ0gnLFxuICAgIFJlYWxUaW1lUGF5bWVudHMgPSAnUkVBTF9USU1FX1BBWU1FTlRTJyxcbiAgICBEZWJpdENhcmQgPSAnREVCSVRfQ0FSRCcsXG4gICAgTXVsdGlwbGVQYXltZW50TWV0aG9kcyA9ICdNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFMnXG59XG5cbi8qKlxuICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUGVyc29uTmFtZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFBlcnNvbk5hbWUge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBuYW1lIHByZWZpeCAoZS5nLiBcXFwiTXIuXFxcIilcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQZXJzb25OYW1lXG4gICAgICovXG4gICAgcHJlZml4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZ2l2ZW4gbmFtZS4gSWYgdGhlIHVzZXIgaGFzIGEgb25lLXdvcmQgbmFtZSwgaXQgc2hvdWxkIGJlIHByb3ZpZGVkIGluIHRoaXMgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBtaWRkbGUgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBtaWRkbGVfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGZhbWlseSBuYW1lIC8gc3VybmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFBlcnNvbk5hbWVcbiAgICAgKi9cbiAgICBmYW1pbHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIG5hbWUgc3VmZml4IChlLmcuIFxcXCJJSVxcXCIpXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUGVyc29uTmFtZVxuICAgICAqL1xuICAgIHN1ZmZpeD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFByZXBhcmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9wcmVwYXJlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFByZXBhcmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxQcmVwYXJlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogU2lnbmFsUHJlcGFyZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvcHJlcGFyZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUHJlcGFyZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUHJlcGFyZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGBjbGllbnRfdHJhbnNhY3Rpb25faWRgIHN1cHBsaWVkIHdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF90cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE11c3QgYmUgYSB2YWxpZCBBQ0ggcmV0dXJuIGNvZGUgKGUuZy4gXFxcIlIwMVxcXCIpICBJZiBmb3JtYXR0ZWQgaW5jb3JyZWN0bHksIHRoaXMgd2lsbCByZXN1bHQgaW4gYW4gW2BJTlZBTElEX0ZJRUxEYF0oL2RvY3MvZXJyb3JzL2ludmFsaWQtcmVxdWVzdC8jaW52YWxpZF9maWVsZCkgZXJyb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybl9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIHlvdSByZWNlaXZlIHRoZSByZXR1cm5zIGZyb20geW91ciBwYXltZW50IHByb2Nlc3NvcnMsIGluIElTTyA4NjAxIGZvcm1hdCAoYFlZWVktTU0tRERUSEg6bW06c3NaYCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdFxuICAgICAqL1xuICAgIHJldHVybmVkX2F0Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsUmV0dXJuUmVwb3J0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBwYXltZW50IG1ldGhvZCBzcGVjaWZpZWQgaW4gdGhlIGBkZWZhdWx0X3BheW1lbnRfbWV0aG9kYCBmaWVsZCBkaXJlY3RseSBpbXBhY3RzIHRoZSB0aW1pbmcgcmVjb21tZW5kYXRpb25zIHByb3ZpZGVkIGJ5IHRoZSBBUEkgZm9yIHN1Ym1pdHRpbmcgdGhlIGRlYml0IGVudHJ5IHRvIHlvdXIgcHJvY2Vzc29yIG9yIE9ERkkuIElmIHVuc3BlY2lmaWVkLCBTaWduYWwgZGVmYXVsdHMgdG8gYFNUQU5EQVJEX0FDSGAuICBgU0FNRV9EQVlfQUNIYDogU2FtZSBEYXkgQUNIIChhcyBkZWZpbmVkIGJ5IE5hY2hhKS4gVGhlIFNpZ25hbCBBUEkgYXNzdW1lcyB0aGUgc2V0dGxlbWVudCB3aWxsIG9jY3VyIG9uIHRoZSBzYW1lIGJ1c2luZXNzIGRheSBpZiB0aGUgYC9zaWduYWwvc2NoZWR1bGVgIHJlcXVlc3QgaXMgc3VibWl0dGVkIGJ5IDY6MDAgUE0gVVRDLiBOb3RlOiBUaGUgYWN0dWFsIGN1dG9mZiB0aW1lIGNhbiB2YXJ5IGRlcGVuZGluZyBvbiB5b3VyIHBheW1lbnQgcHJvY2Vzc29yIG9yIE9ERkkuIE5BQ0hBIGhhcyBlc3RhYmxpc2hlZCB0aHJlZSBwcm9jZXNzaW5nIHdpbmRvd3MgZm9yIFNhbWUgRGF5IEFDSCAoVVRDKTogMjozMCBQTSwgNjo0NSBQTSwgYW5kIDg6NDUgUE0uICBgU1RBTkRBUkRfQUNIYDogU3RhbmRhcmQgQUNIIChhcyBkZWZpbmVkIGJ5IE5hY2hhKSwgdHlwaWNhbGx5IHNldHRsZWQgb25lIHRvIHRocmVlIGJ1c2luZXNzIGRheXMgYWZ0ZXIgc3VibWlzc2lvbi4gIGBSRUFMX1RJTUVfUEFZTUVOVFNgOiBSZWFsLXRpbWUgcGF5bWVudHMgdmlhIFJlcXVlc3QgZm9yIFBheW1lbnQgdGhyb3VnaCBuZXR3b3JrcyBzdWNoIGFzIFJUUCAoVGhlIENsZWFyaW5nIEhvdXNlKSBhbmQgRmVkTm93LCB3aGVyZSB0aGUgY29uc3VtZXIgY2FuIGF1dGhvcml6ZSB0aGUgcGF5bWVudCBpbiByZXNwb25zZSB0byBhIFJGUCwgYW5kIHRoZSB0cmFuc2FjdGlvbiBpcyBwcm9jZXNzZWQgYW5kIHNldHRsZWQgaW1tZWRpYXRlbHkuICBgREVCSVRfQ0FSRGA6IFBheW1lbnRzIHByb2Nlc3NlZCBvdmVyIGRlYml0IGNhcmQgbmV0d29ya3MsIGxldmVyYWdpbmcgdGhlIGNhcmQtYmFzZWQgaW5mcmFzdHJ1Y3R1cmUgZm9yIHJlYWwtdGltZSBvciBuZWFyLXJlYWwtdGltZSBzZXR0bGVtZW50LiAgYE1VTFRJUExFX1BBWU1FTlRfTUVUSE9EU2A6IEluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vIGRlZmF1bHQgZGViaXQgcmFpbCBvciBtdWx0aXBsZSBwYXltZW50IG1ldGhvZHMgYXJlIGF2YWlsYWJsZSwgYW5kIHRoZSB0cmFuc2FjdGlvbiBjb3VsZCB1c2UgYW55IG9mIHRoZW0gYmFzZWQgb24gY3VzdG9tZXIgcG9saWN5IG9yIGF2YWlsYWJpbGl0eS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFNpZ25hbFNjaGVkdWxlRGVmYXVsdFBheW1lbnRNZXRob2Qge1xuICAgIFNhbWVEYXlBY2ggPSAnU0FNRV9EQVlfQUNIJyxcbiAgICBTdGFuZGFyZEFjaCA9ICdTVEFOREFSRF9BQ0gnLFxuICAgIFJlYWxUaW1lUGF5bWVudHMgPSAnUkVBTF9USU1FX1BBWU1FTlRTJyxcbiAgICBEZWJpdENhcmQgPSAnREVCSVRfQ0FSRCcsXG4gICAgTXVsdGlwbGVQYXltZW50TWV0aG9kcyA9ICdNVUxUSVBMRV9QQVlNRU5UX01FVEhPRFMnXG59XG5cbi8qKlxuICogQ29udmV5cyBpbmZvcm1hdGlvbiBvbiBpZiBhIHJldHJ5IGlzIHJlY29tbWVuZGVkIG9uIGEgZ2l2ZW4gZGF0ZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2lnbmFsU2NoZWR1bGVSZWNvbW1lbmRhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIHNwZWNpZmljIGRhdGUgZm9yIHN1Ym1pdHRpbmcgdGhlIGRlYml0IGVudHJ5LCBmb3JtYXR0ZWQgaW4gSVNPIDg2MDEgKGUuZy4sIFxcXCIyMDI1LTAxLTE3XFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZWNvbW1lbmRhdGlvblxuICAgICAqL1xuICAgIGRhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY29tbWVuZGF0aW9uU3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gICAgICovXG4gICAgcmVjb21tZW5kYXRpb24/OiBSZWNvbW1lbmRhdGlvblN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuayBvZiB0aGUgcmVjb21tZW5kYXRpb24gYmFzZWQgb24gdGhlIGxpa2VsaWhvb2Qgb2YgZGViaXQgc3VjY2Vzcywgd2l0aCAxIHJlcHJlc2VudGluZyB0aGUgbW9zdCBvcHRpbWFsIGRhdGUuIERhdGVzIHdpdGggYE5PVF9SRUNPTU1FTkRFRGAgb3IgYFVOS05PV05gIHdpbGwgaGF2ZSByYW5rIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uXG4gICAgICovXG4gICAgcmFuaz86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFNpZ25hbFNjaGVkdWxlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zaWduYWwvc2NoZWR1bGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFNjaGVkdWxlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBvZiB0aGUgYWNjb3VudCB0aGF0IGlzIHRoZSBmdW5kaW5nIHNvdXJjZSBmb3IgdGhlIHByb3Bvc2VkIHRyYW5zYWN0aW9uLiBUaGUgYGFjY291bnRfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgYXMgd2VsbCBhcyB0aGUgW2BvblN1Y2Nlc3NgXSgvZG9jcy9saW5rL2lvcy8jbGluay1pb3Mtb25zdWNjZXNzLWxpbmtTdWNjZXNzLW1ldGFkYXRhLWFjY291bnRzLWlkKSBjYWxsYmFjayBtZXRhZGF0YS4gIFRoaXMgd2lsbCByZXR1cm4gYW4gW2BJTlZBTElEX0FDQ09VTlRfSURgXSgvZG9jcy9lcnJvcnMvaW52YWxpZC1pbnB1dC8jaW52YWxpZF9hY2NvdW50X2lkKSBlcnJvciBpZiB0aGUgYWNjb3VudCBoYXMgYmVlbiByZW1vdmVkIGF0IHRoZSBiYW5rIG9yIGlmIHRoZSBgYWNjb3VudF9pZGAgaXMgbm8gbG9uZ2VyIHZhbGlkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIElEIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gdXNlIHRvIHJlZmVyIHRvIHRoaXMgdHJhbnNhY3Rpb24uIEZvciB5b3VyIGNvbnZlbmllbmNlIG1hcHBpbmcgeW91ciBpbnRlcm5hbCBkYXRhLCB5b3UgY291bGQgdXNlIHlvdXIgaW50ZXJuYWwgSUQvaWRlbnRpZmllciBmb3IgdGhpcyB0cmFuc2FjdGlvbi4gVGhlIG1heCBsZW5ndGggZm9yIHRoaXMgZmllbGQgaXMgMzYgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhbnNhY3Rpb24gYW1vdW50LCBpbiBVU0QgKGUuZy4gYDEwMi4wNWApXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NpZ25hbFNjaGVkdWxlRGVmYXVsdFBheW1lbnRNZXRob2R9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVxdWVzdFxuICAgICAqL1xuICAgIGRlZmF1bHRfcGF5bWVudF9tZXRob2Q/OiBTaWduYWxTY2hlZHVsZURlZmF1bHRQYXltZW50TWV0aG9kO1xufVxuLyoqXG4gKiBTaWduYWxTY2hlZHVsZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9zaWduYWwvc2NoZWR1bGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFNjaGVkdWxlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaWduYWxTY2hlZHVsZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVjb21tZW5kZWQgb3B0aW1hbCBkYXRlIHRvIHN1Ym1pdCB0aGUgZGViaXQgZW50cnksIGZvcm1hdHRlZCBpbiBJU08gODYwMSBcXFwiWVlZWS1NTS1ERFxcXCIgKGUuZy4sIFxcXCIyMDI0LTAzLTMwXFxcIikuIFRoZSBgb3B0aW1hbF9kYXRlYCBpcyBkZXJpdmVkIGZyb20gdGhlIGRhdGUgd2l0aCByYW5rID0gMSBpbiB0aGUgZm9sbG93aW5nIHJlY29tbWVuZGF0aW9ucyBhcnJheS4gIE5PVEU6IFRoZSBgZGVmYXVsdF9wYXltZW50X21ldGhvZGAgZmllbGQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdpbGwgYWZmZWN0IHRoZSByZWNvbW1lbmRhdGlvbiwgc2luY2Ugd2VcXCdyZSBhY2NvdW50aW5nIGZvciBkZWJpdCBzZXR0bGVtZW50IHRpbWUuICBUaGUgZGViaXQgc2NoZWR1bGluZyBldmFsdWF0aW9uIHN0YXJ0cyBmcm9tIHRoZSBkYXkgdGhlIC9zaWduYWwvc2NoZWR1bGUgcmVxdWVzdCBpcyBzdWJtaXR0ZWQgKERheSAwKSBvciB0aGUgbmV4dCBiYW5raW5nIGRheSBpZiB0aGUgc3VibWlzc2lvbiBkYXkgaXMgbm90IGEgYmFua2luZyBkYXksIGFuZCBleHRlbmRzIHRocm91Z2ggdGhlIGZvbGxvd2luZyBmaXZlIGJhbmtpbmcgZGF5cyAoRGF5IDEgdG8gRGF5IDUpLiBJZiBubyBkYXRlIHdpdGhpbiB0aGlzIHBlcmlvZCBpcyBjb25zaWRlcmVkIGxpa2VseSB0byByZXN1bHQgaW4gYSBzdWNjZXNzZnVsIGRlYml0IGF0dGVtcHQsIGBudWxsYCB3aWxsIGJlIHJldHVybmVkIGZvciB0aGUgYG9wdGltYWxfZGF0ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NoZWR1bGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9wdGltYWxfZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGlzIGFycmF5IHByb3ZpZGVzIGEgZGF0ZS1ieS1kYXRlIGV2YWx1YXRpb24gb2YgZGViaXQgc3VibWlzc2lvbiByZWNvbW1lbmRhdGlvbnMgd2l0aGluIHRoZSBmaXZlIGJhbmtpbmcgZGF5IGV2YWx1YXRpb24gcGVyaW9kLiBFYWNoIG9iamVjdCBpbiB0aGUgYXJyYXkgcmVwcmVzZW50cyBhIHJldHJ5IHJlY29tbWVuZGF0aW9uIGZvciBhIHNwZWNpZmljIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PFNpZ25hbFNjaGVkdWxlUmVjb21tZW5kYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxTY2hlZHVsZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjb21tZW5kYXRpb25zOiBBcnJheTxTaWduYWxTY2hlZHVsZVJlY29tbWVuZGF0aW9uPjtcbiAgICAvKipcbiAgICAgKiBJZiBiYW5rIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlIHRvIGJlIHVzZWQgaW4gdGhlIFNpZ25hbCBtb2RlbCwgdGhpcyBhcnJheSBjb250YWlucyB3YXJuaW5ncyBkZXNjcmliaW5nIHdoeSBiYW5rIGRhdGEgaXMgbWlzc2luZy4gSWYgeW91IHdhbnQgdG8gcmVjZWl2ZSBhbiBBUEkgZXJyb3IgaW5zdGVhZCBvZiBTaWduYWwgc2NvcmVzIGluIHRoZSBjYXNlIG9mIG1pc3NpbmcgYmFuayBkYXRhLCBmaWxlIGEgc3VwcG9ydCB0aWNrZXQgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U2lnbmFsV2FybmluZz59XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8U2lnbmFsV2FybmluZz47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpZ25hbFNjaGVkdWxlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJpc2sgc2NvcmluZyBkZXRhaWxzIGJyb2tlbiBkb3duIGJ5IHJpc2sgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFNpZ25hbFNjb3Jlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFNjb3JlcyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0N1c3RvbWVySW5pdGlhdGVkUmV0dXJuUmlza31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NvcmVzXG4gICAgICovXG4gICAgY3VzdG9tZXJfaW5pdGlhdGVkX3JldHVybl9yaXNrPzogQ3VzdG9tZXJJbml0aWF0ZWRSZXR1cm5SaXNrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtCYW5rSW5pdGlhdGVkUmV0dXJuUmlza31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsU2NvcmVzXG4gICAgICovXG4gICAgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Jpc2s/OiBCYW5rSW5pdGlhdGVkUmV0dXJuUmlzaztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCB0aGUgZW5kIHVzZXIgaW5pdGlhdGluZyB0aGUgdHJhbnNhY3Rpb24gKGkuZS4sIHRoZSBhY2NvdW50IGhvbGRlcikuIFdoZW4gY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAgb3IgYC9zaWduYWwvcHJvY2Vzc29yL2V2YWx1YXRlYCwgdGhpcyBmaWVsZCBpcyBvcHRpb25hbCwgYnV0IHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGluY3JlYXNlIHRoZSBhY2N1cmFjeSBvZiBTaWduYWwgcmVzdWx0cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsVXNlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFVzZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxQZXJzb25OYW1lfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxVc2VyXG4gICAgICovXG4gICAgbmFtZT86IFNpZ25hbFBlcnNvbk5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIsIGluIEUuMTY0IGZvcm1hdDogK3tjb3VudHJ5Y29kZX17bnVtYmVyfS4gRm9yIGV4YW1wbGU6IFxcXCIrMTQxNTEyMzQ1NjdcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTaWduYWxBZGRyZXNzRGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsVXNlclxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBTaWduYWxBZGRyZXNzRGF0YSB8IG51bGw7XG59XG4vKipcbiAqIENvbnZleXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGVycm9ycyBjYXVzaW5nIG1pc3Npbmcgb3Igc3RhbGUgYmFuayBkYXRhIHVzZWQgdG8gY29uc3RydWN0IHRoZSAvc2lnbmFsL2V2YWx1YXRlIHNjb3JlcyBhbmQgcmVzcG9uc2VcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU2lnbmFsV2FybmluZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbFdhcm5pbmcge1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIHdhcm5pbmcuIFNhZmUgZm9yIHByb2dyYW1tYXRpYyB1c2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyBjb2RlIGlkZW50aWZpZXMgYSBzcGVjaWZpYyBraW5kIG9mIHdhcm5pbmcgdGhhdCBwZXJ0YWlucyB0byB0aGUgZXJyb3IgY2F1c2luZyBiYW5rIGRhdGEgdG8gYmUgbWlzc2luZy4gU2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS4gRm9yIG1vcmUgZGV0YWlscyBvbiB3YXJuaW5nIGNvZGVzLCBwbGVhc2UgcmVmZXIgdG8gUGxhaWQgc3RhbmRhcmQgZXJyb3IgY29kZXMgZG9jdW1lbnRhdGlvbi4gSWYgeW91IHJlY2VpdmUgdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3YXJuaW5nLCB3ZSByZWNvbW1lbmQgcmUtYXV0aGVudGljYXRpbmcgeW91ciB1c2VyIGJ5IGltcGxlbWVudGluZyBMaW5rXFwncyB1cGRhdGUgbW9kZS4gVGhpcyB3aWxsIGd1aWRlIHlvdXIgdXNlciB0byBmaXggdGhlaXIgY3JlZGVudGlhbHMsIGFsbG93aW5nIFBsYWlkIHRvIHN0YXJ0IGZldGNoaW5nIGRhdGEgYWdhaW4gZm9yIGZ1dHVyZSBTaWduYWwgcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2lnbmFsV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRldmVsb3Blci1mcmllbmRseSByZXByZXNlbnRhdGlvbiBvZiB0aGUgd2FybmluZyB0eXBlLiBUaGlzIG1heSBjaGFuZ2Ugb3ZlciB0aW1lIGFuZCBpcyBub3Qgc2FmZSBmb3IgcHJvZ3JhbW1hdGljIHVzZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaWduYWxXYXJuaW5nXG4gICAgICovXG4gICAgd2FybmluZ19tZXNzYWdlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN3ZWVwIHJldHVybmVkIGZyb20gdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQuIENhbiBiZSBudWxsIGlmIHRoZXJlIGFyZSBubyB0cmFuc2ZlcnMgdG8gaW5jbHVkZSBpbiBhIHN3ZWVwLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTaWduZWQgZGVjaW1hbCBhbW91bnQgb2YgdGhlIHN3ZWVwIGFzIGl0IGFwcGVhcnMgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlciAoZS5nLiBcXFwiLTEwLjAwXFxcIikgIElmIGFtb3VudCBpcyBub3QgcHJlc2VudCwgdGhlIHN3ZWVwIHdhcyBuZXQtc2V0dGxlZCB0byB6ZXJvIGFuZCBvdXRzdGFuZGluZyBkZWJpdHMgYW5kIGNyZWRpdHMgYmV0d2VlbiB0aGUgc3dlZXAgYWNjb3VudCBhbmQgUGxhaWQgYXJlIGJhbGFuY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHN3ZWVwIHNldHRsZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc2V0dGxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwVHJpZ2dlcn1cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTaW11bGF0ZWRUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gRm9yIGBydHBgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgVHJhbnNhY3Rpb24gSWRlbnRpZmljYXRpb24gbnVtYmVyLiBGb3IgYHdpcmVgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgSU1BRCAoSW5wdXQgTWVzc2FnZSBBY2NvdW50YWJpbGl0eSBEYXRhKSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU2ltdWxhdGVkVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcEZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFNpbXVsYXRlZFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFN3ZWVwRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIE9iamVjdCBjb250YWluaW5nIGFsbCByaXNrIHNpZ25hbHMgYW5kIHJlbGV2YW50IG1ldGFkYXRhIGZvciBhIHNpbmdsZSBkb2N1bWVudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrU2lnbmFsRG9jdW1lbnRSZWZlcmVuY2V9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIGRvY3VtZW50X3JlZmVyZW5jZTogUmlza1NpZ25hbERvY3VtZW50UmVmZXJlbmNlO1xuICAgIC8qKlxuICAgICAqIEFycmF5IG9mIGF0dHJpYnV0ZXMgdGhhdCBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBmcmF1ZCByaXNrIHdpdGggYSBkb2N1bWVudFxuICAgICAqIEB0eXBlIHtBcnJheTxEb2N1bWVudFJpc2tTaWduYWw+fVxuICAgICAqIEBtZW1iZXJvZiBTaW5nbGVEb2N1bWVudFJpc2tTaWduYWxcbiAgICAgKi9cbiAgICByaXNrX3NpZ25hbHM6IEFycmF5PERvY3VtZW50Umlza1NpZ25hbD47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RvY3VtZW50Umlza1N1bW1hcnl9XG4gICAgICogQG1lbWJlcm9mIFNpbmdsZURvY3VtZW50Umlza1NpZ25hbFxuICAgICAqL1xuICAgIHJpc2tfc3VtbWFyeTogRG9jdW1lbnRSaXNrU3VtbWFyeTtcbn1cbi8qKlxuICogQSB0eXBlIGluZGljYXRpbmcgd2hldGhlciBhIGRhc2hib2FyZCB1c2VyLCBhbiBBUEktYmFzZWQgdXNlciwgb3IgUGxhaWQgbGFzdCB0b3VjaGVkIHRoaXMgb2JqZWN0LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU291cmNlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBMaW5rID0gJ2xpbmsnLFxuICAgIEFwaSA9ICdhcGknLFxuICAgIFN5c3RlbSA9ICdzeXN0ZW0nXG59XG5cbi8qKlxuICogVGhlIHNjaGVtYSBiZWxvdyBkZXNjcmliZXMgdGhlIHZhcmlvdXMgYHR5cGVzYCBhbmQgY29ycmVzcG9uZGluZyBgc3VidHlwZXNgIHRoYXQgUGxhaWQgcmVjb2duaXplcyBhbmQgcmVwb3J0cyBmb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uIGFjY291bnRzLiBGb3IgYSBtYXBwaW5nIG9mIHN1cHBvcnRlZCB0eXBlcyBhbmQgc3VidHlwZXMgdG8gUGxhaWQgcHJvZHVjdHMsIHNlZSB0aGUgW0FjY291bnQgdHlwZSAvIHByb2R1Y3Qgc3VwcG9ydCBtYXRyaXhdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzLyNhY2NvdW50LXR5cGUtLXByb2R1Y3Qtc3VwcG9ydC1tYXRyaXgpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQWNjb3VudFR5cGUge1xuICAgIC8qKlxuICAgICAqIEFuIGFjY291bnQgdHlwZSBob2xkaW5nIGNhc2gsIGluIHdoaWNoIGZ1bmRzIGFyZSBkZXBvc2l0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgZGVwb3NpdG9yeTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY3JlZGl0IGNhcmQgdHlwZSBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIGNyZWRpdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbG9hbiB0eXBlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgbG9hbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGludmVzdG1lbnQgYWNjb3VudC4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgdHlwZSBpcyBjYWxsZWQgYGJyb2tlcmFnZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUFjY291bnRUeXBlXG4gICAgICovXG4gICAgaW52ZXN0bWVudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIE90aGVyIG9yIHVua25vd24gYWNjb3VudCB0eXBlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVBY2NvdW50VHlwZVxuICAgICAqL1xuICAgIG90aGVyOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBmb2xsb3dpbmcgY3VycmVuY3kgY29kZXMgYXJlIHN1cHBvcnRlZCBieSBQbGFpZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhbmRhbG9uZUN1cnJlbmN5Q29kZUxpc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdCB7XG4gICAgLyoqXG4gICAgICogUGxhaWQgc3VwcG9ydHMgYWxsIElTTyA0MjE3IGN1cnJlbmN5IGNvZGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVDdXJyZW5jeUNvZGVMaXN0XG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXNcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lQ3VycmVuY3lDb2RlTGlzdFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBWYWxpZCB2YWx1ZXMgZm9yIGludmVzdG1lbnQgdHJhbnNhY3Rpb24gdHlwZXMgYW5kIHN1YnR5cGVzLiBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIHJlcHJlc2VudGluZyBpbmZsb3cgb2YgY2FzaCB3aWxsIGFwcGVhciBhcyBuZWdhdGl2ZSBhbW91bnRzLCBvdXRmbG93IG9mIGNhc2ggd2lsbCBhcHBlYXIgYXMgcG9zaXRpdmUgYW1vdW50cy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZSB7XG4gICAgLyoqXG4gICAgICogQnV5aW5nIGFuIGludmVzdG1lbnRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGJ1eTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNlbGxpbmcgYW4gaW52ZXN0bWVudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgc2VsbDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgY2FuY2VsbGF0aW9uIG9mIGEgcGVuZGluZyB0cmFuc2FjdGlvblxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgY2FuY2VsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQWN0aXZpdHkgdGhhdCBtb2RpZmllcyBhIGNhc2ggcG9zaXRpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGFuZGFsb25lSW52ZXN0bWVudFRyYW5zYWN0aW9uVHlwZVxuICAgICAqL1xuICAgIGNhc2g6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBGZWVzIG9uIHRoZSBhY2NvdW50LCBlLmcuIGNvbW1pc3Npb24sIGJvb2trZWVwaW5nLCBvcHRpb25zLXJlbGF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhbmRhbG9uZUludmVzdG1lbnRUcmFuc2FjdGlvblR5cGVcbiAgICAgKi9cbiAgICBmZWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBY3Rpdml0eSB0aGF0IG1vZGlmaWVzIGEgcG9zaXRpb24sIGJ1dCBub3QgdGhyb3VnaCBidXkvc2VsbCBhY3Rpdml0eSBlLmcuIG9wdGlvbnMgZXhlcmNpc2UsIHBvcnRmb2xpbyB0cmFuc2ZlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YW5kYWxvbmVJbnZlc3RtZW50VHJhbnNhY3Rpb25UeXBlXG4gICAgICovXG4gICAgdHJhbnNmZXI6IHN0cmluZztcbn1cbi8qKlxuICogQWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0FjY291bnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhc3QgMi00IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9mIGFuIGFjY291bnRcXCdzIG9mZmljaWFsIGFjY291bnQgbnVtYmVyLiBOb3RlIHRoYXQgdGhlIG1hc2sgbWF5IGJlIG5vbi11bmlxdWUgYmV0d2VlbiBhbiBJdGVtXFwncyBhY2NvdW50cywgYW5kIGl0IG1heSBhbHNvIG5vdCBtYXRjaCB0aGUgbWFzayB0aGF0IHRoZSBiYW5rIGRpc3BsYXlzIHRvIHRoZSB1c2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9tYXNrOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGFjY291bnQsIGVpdGhlciBhc3NpZ25lZCBieSB0aGUgdXNlciBvciBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIGl0c2VsZi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzQWNjb3VudFxuICAgICAqL1xuICAgIGFjY291bnRfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBhY2NvdW50IGFzIGdpdmVuIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X29mZmljaWFsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3VidHlwZSBvZiB0aGUgYWNjb3VudC4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF9zdWJ0eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYWNjb3VudC4gRm9yIGEgZnVsbCBsaXN0IG9mIHZhbGlkIHR5cGVzIGFuZCBzdWJ0eXBlcywgc2VlIHRoZSBbQWNjb3VudCBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2FjY291bnQtdHlwZS1zY2hlbWEpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNBY2NvdW50XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2Ygc3RhdGVtZW50c1xcJyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtBcnJheTxTdGF0ZW1lbnRzU3RhdGVtZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0FjY291bnRcbiAgICAgKi9cbiAgICBzdGF0ZW1lbnRzOiBBcnJheTxTdGF0ZW1lbnRzU3RhdGVtZW50Pjtcbn1cbi8qKlxuICogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3RhdGVtZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC9zdGF0ZW1lbnRzL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNMaXN0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxTdGF0ZW1lbnRzQWNjb3VudD59XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8U3RhdGVtZW50c0FjY291bnQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJbnN0aXR1dGlvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGluc3RpdHV0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGluc3RpdHV0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5zdGl0dXRpb25fbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHJlc3VsdCBvZiB0aGUgc3RhdGVtZW50IHJlZnJlc2ggZXh0cmFjdGlvbiAgYFNVQ0NFU1NgOiBUaGUgc3RhdGVtZW50cyB3ZXJlIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQgYW5kIGNhbiBiZSBsaXN0ZWQgdmlhIGAvc3RhdGVtZW50cy9saXN0L2AgYW5kIGRvd25sb2FkZWQgdmlhIGAvc3RhdGVtZW50cy9kb3dubG9hZC9gLiAgYEZBSUxVUkVgOiBUaGUgc3RhdGVtZW50cyBmYWlsZWQgdG8gYmUgZXh0cmFjdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVJlc3VsdCB7XG4gICAgU3VjY2VzcyA9ICdTVUNDRVNTJyxcbiAgICBGYWlsdXJlID0gJ0ZBSUxVUkUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiByZWZyZXNoZWQgc3RhdGVtZW50cyBleHRyYWN0aW9uIGlzIGNvbXBsZXRlZCBvciBmYWlsZWQgdG8gYmUgY29tcGxldGVkLiBUcmlnZ2VyZWQgYnkgY2FsbGluZyBgL3N0YXRlbWVudHMvcmVmcmVzaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBTVEFURU1FTlRTYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFNUQVRFTUVOVFNfUkVGUkVTSF9DT01QTEVURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hDb21wbGV0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVSZXN1bHR9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgcmVzdWx0OiBTdGF0ZW1lbnRzUmVmcmVzaENvbXBsZXRlUmVzdWx0O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoQ29tcGxldGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZSBmb3Igc3RhdGVtZW50cywgaW4gXFxcIllZWVktTU0tRERcXFwiIGZvcm1hdCwgZS5nLiBcXFwiMjAyMy0wOC0zMFxcXCIuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZW5kIGRhdGUgZm9yIHN0YXRlbWVudHMsIGluIFxcXCJZWVlZLU1NLUREXFxcIiBmb3JtYXQsIGUuZy4gXFxcIjIwMjMtMTAtMzBcXFwiLiBZb3UgY2FuIHJlcXVlc3QgdXAgdG8gdHdvIHllYXJzIG9mIGRhdGEuIFRvIGRldGVybWluZSB3aGV0aGVyIGEgc3RhdGVtZW50IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGRhdGUgcmFuZ2UsIFBsYWlkIHdpbGwgdXNlIHRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUuIFRoZSBzdGF0ZW1lbnQgcG9zdGVkIGRhdGUgaXMgdHlwaWNhbGx5IGVpdGhlciB0aGUgbGFzdCBkYXkgb2YgdGhlIHN0YXRlbWVudCBwZXJpb2QsIG9yIHRoZSBmb2xsb3dpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmc7XG59XG4vKipcbiAqIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3N0YXRlbWVudHMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNSZWZyZXNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIHN0YXRlbWVudFxcJ3MgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3RhdGVtZW50c1N0YXRlbWVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXRlbWVudHNTdGF0ZW1lbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgc3RhdGVtZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogTW9udGggb2YgdGhlIHllYXIuIFBvc3NpYmxlIHZhbHVlczogMSB0aHJvdWdoIDEyIChKYW51YXJ5IHRocm91Z2ggRGVjZW1iZXIpLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0YXRlbWVudHNTdGF0ZW1lbnRcbiAgICAgKi9cbiAgICBtb250aDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSB5ZWFyIG9mIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0ZW1lbnRzU3RhdGVtZW50XG4gICAgICovXG4gICAgeWVhcjogbnVtYmVyO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0YXR1c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogU2F0dXMgQ29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNDb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFN0YXR1cyBEZXNjcmlwdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNcbiAgICAgKi9cbiAgICBTdGF0dXNEZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIFNUQVRVUyBjb250YWluZXJzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdGF0dXNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YXR1c2VzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdGF0dXNlc1xuICAgICAqL1xuICAgIFNUQVRVUzogU3RhdHVzO1xufVxuLyoqXG4gKiBBbiBpbnN0cnVjdGlvbiBzcGVjaWZ5aW5nIHdoYXQgc3RlcHMgdGhlIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBzaG91bGQgcmVxdWlyZSB0aGUgdXNlciB0byBjb21wbGV0ZTogICBgcmVzZXRgIC0gUmVzdGFydCB0aGUgdXNlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzZXNzaW9uLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBzdWNjZXNzZnVsbHkgY29tcGxldGVkIHBhcnQgb2YgdGhlaXIgcHJldmlvdXMgc2Vzc2lvbi4gIGBpbmNvbXBsZXRlYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiBhdCB0aGUgc3RlcCB0aGF0IHRoZSB1c2VyIGZhaWxlZCBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiwgc2tpcHBpbmcgc3RlcHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiAgYGluZmVyYCAtIElmIHRoZSBtb3N0IHJlY2VudCBJZGVudGl0eSBWZXJpZmljYXRpb24gYXR0ZW1wdCBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAgaGFzIGEgc3RhdHVzIG9mIGBmYWlsZWRgIG9yIGBleHBpcmVkYCwgcmV0cnkgdXNpbmcgdGhlIGBpbmNvbXBsZXRlYCBzdHJhdGVneS4gT3RoZXJ3aXNlLCB1c2UgdGhlIGByZXNldGAgc3RyYXRlZ3kuICBgY3VzdG9tYCAtIFN0YXJ0IHRoZSBuZXcgc2Vzc2lvbiB3aXRoIGEgY3VzdG9tIGNvbmZpZ3VyYXRpb24sIHNwZWNpZmllZCBieSB0aGUgdmFsdWUgb2YgdGhlIGBzdGVwc2AgZmllbGQgIE5vdGU6ICBUaGUgYGluY29tcGxldGVgIHN0cmF0ZWd5IGNhbm5vdCBiZSBhcHBsaWVkIGlmIHRoZSBzZXNzaW9uXFwncyBmYWlsaW5nIHN0ZXAgaXMgYHNjcmVlbmluZ2Agb3IgYHJpc2tfY2hlY2tgLiAgVGhlIGBpbmZlcmAgc3RyYXRlZ3kgY2Fubm90IGJlIGFwcGxpZWQgaWYgdGhlIHNlc3Npb25cXCdzIHN0YXR1cyBpcyBzdGlsbCBgYWN0aXZlYFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3RyYXRlZ3kge1xuICAgIFJlc2V0ID0gJ3Jlc2V0JyxcbiAgICBJbmNvbXBsZXRlID0gJ2luY29tcGxldGUnLFxuICAgIEluZmVyID0gJ2luZmVyJyxcbiAgICBDdXN0b20gPSAnY3VzdG9tJ1xufVxuXG4vKipcbiAqIENvbnRhaW5zIGRldGFpbHMgYWJvdXQgYSBzdHVkZW50IGxvYW4gYWNjb3VudFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTdHVkZW50TG9hblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0dWRlbnRMb2FuIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdGhhdCB0aGlzIGxpYWJpbGl0eSBiZWxvbmdzIHRvLiBFYWNoIGFjY291bnQgY2FuIG9ubHkgY29udGFpbiBvbmUgbGlhYmlsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGxvYW4uIEZvciBzb21lIGluc3RpdHV0aW9ucywgdGhpcyBtYXkgYmUgYSBtYXNrZWQgdmVyc2lvbiBvZiB0aGUgbnVtYmVyIChlLmcuLCB0aGUgbGFzdCA0IGRpZ2l0cyBpbnN0ZWFkIG9mIHRoZSBlbnRpcmUgbnVtYmVyKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGFjY291bnRfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlcyBvbiB3aGljaCBsb2FuZWQgZnVuZHMgd2VyZSBkaXNidXJzZWQgb3Igd2lsbCBiZSBkaXNidXJzZWQuIFRoZXNlIGFyZSBvZnRlbiBpbiB0aGUgcGFzdC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgZGlzYnVyc2VtZW50X2RhdGVzOiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB3aGVuIHRoZSBzdHVkZW50IGxvYW4gaXMgZXhwZWN0ZWQgdG8gYmUgcGFpZCBvZmYuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLiBEYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGV4cGVjdGVkX3BheW9mZl9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBndWFyYW50b3Igb2YgdGhlIHN0dWRlbnQgbG9hbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGd1YXJhbnRvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgaW50ZXJlc3QgcmF0ZSBvbiB0aGUgbG9hbiBhcyBhIHBlcmNlbnRhZ2UuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpbnRlcmVzdF9yYXRlX3BlcmNlbnRhZ2U6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBgdHJ1ZWAgaWYgYSBwYXltZW50IGlzIGN1cnJlbnRseSBvdmVyZHVlLiBBdmFpbGFiaWxpdHkgZm9yIHRoaXMgZmllbGQgaXMgbGltaXRlZC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBpc19vdmVyZHVlOiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSBsYXN0IHBheW1lbnQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3BheW1lbnRfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHBheW1lbnQuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbGFzdF9wYXltZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIGFtb3VudCBvd2VkIGFzIG9mIHRoZSBsYXN0IHN0YXRlbWVudCBpc3N1ZWRcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxhc3Rfc3RhdGVtZW50X2JhbGFuY2U/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBsYXN0IHN0YXRlbWVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBsYXN0X3N0YXRlbWVudF9pc3N1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIGxvYW4sIGUuZy4sIFxcXCJDb25zb2xpZGF0aW9uIExvYW5zXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIGxvYW5fbmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3R1ZGVudExvYW5TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbG9hbl9zdGF0dXM6IFN0dWRlbnRMb2FuU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFRoZSBtaW5pbXVtIHBheW1lbnQgZHVlIGZvciB0aGUgbmV4dCBiaWxsaW5nIGN5Y2xlLiBUaGVyZSBhcmUgc29tZSBleGNlcHRpb25zOiBTb21lIGluc3RpdHV0aW9ucyByZXF1aXJlIGEgbWluaW11bSBwYXltZW50IGFjcm9zcyBhbGwgbG9hbnMgYXNzb2NpYXRlZCB3aXRoIGFuIGFjY291bnQgbnVtYmVyLiBPdXIgQVBJIHByZXNlbnRzIHRoYXQgc2FtZSBtaW5pbXVtIHBheW1lbnQgYW1vdW50IG9uIGVhY2ggbG9hbi4gVGhlIGluc3RpdHV0aW9ucyB0aGF0IGRvIHRoaXMgYXJlOiBHcmVhdCBMYWtlcyAoIGBpbnNfMTE2ODYxYCksIEZpcnN0bWFyayAoYGluc18xMTYyOTVgKSwgQ29tbW9uYm9uZCBGaXJzdG1hcmsgU2VydmljZXMgKGBpbnNfMTE2OTUwYCksIEdyYW5pdGUgU3RhdGUgKGBpbnNfMTE2MzA4YCksIGFuZCBPa2xhaG9tYSBTdHVkZW50IExvYW4gQXV0aG9yaXR5IChgaW5zXzExNjk0NWApLiBGaXJzdG1hcmsgKGBpbnNfMTE2Mjk1YCApIGFuZCBOYXZpZW50IChgaW5zXzExNjI0OGApIHdpbGwgZGlzcGxheSBhcyAkMCBpZiB0aGVyZSBpcyBhbiBhdXRvcGF5IHByb2dyYW0gaW4gZWZmZWN0LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbWluaW11bV9wYXltZW50X2Ftb3VudDogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZHVlIGRhdGUgZm9yIHRoZSBuZXh0IHBheW1lbnQuIFRoZSBkdWUgZGF0ZSBpcyBgbnVsbGAgaWYgYSBwYXltZW50IGlzIG5vdCBleHBlY3RlZC4gQSBwYXltZW50IGlzIG5vdCBleHBlY3RlZCBpZiBgbG9hbl9zdGF0dXMudHlwZWAgaXMgYGRlZmVybWVudGAsIGBpbl9zY2hvb2xgLCBgY29uc29saWRhdGVkYCwgYHBhaWQgaW4gZnVsbGAsIG9yIGB0cmFuc2ZlcnJlZGAuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgbmV4dF9wYXltZW50X2R1ZV9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9uIHdoaWNoIHRoZSBsb2FuIHdhcyBpbml0aWFsbHkgbGVudC4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgb3JpZ2luYXRpb25fZGF0ZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYWwgcHJpbmNpcGFsIGJhbGFuY2Ugb2YgdGhlIGxvYW4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9wcmluY2lwYWxfYW1vdW50OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBkb2xsYXIgYW1vdW50IG9mIHRoZSBhY2NydWVkIGludGVyZXN0IGJhbGFuY2UuIEZvciBTYWxsaWUgTWFlICggYGluc18xMTY5NDRgKSwgdGhpcyBhbW91bnQgaXMgaW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgYmFsYW5jZSBvZiB0aGUgbG9hbiwgc28gdGhpcyBmaWVsZCB3aWxsIHJldHVybiBhcyBgbnVsbGAuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBvdXRzdGFuZGluZ19pbnRlcmVzdF9hbW91bnQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlbGV2YW50IGFjY291bnQgbnVtYmVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmVmZXJlbmNlIHRoaXMgbG9hbiBmb3IgcGF5bWVudHMuIEluIHRoZSBtYWpvcml0eSBvZiBjYXNlcywgYHBheW1lbnRfcmVmZXJlbmNlX251bWJlcmAgd2lsbCBtYXRjaCBgYWNjb3VudF9udW1iZXIsYCBidXQgaW4gc29tZSBpbnN0aXR1dGlvbnMsIHN1Y2ggYXMgR3JlYXQgTGFrZXMgKGBpbnNfMTE2ODYxYCksIGl0IHdpbGwgYmUgZGlmZmVyZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgcGF5bWVudF9yZWZlcmVuY2VfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQU0xGU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgcHNsZl9zdGF0dXM6IFBTTEZTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N0dWRlbnRSZXBheW1lbnRQbGFufVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblxuICAgICAqL1xuICAgIHJlcGF5bWVudF9wbGFuOiBTdHVkZW50UmVwYXltZW50UGxhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgc2VxdWVuY2UgbnVtYmVyIG9mIHRoZSBzdHVkZW50IGxvYW4uIEhlYXJ0bGFuZCBFQ1NJIChgaW5zXzExNjk0OGApIGRvZXMgbm90IG1ha2UgdGhpcyBmaWVsZCBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICBzZXF1ZW5jZV9udW1iZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NlcnZpY2VyQWRkcmVzc0RhdGF9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgc2VydmljZXJfYWRkcmVzczogU2VydmljZXJBZGRyZXNzRGF0YTtcbiAgICAvKipcbiAgICAgKiBUaGUgeWVhciB0byBkYXRlIChZVEQpIGludGVyZXN0IHBhaWQuIEF2YWlsYWJpbGl0eSBmb3IgdGhpcyBmaWVsZCBpcyBsaW1pdGVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuXG4gICAgICovXG4gICAgeXRkX2ludGVyZXN0X3BhaWQ6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHllYXIgdG8gZGF0ZSAoWVREKSBwcmluY2lwYWwgcGFpZC4gQXZhaWxhYmlsaXR5IGZvciB0aGlzIGZpZWxkIGlzIGxpbWl0ZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5cbiAgICAgKi9cbiAgICB5dGRfcHJpbmNpcGFsX3BhaWQ6IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIFN0dWRlbnQgbG9hbiByZXBheW1lbnQgaW5mb3JtYXRpb24gdXNlZCB0byBjb25maWd1cmUgU2FuZGJveCB0ZXN0IGRhdGEgZm9yIHRoZSBMaWFiaWxpdGllcyBwcm9kdWN0XG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblJlcGF5bWVudE1vZGVsIHtcbiAgICAvKipcbiAgICAgKiBUaGUgb25seSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIGBzdGFuZGFyZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHR5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDb25maWd1cmVzIHRoZSBudW1iZXIgb2YgbW9udGhzIGJlZm9yZSByZXBheW1lbnQgc3RhcnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFN0dWRlbnRMb2FuUmVwYXltZW50TW9kZWxcbiAgICAgKi9cbiAgICBub25fcmVwYXltZW50X21vbnRoczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIENvbmZpZ3VyZXMgdGhlIG51bWJlciBvZiBtb250aHMgb2YgcmVwYXltZW50cyBiZWZvcmUgdGhlIGxvYW4gaXMgcGFpZCBvZmYuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5SZXBheW1lbnRNb2RlbFxuICAgICAqL1xuICAgIHJlcGF5bWVudF9tb250aHM6IG51bWJlcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc3RhdHVzIG9mIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudExvYW5TdGF0dXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50TG9hblN0YXR1cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdW50aWwgd2hpY2ggdGhlIGxvYW4gd2lsbCBiZSBpbiBpdHMgY3VycmVudCBzdGF0dXMuIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tREQpLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTdHVkZW50TG9hblN0YXR1c1xuICAgICAqL1xuICAgIGVuZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0dXMgdHlwZSBvZiB0aGUgc3R1ZGVudCBsb2FuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudExvYW5TdGF0dXNcbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50TG9hblN0YXR1c1R5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRMb2FuU3RhdHVzVHlwZUVudW0ge1xuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIENoYXJnZWRPZmYgPSAnY2hhcmdlZCBvZmYnLFxuICAgIENsYWltID0gJ2NsYWltJyxcbiAgICBDb25zb2xpZGF0ZWQgPSAnY29uc29saWRhdGVkJyxcbiAgICBEZWZlcm1lbnQgPSAnZGVmZXJtZW50JyxcbiAgICBEZWxpbnF1ZW50ID0gJ2RlbGlucXVlbnQnLFxuICAgIERpc2NoYXJnZWQgPSAnZGlzY2hhcmdlZCcsXG4gICAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG4gICAgRm9yYmVhcmFuY2UgPSAnZm9yYmVhcmFuY2UnLFxuICAgIEluR3JhY2UgPSAnaW4gZ3JhY2UnLFxuICAgIEluTWlsaXRhcnkgPSAnaW4gbWlsaXRhcnknLFxuICAgIEluU2Nob29sID0gJ2luIHNjaG9vbCcsXG4gICAgTm90RnVsbHlEaXNidXJzZWQgPSAnbm90IGZ1bGx5IGRpc2J1cnNlZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhaWRJbkZ1bGwgPSAncGFpZCBpbiBmdWxsJyxcbiAgICBSZWZ1bmRlZCA9ICdyZWZ1bmRlZCcsXG4gICAgUmVwYXltZW50ID0gJ3JlcGF5bWVudCcsXG4gICAgVHJhbnNmZXJyZWQgPSAndHJhbnNmZXJyZWQnLFxuICAgIFBlbmRpbmdJZHIgPSAncGVuZGluZyBpZHInXG59XG5cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgcmVwYXltZW50IHBsYW4gZm9yIHRoZSBzdHVkZW50IGxvYW5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdHVkZW50UmVwYXltZW50UGxhbiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBheW1lbnQgcGxhbiBhcyBwcm92aWRlZCBieSB0aGUgc2VydmljZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgcmVwYXltZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3R1ZGVudFJlcGF5bWVudFBsYW5cbiAgICAgKi9cbiAgICB0eXBlOiBTdHVkZW50UmVwYXltZW50UGxhblR5cGVFbnVtO1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFN0dWRlbnRSZXBheW1lbnRQbGFuVHlwZUVudW0ge1xuICAgIEV4dGVuZGVkR3JhZHVhdGVkID0gJ2V4dGVuZGVkIGdyYWR1YXRlZCcsXG4gICAgRXh0ZW5kZWRTdGFuZGFyZCA9ICdleHRlbmRlZCBzdGFuZGFyZCcsXG4gICAgR3JhZHVhdGVkID0gJ2dyYWR1YXRlZCcsXG4gICAgSW5jb21lQ29udGluZ2VudFJlcGF5bWVudCA9ICdpbmNvbWUtY29udGluZ2VudCByZXBheW1lbnQnLFxuICAgIEluY29tZUJhc2VkUmVwYXltZW50ID0gJ2luY29tZS1iYXNlZCByZXBheW1lbnQnLFxuICAgIEluY29tZVNlbnNpdGl2ZVJlcGF5bWVudCA9ICdpbmNvbWUtc2Vuc2l0aXZlIHJlcGF5bWVudCcsXG4gICAgSW50ZXJlc3RPbmx5ID0gJ2ludGVyZXN0LW9ubHknLFxuICAgIE90aGVyID0gJ290aGVyJyxcbiAgICBQYXlBc1lvdUVhcm4gPSAncGF5IGFzIHlvdSBlYXJuJyxcbiAgICBSZXZpc2VkUGF5QXNZb3VFYXJuID0gJ3JldmlzZWQgcGF5IGFzIHlvdSBlYXJuJyxcbiAgICBTdGFuZGFyZCA9ICdzdGFuZGFyZCcsXG4gICAgU2F2aW5nT25BVmFsdWFibGVFZHVjYXRpb24gPSAnc2F2aW5nIG9uIGEgdmFsdWFibGUgZWR1Y2F0aW9uJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGZhaWx1cmUgcmVhc29uIGlmIHRoZSBzdGF0dXMgZm9yIGEgc3dlZXAgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBTd2VlcEZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2VlcEZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmYWlsdXJlIGNvZGUsIGUuZy4gYFIwMWAuICBBIGZhaWx1cmUgY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSBzd2VlcCBzdGF0dXMgaXMgYHJldHVybmVkYC4gU2VlIFtBQ0ggcmV0dXJuIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMgYW5kIFtSVFAgZXJyb3IgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNydHAtZXJyb3ItY29kZXMpIGZvciBSVFAgZXJyb3IgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgU3dlZXBGYWlsdXJlXG4gICAgICovXG4gICAgZmFpbHVyZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN3ZWVwRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHN0YXR1cyBvZiBhIHN3ZWVwIHRyYW5zZmVyICBgXFxcInBlbmRpbmdcXFwiYCAtIFRoZSBzd2VlcCBpcyBjdXJyZW50bHkgcGVuZGluZyBgXFxcInBvc3RlZFxcXCJgIC0gVGhlIHN3ZWVwIGhhcyBiZWVuIHBvc3RlZCBgXFxcInNldHRsZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgc2V0dGxlZCBgXFxcInJldHVybmVkXFxcImAgLSBUaGUgc3dlZXAgaGFzIGJlZW4gcmV0dXJuZWQgYFxcXCJmYWlsZWRcXFwiYCAtIFRoZSBzd2VlcCBoYXMgZmFpbGVkXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBTd2VlcFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHRyaWdnZXIgb2YgdGhlIHN3ZWVwICBgXFxcIm1hbnVhbFxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgbWFudWFsbHkgYnkgdGhlIGN1c3RvbWVyIGBcXFwiaW5jb21pbmdcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IGluY29taW5nIGZ1bmRzIGZsb3cgKGUuZy4gSW5jb21pbmcgV2lyZSkgYFxcXCJiYWxhbmNlX3RocmVzaG9sZFxcXCJgIC0gVGhlIHN3ZWVwIGlzIGNyZWF0ZWQgYnkgYmFsYW5jZSB0aHJlc2hvbGQgc2V0dGluZyBgXFxcImF1dG9tYXRpY19hZ2dyZWdhdGVcXFwiYCAtIFRoZSBzd2VlcCBpcyBjcmVhdGVkIGJ5IHRoZSBQbGFpZCBhdXRvbWF0aWMgYWdncmVnYXRpb24gcHJvY2Vzcy4gVGhlc2UgZnVuZHMgZGlkIG5vdCBwYXNzIHRocm91Z2ggdGhlIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gU3dlZXBUcmlnZ2VyIHtcbiAgICBNYW51YWwgPSAnbWFudWFsJyxcbiAgICBJbmNvbWluZyA9ICdpbmNvbWluZycsXG4gICAgQmFsYW5jZVRocmVzaG9sZCA9ICdiYWxhbmNlX3RocmVzaG9sZCcsXG4gICAgQXV0b21hdGljQWdncmVnYXRlID0gJ2F1dG9tYXRpY19hZ2dyZWdhdGUnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB0cmFuc2FjdGlvbnMgY2hhbmdlLiBUaGlzIGNhbiBiZSBkdWUgdG8gYW55IGV2ZW50IHJlc3VsdGluZyBpbiBuZXcgY2hhbmdlcywgc3VjaCBhcyBhbiBpbml0aWFsIDMwLWRheSB0cmFuc2FjdGlvbnMgZmV0Y2ggdXBvbiB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYW4gSXRlbSB3aXRoIHRyYW5zYWN0aW9ucywgdGhlIGJhY2tmaWxsIG9mIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIHRoYXQgb2NjdXJzIHNob3J0bHkgYWZ0ZXIsIG9yIHdoZW4gY2hhbmdlcyBhcmUgcG9wdWxhdGVkIGZyb20gYSByZWd1bGFybHktc2NoZWR1bGVkIHRyYW5zYWN0aW9ucyB1cGRhdGUgam9iLiBJdCBpcyByZWNvbW1lbmRlZCB0byBsaXN0ZW4gZm9yIHRoZSBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWAgd2ViaG9vayB3aGVuIHVzaW5nIHRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludC4gTm90ZSB0aGF0IHdoZW4gdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgdGhlIG9sZGVyIHdlYmhvb2tzIGBJTklUSUFMX1VQREFURWAsIGBISVNUT1JJQ0FMX1VQREFURWAsIGBERUZBVUxUX1VQREFURWAsIGFuZCBgVFJBTlNBQ1RJT05TX1JFTU9WRURgLCB3aGljaCBhcmUgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIGAvdHJhbnNhY3Rpb25zL2dldGAsIHdpbGwgYWxzbyBjb250aW51ZSB0byBiZSBzZW50IGluIG9yZGVyIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGxpc3RlbiBmb3IgYW5kIHJlc3BvbmQgdG8gdGhvc2Ugd2ViaG9va3Mgd2hlbiB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIEFmdGVyIHJlY2VpcHQgb2YgdGhpcyB3ZWJob29rLCB0aGUgbmV3IGNoYW5nZXMgY2FuIGJlIGZldGNoZWQgZm9yIHRoZSBJdGVtIGZyb20gYC90cmFuc2FjdGlvbnMvc3luY2AuICBOb3RlIHRoYXQgdG8gcmVjZWl2ZSB0aGlzIHdlYmhvb2sgZm9yIGFuIEl0ZW0sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG11c3QgaGF2ZSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlIG9uIHRoYXQgSXRlbS4gVGhpcyBtZWFucyB0aGF0LCB1bmxpa2UgdGhlIGBJTklUSUFMX1VQREFURWAgYW5kIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9va3MsIGl0IHdpbGwgbm90IGZpcmUgaW1tZWRpYXRlbHkgdXBvbiBJdGVtIGNyZWF0aW9uLiBJZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBpcyBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IHdhcyAqbm90KiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucywgdGhlIHdlYmhvb2sgd2lsbCBmaXJlIHR3aWNlOiBvbmNlIHRoZSBmaXJzdCAzMCBkYXlzIG9mIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQsIGFuZCBhIHNlY29uZCB0aW1lIHdoZW4gYWxsIGF2YWlsYWJsZSBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBkYXRhIGhhcyBiZWVuIGZldGNoZWQuICBUaGlzIHdlYmhvb2sgd2lsbCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50IGFzIGl0IHdvdWxkIGluIFByb2R1Y3Rpb24uIEl0IGNhbiBhbHNvIGJlIG1hbnVhbGx5IHRyaWdnZXJlZCBpbiBTYW5kYm94IGJ5IGNhbGxpbmcgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgVFJBTlNBQ1RJT05TYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBTWU5DX1VQREFURVNfQVZBSUxBQkxFYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIGlmIGluaXRpYWwgcHVsbCBpbmZvcm1hdGlvbiAobW9zdCByZWNlbnQgMzAgZGF5cyBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5KSBpcyBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFN5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9va1xuICAgICAqL1xuICAgIGluaXRpYWxfdXBkYXRlX2NvbXBsZXRlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRlcyBpZiBoaXN0b3JpY2FsIHB1bGwgaW5mb3JtYXRpb24gKG1heGltdW0gdHJhbnNhY3Rpb24gaGlzdG9yeSByZXF1ZXN0ZWQsIHVwIHRvIDIgeWVhcnMpIGlzIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogRmllbGQgY29udGFpbmluZyB0aGUgZGF0YSB1c2VkIGluIGRldGVybWluaW5nIHRoZSBvdXRjb21lIG9mIGEgc3ludGhldGljIGZyYXVkIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFN5bnRoZXRpY0ZyYXVkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhldGljRnJhdWQge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSaXNrTGV2ZWx9XG4gICAgICogQG1lbWJlcm9mIFN5bnRoZXRpY0ZyYXVkXG4gICAgICovXG4gICAgcmlza19sZXZlbDogUmlza0xldmVsO1xufVxuLyoqXG4gKiBEYXRhIGFib3V0IGFuIG9mZmljaWFsIGRvY3VtZW50IHVzZWQgdG8gcmVwb3J0IHRoZSB1c2VyXFwncyBpbmNvbWUgdG8gdGhlIElSUy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVGF4Zm9ybVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRheGZvcm0ge1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgb2YgdGhlIGRvY3VtZW50IHJlZmVyZW5jZWQgYnkgdGhlIGRvY3VtZW50IG1ldGFkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICBkb2NfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgdGF4IGRvY3VtZW50LiBDdXJyZW50bHksIHRoZSBvbmx5IHN1cHBvcnRlZCB2YWx1ZSBpcyBgdzJgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheGZvcm1cbiAgICAgKi9cbiAgICBkb2N1bWVudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1cyfVxuICAgICAqIEBtZW1iZXJvZiBUYXhmb3JtXG4gICAgICovXG4gICAgdzI/OiBXMjtcbn1cbi8qKlxuICogVGF4cGF5ZXIgSUQgb2YgdGhlIGluZGl2aWR1YWwgcmVjZWl2aW5nIHRoZSBwYXlzdHViLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklEXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJRCB7XG4gICAgLyoqXG4gICAgICogVHlwZSBvZiBJRCwgZS5nLiBcXCdTU05cXCdcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklEXG4gICAgICovXG4gICAgaWRfdHlwZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSUQgbWFzazsgaS5lLiBsYXN0IDQgZGlnaXRzIG9mIHRoZSB0YXhwYXllciBJRFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRheHBheWVySURcbiAgICAgKi9cbiAgICBpZF9tYXNrPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBMYXN0IDQgZGlnaXRzIG9mIHVuaXF1ZSBudW1iZXIgb2YgSUQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJRFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbGFzdF80X2RpZ2l0cz86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBUYXhwYXllciBpZGVudGlmaWNhdGlvbiB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5LkluZm9ybWF0aW9uIGFib3V0IHRoZSBUYXhwYXllciBpZGVudGlmaWNhdGlvbiB2YWx1ZXMgYXNzaWduZWQgdG8gdGhlIGluZGl2aWR1YWwgb3IgbGVnYWwgZW50aXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUYXhwYXllcklkZW50aWZpZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUYXhwYXllcklkZW50aWZpZXJcbiAgICAgKi9cbiAgICBUYXhwYXllcklkZW50aWZpZXJUeXBlOiBUYXhwYXllcklkZW50aWZpZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHRheHBheWVyIGlkZW50aWZpZXIgYXMgYXNzaWduZWQgYnkgdGhlIElSUyB0byB0aGUgaW5kaXZpZHVhbCBvciBsZWdhbCBlbnRpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyXG4gICAgICovXG4gICAgVGF4cGF5ZXJJZGVudGlmaWVyVmFsdWU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIEEgdmFsdWUgZnJvbSBhIE1JU01PIHByZXNjcmliZWQgbGlzdCB0aGF0IGNsYXNzaWZpZXMgaWRlbnRpZmljYXRpb24gbnVtYmVycyB1c2VkIGJ5IHRoZSBJbnRlcm5hbCBSZXZlbnVlIFNlcnZpY2UgKElSUykgaW4gdGhlIGFkbWluaXN0cmF0aW9uIG9mIHRheCBsYXdzLiBBIFNvY2lhbCBTZWN1cml0eSBudW1iZXIgKFNTTikgaXMgaXNzdWVkIGJ5IHRoZSBTU0E7IGFsbCBvdGhlciB0YXhwYXllciBpZGVudGlmaWNhdGlvbiBudW1iZXJzIGFyZSBpc3N1ZWQgYnkgdGhlIElSUy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRheHBheWVySWRlbnRpZmllclR5cGUge1xuICAgIEluZGl2aWR1YWxUYXhwYXllcklkZW50aWZpY2F0aW9uTnVtYmVyID0gJ0luZGl2aWR1YWxUYXhwYXllcklkZW50aWZpY2F0aW9uTnVtYmVyJyxcbiAgICBTb2NpYWxTZWN1cml0eU51bWJlciA9ICdTb2NpYWxTZWN1cml0eU51bWJlcidcbn1cblxuLyoqXG4gKiBUaGUgY29sbGVjdGlvbiBvZiBUQVhQQVlFUl9JREVOVElGSUNBVElPTiBlbGVtZW50c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUYXhwYXllcklkZW50aWZpZXJzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGF4cGF5ZXJJZGVudGlmaWVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RheHBheWVySWRlbnRpZmllcn1cbiAgICAgKiBAbWVtYmVyb2YgVGF4cGF5ZXJJZGVudGlmaWVyc1xuICAgICAqL1xuICAgIFRBWFBBWUVSX0lERU5USUZJRVI6IFRheHBheWVySWRlbnRpZmllcjtcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyBib3RoIHRoZSBjdXJyZW50IHBheSBwZXJpb2QgYW5kIHllYXIgdG8gZGF0ZSBhbW91bnQgZm9yIGEgY2F0ZWdvcnkuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWwge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqL1xuICAgIGNhbm9uaWNhbF9kZXNjcmlwdGlvbj86IFRvdGFsQ2Fub25pY2FsRGVzY3JpcHRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRleHQgb2YgdGhlIGxpbmUgaXRlbSBhcyBwcmludGVkIG9uIHRoZSBwYXlzdHViLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXl9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjdXJyZW50X3BheT86IFBheTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGF5fVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgeXRkX3BheT86IFBheTtcbn1cbi8qKlxuICogQ29tbW9ubHkgdXNlZCB0ZXJtIHRvIGRlc2NyaWJlIHRoZSBsaW5lIGl0ZW0uXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUb3RhbENhbm9uaWNhbERlc2NyaXB0aW9uIHtcbiAgICBCb251cyA9ICdCT05VUycsXG4gICAgQ29tbWlzc2lvbiA9ICdDT01NSVNTSU9OJyxcbiAgICBPdmVydGltZSA9ICdPVkVSVElNRScsXG4gICAgUGFpZFRpbWVPZmYgPSAnUEFJRCBUSU1FIE9GRicsXG4gICAgUmVndWxhclBheSA9ICdSRUdVTEFSIFBBWScsXG4gICAgVmFjYXRpb24gPSAnVkFDQVRJT04nLFxuICAgIEVtcGxveWVlTWVkaWNhcmUgPSAnRU1QTE9ZRUUgTUVESUNBUkUnLFxuICAgIEZpY2EgPSAnRklDQScsXG4gICAgU29jaWFsU2VjdXJpdHlFbXBsb3llZVRheCA9ICdTT0NJQUwgU0VDVVJJVFkgRU1QTE9ZRUUgVEFYJyxcbiAgICBNZWRpY2FsID0gJ01FRElDQUwnLFxuICAgIFZpc2lvbiA9ICdWSVNJT04nLFxuICAgIERlbnRhbCA9ICdERU5UQUwnLFxuICAgIE5ldFBheSA9ICdORVQgUEFZJyxcbiAgICBUYXhlcyA9ICdUQVhFUycsXG4gICAgTm90Rm91bmQgPSAnTk9UX0ZPVU5EJyxcbiAgICBPdGhlciA9ICdPVEhFUicsXG4gICAgTnVsbCA9ICdudWxsJ1xufVxuXG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgdGltZSBwZXJpb2Qgb2YgdGhlIHJlcG9ydC4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGRlYml0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDMwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbEluZmxvd0Ftb3VudDMwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50MzBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50MzBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBkZWJpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgbGFzdCA2MCBkYXlzLiBUaGlzIGZpZWxkIHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQ2MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbEluZmxvd0Ftb3VudDYwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDYwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsSW5mbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgZGViaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIGxhc3QgOTAgZGF5cy4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsSW5mbG93QW1vdW50OTBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxJbmZsb3dBbW91bnQ5MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxJbmZsb3dBbW91bnQ5MGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbEluZmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCBhYm91dCB0aGUgdG90YWwgbW9udGhseSBpbmNvbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxNb250aGx5SW5jb21lSW5zaWdodHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0cyB7XG4gICAgLyoqXG4gICAgICogVGhlIGFnZ3JlZ2F0ZWQgaW5jb21lIGZvciB0aGUgMzAgZGF5cyBwcmlvciB0byBzdWJzY3JpcHRpb24gZGF0ZVxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsTW9udGhseUluY29tZUluc2lnaHRzXG4gICAgICovXG4gICAgYmFzZWxpbmVfYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGFnZ3JlZ2F0ZWQgaW5jb21lIG9mIHRoZSBsYXN0IDMwIGRheXNcbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE1vbnRobHlJbmNvbWVJbnNpZ2h0c1xuICAgICAqL1xuICAgIGN1cnJlbnRfYW1vdW50OiBudW1iZXI7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIHRpbWUgcGVyaW9kIG9mIHRoZSByZXBvcnQuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50XG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVG90YWwgYW1vdW50IG9mIGNyZWRpdCB0cmFuc2FjdGlvbnMgaW50byB0aGUgYWNjb3VudCBpbiB0aGUgbGFzdCAzMCBkYXlzLiBUaGlzIGZpZWxkIHdpbGwgYmUgZW1wdHkgZm9yIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzLiBUaGlzIGZpZWxkIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IFVTRCB0cmFuc2FjdGlvbnMgZnJvbSB0aGUgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVG90YWxPdXRmbG93QW1vdW50MzBkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG90YWxPdXRmbG93QW1vdW50MzBkIHtcbiAgICAvKipcbiAgICAgKiBWYWx1ZSBvZiBhbW91bnQgd2l0aCB1cCB0byAyIGRlY2ltYWwgcGxhY2VzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDMwZFxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSBhbW91bnQgb3IgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgYW1vdW50IG9yIGJhbGFuY2UuIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQzMGRcbiAgICAgKi9cbiAgICB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRvdGFsIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNhY3Rpb25zIGludG8gdGhlIGFjY291bnQgaW4gdGhlIGxhc3QgNjAgZGF5cy4gVGhpcyBmaWVsZCB3aWxsIGJlIGVtcHR5IGZvciBub24tZGVwb3NpdG9yeSBhY2NvdW50cy4gVGhpcyBmaWVsZCBvbmx5IHRha2VzIGludG8gYWNjb3VudCBVU0QgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRvdGFsT3V0Zmxvd0Ftb3VudDYwZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRvdGFsT3V0Zmxvd0Ftb3VudDYwZCB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgYW1vdW50IHdpdGggdXAgdG8gMiBkZWNpbWFsIHBsYWNlcy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUb3RhbE91dGZsb3dBbW91bnQ2MGRcbiAgICAgKi9cbiAgICBhbW91bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50IG9yIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFtb3VudCBvciBiYWxhbmNlLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLW51bGwuIFVub2ZmaWNpYWwgY3VycmVuY3kgY29kZXMgYXJlIHVzZWQgZm9yIGN1cnJlbmNpZXMgdGhhdCBkbyBub3QgaGF2ZSBvZmZpY2lhbCBJU08gY3VycmVuY3kgY29kZXMsIHN1Y2ggYXMgY3J5cHRvY3VycmVuY2llcyBhbmQgdGhlIGN1cnJlbmNpZXMgb2YgY2VydGFpbiBjb3VudHJpZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50NjBkXG4gICAgICovXG4gICAgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUb3RhbCBhbW91bnQgb2YgY3JlZGl0IHRyYW5zYWN0aW9ucyBpbnRvIHRoZSBhY2NvdW50IGluIHRoZSBsYXN0IDkwIGRheXMuIFRoaXMgZmllbGQgd2lsbCBiZSBlbXB0eSBmb3Igbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMuIFRoaXMgZmllbGQgb25seSB0YWtlcyBpbnRvIGFjY291bnQgVVNEIHRyYW5zYWN0aW9ucyBmcm9tIHRoZSBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ5MGRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUb3RhbE91dGZsb3dBbW91bnQ5MGQge1xuICAgIC8qKlxuICAgICAqIFZhbHVlIG9mIGFtb3VudCB3aXRoIHVwIHRvIDIgZGVjaW1hbCBwbGFjZXMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVG90YWxPdXRmbG93QW1vdW50OTBkXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTyA0MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGFtb3VudCBvciBiYWxhbmNlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bm9mZmljaWFsIGN1cnJlbmN5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbW91bnQgb3IgYmFsYW5jZS4gQWx3YXlzIGBudWxsYCBpZiBgaXNvX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRvdGFsT3V0Zmxvd0Ftb3VudDkwZFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb24ge1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgYWNjb3VudCBpbiB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIG9jY3VycmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBGb3IgYWxsIHByb2R1Y3RzIGV4Y2VwdCBJbmNvbWU6IFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS4gRm9yIEluY29tZSBlbmRwb2ludHMsIHZhbHVlcyBhcmUgcG9zaXRpdmUgd2hlbiByZXByZXNlbnRpbmcgaW5jb21lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1udWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy4gIFNlZSB0aGUgW2N1cnJlbmN5IGNvZGUgc2NoZW1hXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9hY2NvdW50cyNjdXJyZW5jeS1jb2RlLXNjaGVtYSkgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIHN1cHBvcnRlZCBgaXNvX2N1cnJlbmN5X2NvZGVgcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjYXRlZ29yeTogQXJyYXk8c3RyaW5nPiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjaGVjayBudW1iZXIgb2YgdGhlIHRyYW5zYWN0aW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciBjaGVjayB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBjaGVja19udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZvciBwZW5kaW5nIHRyYW5zYWN0aW9ucywgdGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gb2NjdXJyZWQ7IGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQuIEJvdGggZGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLiBUbyByZWNlaXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkYXRlIHRoYXQgYSBwb3N0ZWQgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRlYCBmaWVsZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9jYXRpb246IExvY2F0aW9uO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lIG9yIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLiAgIE5vdGU6IFRoaXMgaXMgYSBsZWdhY3kgZmllbGQgdGhhdCBpcyBub3QgYWN0aXZlbHkgbWFpbnRhaW5lZC4gVXNlIGBtZXJjaGFudF9uYW1lYCBpbnN0ZWFkIGZvciB0aGUgbWVyY2hhbnQgbmFtZS4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGEgVHJhbnNhY3Rpb25zIGVuZHBvaW50IHN1Y2ggYXMgYC90cmFuc2FjdGlvbnMvc3luY2Agb3IgYC90cmFuc2FjdGlvbnMvZ2V0YCwgdGhpcyBmaWVsZCB3aWxsIGFsd2F5cyBhcHBlYXIuIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUsIGFzIGVucmljaGVkIGJ5IFBsYWlkIGZyb20gdGhlIGBuYW1lYCBmaWVsZC4gVGhpcyBpcyB0eXBpY2FsbHkgYSBtb3JlIGh1bWFuLXJlYWRhYmxlIHZlcnNpb24gb2YgdGhlIG1lcmNoYW50IGNvdW50ZXJwYXJ0eSBpbiB0aGUgdHJhbnNhY3Rpb24uIEZvciBzb21lIGJhbmsgdHJhbnNhY3Rpb25zIChzdWNoIGFzIGNoZWNrcyBvciBhY2NvdW50IHRyYW5zZmVycykgd2hlcmUgdGhlcmUgaXMgbm8gbWVhbmluZ2Z1bCBtZXJjaGFudCBuYW1lLCB0aGlzIHZhbHVlIHdpbGwgYmUgYG51bGxgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbWVyY2hhbnRfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHN0cmluZyByZXR1cm5lZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uIHRvIGRlc2NyaWJlIHRoZSB0cmFuc2FjdGlvbi4gRm9yIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBiZSBpbmNsdWRlZCBpZiB0aGUgY2xpZW50IGhhcyBzZXQgYG9wdGlvbnMuaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbmAgdG8gYHRydWVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwYXltZW50X21ldGE6IFBheW1lbnRNZXRhO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCBpZGVudGlmaWVzIHRoZSB0cmFuc2FjdGlvbiBhcyBwZW5kaW5nIG9yIHVuc2V0dGxlZC4gUGVuZGluZyB0cmFuc2FjdGlvbiBkZXRhaWxzIChuYW1lLCB0eXBlLCBhbW91bnQsIGNhdGVnb3J5IElEKSBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IGFyZSBzZXR0bGVkLiBOb3QgYWxsIGluc3RpdHV0aW9ucyBwcm92aWRlIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZW5kaW5nX3RyYW5zYWN0aW9uX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgaXMgbm90IHR5cGljYWxseSBwb3B1bGF0ZWQgYW5kIG9ubHkgcmVsZXZhbnQgd2hlbiBkZWFsaW5nIHdpdGggc3ViLWFjY291bnRzLiBBIHN1Yi1hY2NvdW50IG1vc3QgY29tbW9ubHkgZXhpc3RzIGluIGNhc2VzIHdoZXJlIGEgc2luZ2xlIGFjY291bnQgaXMgbGlua2VkIHRvIG11bHRpcGxlIGNhcmRzLCBlYWNoIHdpdGggaXRzIG93biBjYXJkIG51bWJlciBhbmQgY2FyZCBob2xkZXIgbmFtZTsgZWFjaCBjYXJkIHdpbGwgYmUgY29uc2lkZXJlZCBhIHN1Yi1hY2NvdW50LiBJZiB0aGUgYWNjb3VudCBkb2VzIGhhdmUgc3ViLWFjY291bnRzLCB0aGlzIGZpZWxkIHdpbGwgdHlwaWNhbGx5IGJlIHNvbWUgY29tYmluYXRpb24gb2YgdGhlIHN1Yi1hY2NvdW50IG93bmVyXFwncyBuYW1lIGFuZC9vciB0aGUgc3ViLWFjY291bnQgbWFzay4gVGhlIGZvcm1hdCBvZiB0aGlzIGZpZWxkIGlzIG5vdCBzdGFuZGFyZGl6ZWQgYW5kIHdpbGwgdmFyeSBiYXNlZCBvbiBpbnN0aXR1dGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBJRCBvZiB0aGUgdHJhbnNhY3Rpb24uIExpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCB0aGUgYHRyYW5zYWN0aW9uX2lkYCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxlYXNlIHVzZSB0aGUgYHBheW1lbnRfY2hhbm5lbGAgZmllbGQsIGB0cmFuc2FjdGlvbl90eXBlYCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gIGBkaWdpdGFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgcGxhY2U6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBzcGVjaWFsOmAgdHJhbnNhY3Rpb25zIHRoYXQgcmVsYXRlIHRvIGJhbmtzLCBlLmcuIGZlZXMgb3IgZGVwb3NpdHMuICBgdW5yZXNvbHZlZDpgIHRyYW5zYWN0aW9ucyB0aGF0IGRvIG5vdCBmaXQgaW50byB0aGUgb3RoZXIgdGhyZWUgdHlwZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYSBsb2dvIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuIFRoZSBsb2dvIHdpbGwgYWx3YXlzIGJlIDEwMMOXMTAwIHBpeGVsIFBORyBmaWxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgbG9nb191cmw/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zYWN0aW9uLCBpZiBhdmFpbGFibGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZC4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZWAgZmllbGQgd2lsbCBpbmRpY2F0ZSB0aGUgcG9zdGVkIGRhdGUsIGJ1dCBgYXV0aG9yaXplZF9kYXRlYCB3aWxsIGluZGljYXRlIHRoZSBkYXkgdGhlIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uIElmIHByZXNlbnRpbmcgdHJhbnNhY3Rpb25zIHRvIHRoZSB1c2VyIGluIGEgVUksIHRoZSBgYXV0aG9yaXplZF9kYXRlYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZWAgZmllbGQgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIGFzIGl0IHdpbGwgZ2VuZXJhbGx5IHJlcHJlc2VudCB0aGUgZGF0ZSB0aGUgdXNlciBhY3R1YWxseSBtYWRlIHRoZSB0cmFuc2FjdGlvbi4gRGF0ZXMgYXJlIHJldHVybmVkIGluIGFuIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREYCApLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGF1dGhvcml6ZWRfZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGF0ZSBhbmQgdGltZSB3aGVuIGEgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERFRISDptbTpzc1pgICkuIEZvciB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCByYXRoZXIgdGhhbiBwb3N0ZWQsIHNlZSB0aGUgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIGZpZWxkLiAgVGhpcyBmaWVsZCBpcyByZXR1cm5lZCBmb3Igc2VsZWN0IGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgYW5kIGNvbWVzIGFzIHByb3ZpZGVkIGJ5IHRoZSBpbnN0aXR1dGlvbi4gSXQgbWF5IGNvbnRhaW4gZGVmYXVsdCB0aW1lIHZhbHVlcyAoc3VjaCBhcyAwMDowMDowMCkuIFRoaXMgZmllbGQgaXMgb25seSBwb3B1bGF0ZWQgaW4gQVBJIHZlcnNpb24gMjAxOS0wNS0yOSBhbmQgbGF0ZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBkYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hhbm5lbCB1c2VkIHRvIG1ha2UgYSBwYXltZW50LiBgb25saW5lOmAgdHJhbnNhY3Rpb25zIHRoYXQgdG9vayBwbGFjZSBvbmxpbmUuICBgaW4gc3RvcmU6YCB0cmFuc2FjdGlvbnMgdGhhdCB3ZXJlIG1hZGUgYXQgYSBwaHlzaWNhbCBsb2NhdGlvbi4gIGBvdGhlcjpgIHRyYW5zYWN0aW9ucyB0aGF0IHJlbGF0ZSB0byBiYW5rcywgZS5nLiBmZWVzIG9yIGRlcG9zaXRzLiAgVGhpcyBmaWVsZCByZXBsYWNlcyB0aGUgYHRyYW5zYWN0aW9uX3R5cGVgIGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BlcnNvbmFsRmluYW5jZUNhdGVnb3J5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBQZXJzb25hbEZpbmFuY2VDYXRlZ29yeSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uQ29kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5X2ljb25fdXJsPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb3VudGVycGFydGllcyBwcmVzZW50IGluIHRoZSB0cmFuc2FjdGlvbi4gQ291bnRlcnBhcnRpZXMsIHN1Y2ggYXMgdGhlIG1lcmNoYW50IG9yIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24sIGFyZSBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY291bnRlcnBhcnRpZXM/OiBBcnJheTxUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eT47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUsIHN0YWJsZSwgUGxhaWQtZ2VuZXJhdGVkIElEIHRoYXQgbWFwcyB0byB0aGUgbWVyY2hhbnQuIEluIHRoZSBjYXNlIG9mIGEgbWVyY2hhbnQgd2l0aCBtdWx0aXBsZSByZXRhaWwgbG9jYXRpb25zLCB0aGlzIGZpZWxkIHdpbGwgbWFwIHRvIHRoZSBicm9hZGVyIG1lcmNoYW50LCBub3QgYSBzcGVjaWZpYyBsb2NhdGlvbiBvciBzdG9yZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25UcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25QYXltZW50Q2hhbm5lbEVudW0ge1xuICAgIE9ubGluZSA9ICdvbmxpbmUnLFxuICAgIEluU3RvcmUgPSAnaW4gc3RvcmUnLFxuICAgIE90aGVyID0gJ290aGVyJ1xufVxuXG4vKipcbiAqIFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkFsbE9mXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25BbGxPZiB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgdGhhdCB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQuIEZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCB0aGUgYGRhdGVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZWAgd2lsbCBpbmRpY2F0ZSB0aGUgZGF5IHRoZSB0cmFuc2FjdGlvbiB3YXMgYXV0aG9yaXplZCBieSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBJZiBwcmVzZW50aW5nIHRyYW5zYWN0aW9ucyB0byB0aGUgdXNlciBpbiBhIFVJLCB0aGUgYGF1dGhvcml6ZWRfZGF0ZWAsIHdoZW4gYXZhaWxhYmxlLCBpcyBnZW5lcmFsbHkgcHJlZmVyYWJsZSB0byB1c2Ugb3ZlciB0aGUgYGRhdGVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uIERhdGVzIGFyZSByZXR1cm5lZCBpbiBhbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKCBgWVlZWS1NTS1ERGAgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERhdGUgYW5kIHRpbWUgd2hlbiBhIHRyYW5zYWN0aW9uIHdhcyBhdXRob3JpemVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIHdpbGwgaW5kaWNhdGUgdGhlIHBvc3RlZCBkYXRlLCBidXQgYGF1dGhvcml6ZWRfZGF0ZXRpbWVgIHdpbGwgaW5kaWNhdGUgdGhlIGRheSB0aGUgdHJhbnNhY3Rpb24gd2FzIGF1dGhvcml6ZWQgYnkgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gSWYgcHJlc2VudGluZyB0cmFuc2FjdGlvbnMgdG8gdGhlIHVzZXIgaW4gYSBVSSwgdGhlIGBhdXRob3JpemVkX2RhdGV0aW1lYCwgd2hlbiBhdmFpbGFibGUsIGlzIGdlbmVyYWxseSBwcmVmZXJhYmxlIHRvIHVzZSBvdmVyIHRoZSBgZGF0ZXRpbWVgIGZpZWxkIGZvciBwb3N0ZWQgdHJhbnNhY3Rpb25zLCBhcyBpdCB3aWxsIGdlbmVyYWxseSByZXByZXNlbnQgdGhlIGRhdGUgdGhlIHVzZXIgYWN0dWFsbHkgbWFkZSB0aGUgdHJhbnNhY3Rpb24uICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgYXV0aG9yaXplZF9kYXRldGltZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSB0cmFuc2FjdGlvbiB3YXMgcG9zdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gRm9yIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQsIHJhdGhlciB0aGFuIHBvc3RlZCwgc2VlIHRoZSBgYXV0aG9yaXplZF9kYXRldGltZWAgZmllbGQuICBUaGlzIGZpZWxkIGlzIHJldHVybmVkIGZvciBzZWxlY3QgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBhbmQgY29tZXMgYXMgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBJdCBtYXkgY29udGFpbiBkZWZhdWx0IHRpbWUgdmFsdWVzIChzdWNoIGFzIDAwOjAwOjAwKS4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBpbiBBUEkgdmVyc2lvbiAyMDE5LTA1LTI5IGFuZCBsYXRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkFsbE9mXG4gICAgICovXG4gICAgZGF0ZXRpbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNoYW5uZWwgdXNlZCB0byBtYWtlIGEgcGF5bWVudC4gYG9ubGluZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHRvb2sgcGxhY2Ugb25saW5lLiAgYGluIHN0b3JlOmAgdHJhbnNhY3Rpb25zIHRoYXQgd2VyZSBtYWRlIGF0IGEgcGh5c2ljYWwgbG9jYXRpb24uICBgb3RoZXI6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIFRoaXMgZmllbGQgcmVwbGFjZXMgdGhlIGB0cmFuc2FjdGlvbl90eXBlYCBmaWVsZC4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBheW1lbnRfY2hhbm5lbDogVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnl9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbkNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQWxsT2ZcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9jb2RlOiBUcmFuc2FjdGlvbkNvZGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBVUkwgb2YgYW4gaWNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHByaW1hcnkgcGVyc29uYWwgZmluYW5jZSBjYXRlZ29yeS4gVGhlIGljb24gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfaWNvbl91cmw/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0aWVzIHByZXNlbnQgaW4gdGhlIHRyYW5zYWN0aW9uLiBDb3VudGVycGFydGllcywgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgYXJlIGV4dHJhY3RlZCBieSBQbGFpZCBmcm9tIHRoZSByYXcgZGVzY3JpcHRpb24uXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0aWVzPzogQXJyYXk8VHJhbnNhY3Rpb25Db3VudGVycGFydHk+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIG1lcmNoYW50LiBJbiB0aGUgY2FzZSBvZiBhIG1lcmNoYW50IHdpdGggbXVsdGlwbGUgcmV0YWlsIGxvY2F0aW9ucywgdGhpcyBmaWVsZCB3aWxsIG1hcCB0byB0aGUgYnJvYWRlciBtZXJjaGFudCwgbm90IGEgc3BlY2lmaWMgbG9jYXRpb24gb3Igc3RvcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25BbGxPZlxuICAgICAqL1xuICAgIG1lcmNoYW50X2VudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25BbGxPZlBheW1lbnRDaGFubmVsRW51bSB7XG4gICAgT25saW5lID0gJ29ubGluZScsXG4gICAgSW5TdG9yZSA9ICdpbiBzdG9yZScsXG4gICAgT3RoZXIgPSAnb3RoZXInXG59XG5cbi8qKlxuICogQSByZXByZXNlbnRhdGlvbiBvZiBhIHRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQmFzZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBhY2NvdW50IGluIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gb2NjdXJyZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVkIHZhbHVlIG9mIHRoZSB0cmFuc2FjdGlvbiwgZGVub21pbmF0ZWQgaW4gdGhlIHRyYW5zYWN0aW9uc1xcJ3MgY3VycmVuY3ksIGFzIHN0YXRlZCBpbiBgaXNvX2N1cnJlbmN5X2NvZGVgIG9yIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgLiBGb3IgYWxsIHByb2R1Y3RzIGV4Y2VwdCBJbmNvbWU6IFBvc2l0aXZlIHZhbHVlcyB3aGVuIG1vbmV5IG1vdmVzIG91dCBvZiB0aGUgYWNjb3VudDsgbmVnYXRpdmUgdmFsdWVzIHdoZW4gbW9uZXkgbW92ZXMgaW4uIEZvciBleGFtcGxlLCBkZWJpdCBjYXJkIHB1cmNoYXNlcyBhcmUgcG9zaXRpdmU7IGNyZWRpdCBjYXJkIHBheW1lbnRzLCBkaXJlY3QgZGVwb3NpdHMsIGFuZCByZWZ1bmRzIGFyZSBuZWdhdGl2ZS4gRm9yIEluY29tZSBlbmRwb2ludHMsIHZhbHVlcyBhcmUgcG9zaXRpdmUgd2hlbiByZXByZXNlbnRpbmcgaW5jb21lLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBjdXJyZW5jeSBjb2RlIG9mIHRoZSB0cmFuc2FjdGlvbi4gQWx3YXlzIGBudWxsYCBpZiBgdW5vZmZpY2lhbF9jdXJyZW5jeV9jb2RlYCBpcyBub24tbnVsbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhbnNhY3Rpb24uIEFsd2F5cyBgbnVsbGAgaWYgYGlzb19jdXJyZW5jeV9jb2RlYCBpcyBub24tYG51bGxgLiBVbm9mZmljaWFsIGN1cnJlbmN5IGNvZGVzIGFyZSB1c2VkIGZvciBjdXJyZW5jaWVzIHRoYXQgZG8gbm90IGhhdmUgb2ZmaWNpYWwgSVNPIGN1cnJlbmN5IGNvZGVzLCBzdWNoIGFzIGNyeXB0b2N1cnJlbmNpZXMgYW5kIHRoZSBjdXJyZW5jaWVzIG9mIGNlcnRhaW4gY291bnRyaWVzLiAgU2VlIHRoZSBbY3VycmVuY3kgY29kZSBzY2hlbWFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2FjY291bnRzI2N1cnJlbmN5LWNvZGUtc2NoZW1hKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2Ygc3VwcG9ydGVkIGBpc29fY3VycmVuY3lfY29kZWBzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGhpZXJhcmNoaWNhbCBhcnJheSBvZiB0aGUgY2F0ZWdvcmllcyB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIEZvciBhIGZ1bGwgbGlzdCBvZiBjYXRlZ29yaWVzLCBzZWUgW2AvY2F0ZWdvcmllcy9nZXRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIFRyYW5zYWN0aW9ucyBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCBpbnN0ZWFkIG9mIGBjYXRlZ29yeWAsIGFzIGl0IHByb3ZpZGVzIGdyZWF0ZXIgYWNjdXJhY3kgYW5kIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbi4gIElmIHRoZSBgdHJhbnNhY3Rpb25zYCBvYmplY3Qgd2FzIHJldHVybmVkIGJ5IGFuIEFzc2V0cyBlbmRwb2ludCBzdWNoIGFzIGAvYXNzZXRfcmVwb3J0L2dldC9gIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgb25seSBhcHBlYXIgaW4gYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk/OiBBcnJheTxzdHJpbmc+IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gRm9yIGEgZnVsbCBsaXN0IG9mIGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuICBBbGwgVHJhbnNhY3Rpb25zIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgZ3JlYXRlciBhY2N1cmFjeSBhbmQgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGNhdGVnb3J5X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY2hlY2sgbnVtYmVyIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgY2hlY2sgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGNoZWNrX251bWJlcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRm9yIHBlbmRpbmcgdHJhbnNhY3Rpb25zLCB0aGUgZGF0ZSB0aGF0IHRoZSB0cmFuc2FjdGlvbiBvY2N1cnJlZDsgZm9yIHBvc3RlZCB0cmFuc2FjdGlvbnMsIHRoZSBkYXRlIHRoYXQgdGhlIHRyYW5zYWN0aW9uIHBvc3RlZC4gQm90aCBkYXRlcyBhcmUgcmV0dXJuZWQgaW4gYW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0ICggYFlZWVktTU0tRERgICkuIFRvIHJlY2VpdmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRhdGUgdGhhdCBhIHBvc3RlZCB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLCBzZWUgdGhlIGBhdXRob3JpemVkX2RhdGVgIGZpZWxkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7TG9jYXRpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGxvY2F0aW9uPzogTG9jYXRpb247XG4gICAgLyoqXG4gICAgICogVGhlIG1lcmNoYW50IG5hbWUgb3IgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24uICAgTm90ZTogVGhpcyBpcyBhIGxlZ2FjeSBmaWVsZCB0aGF0IGlzIG5vdCBhY3RpdmVseSBtYWludGFpbmVkLiBVc2UgYG1lcmNoYW50X25hbWVgIGluc3RlYWQgZm9yIHRoZSBtZXJjaGFudCBuYW1lLiAgSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYSBUcmFuc2FjdGlvbnMgZW5kcG9pbnQgc3VjaCBhcyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBvciBgL3RyYW5zYWN0aW9ucy9nZXRgLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGFwcGVhci4gSWYgdGhlIGB0cmFuc2FjdGlvbnNgIG9iamVjdCB3YXMgcmV0dXJuZWQgYnkgYW4gQXNzZXRzIGVuZHBvaW50IHN1Y2ggYXMgYC9hc3NldF9yZXBvcnQvZ2V0L2Agb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGFwcGVhciBpbiBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBuYW1lLCBhcyBlbnJpY2hlZCBieSBQbGFpZCBmcm9tIHRoZSBgbmFtZWAgZmllbGQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgbW9yZSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIG9mIHRoZSBtZXJjaGFudCBjb3VudGVycGFydHkgaW4gdGhlIHRyYW5zYWN0aW9uLiBGb3Igc29tZSBiYW5rIHRyYW5zYWN0aW9ucyAoc3VjaCBhcyBjaGVja3Mgb3IgYWNjb3VudCB0cmFuc2ZlcnMpIHdoZXJlIHRoZXJlIGlzIG5vIG1lYW5pbmdmdWwgbWVyY2hhbnQgbmFtZSwgdGhpcyB2YWx1ZSB3aWxsIGJlIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBtZXJjaGFudF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24gdG8gZGVzY3JpYmUgdGhlIHRyYW5zYWN0aW9uLiBGb3IgdHJhbnNhY3Rpb25zIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGAsIHRoaXMgZmllbGQgd2lsbCBvbmx5IGJlIGluY2x1ZGVkIGlmIHRoZSBjbGllbnQgaGFzIHNldCBgb3B0aW9ucy5pbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uYCB0byBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgb3JpZ2luYWxfZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50TWV0YX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGF5bWVudF9tZXRhPzogUGF5bWVudE1ldGE7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIGlkZW50aWZpZXMgdGhlIHRyYW5zYWN0aW9uIGFzIHBlbmRpbmcgb3IgdW5zZXR0bGVkLiBQZW5kaW5nIHRyYW5zYWN0aW9uIGRldGFpbHMgKG5hbWUsIHR5cGUsIGFtb3VudCwgY2F0ZWdvcnkgSUQpIG1heSBjaGFuZ2UgYmVmb3JlIHRoZXkgYXJlIHNldHRsZWQuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIHBlbmRpbmc6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIGEgcG9zdGVkIHRyYW5zYWN0aW9uXFwncyBhc3NvY2lhdGVkIHBlbmRpbmcgdHJhbnNhY3Rpb24sIHdoZXJlIGFwcGxpY2FibGUuIE5vdCBhbGwgaW5zdGl0dXRpb25zIHByb3ZpZGUgcGVuZGluZyB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgcGVuZGluZ190cmFuc2FjdGlvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhpcyBmaWVsZCBpcyBub3QgdHlwaWNhbGx5IHBvcHVsYXRlZCBhbmQgb25seSByZWxldmFudCB3aGVuIGRlYWxpbmcgd2l0aCBzdWItYWNjb3VudHMuIEEgc3ViLWFjY291bnQgbW9zdCBjb21tb25seSBleGlzdHMgaW4gY2FzZXMgd2hlcmUgYSBzaW5nbGUgYWNjb3VudCBpcyBsaW5rZWQgdG8gbXVsdGlwbGUgY2FyZHMsIGVhY2ggd2l0aCBpdHMgb3duIGNhcmQgbnVtYmVyIGFuZCBjYXJkIGhvbGRlciBuYW1lOyBlYWNoIGNhcmQgd2lsbCBiZSBjb25zaWRlcmVkIGEgc3ViLWFjY291bnQuIElmIHRoZSBhY2NvdW50IGRvZXMgaGF2ZSBzdWItYWNjb3VudHMsIHRoaXMgZmllbGQgd2lsbCB0eXBpY2FsbHkgYmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGUgc3ViLWFjY291bnQgb3duZXJcXCdzIG5hbWUgYW5kL29yIHRoZSBzdWItYWNjb3VudCBtYXNrLiBUaGUgZm9ybWF0IG9mIHRoaXMgZmllbGQgaXMgbm90IHN0YW5kYXJkaXplZCBhbmQgd2lsbCB2YXJ5IGJhc2VkIG9uIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQmFzZVxuICAgICAqL1xuICAgIGFjY291bnRfb3duZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmlxdWUgSUQgb2YgdGhlIHRyYW5zYWN0aW9uLiBMaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgdGhlIGB0cmFuc2FjdGlvbl9pZGAgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGVhc2UgdXNlIHRoZSBgcGF5bWVudF9jaGFubmVsYCBmaWVsZCwgYHRyYW5zYWN0aW9uX3R5cGVgIHdpbGwgYmUgZGVwcmVjYXRlZCBpbiB0aGUgZnV0dXJlLiAgYGRpZ2l0YWw6YCB0cmFuc2FjdGlvbnMgdGhhdCB0b29rIHBsYWNlIG9ubGluZS4gIGBwbGFjZTpgIHRyYW5zYWN0aW9ucyB0aGF0IHdlcmUgbWFkZSBhdCBhIHBoeXNpY2FsIGxvY2F0aW9uLiAgYHNwZWNpYWw6YCB0cmFuc2FjdGlvbnMgdGhhdCByZWxhdGUgdG8gYmFua3MsIGUuZy4gZmVlcyBvciBkZXBvc2l0cy4gIGB1bnJlc29sdmVkOmAgdHJhbnNhY3Rpb25zIHRoYXQgZG8gbm90IGZpdCBpbnRvIHRoZSBvdGhlciB0aHJlZSB0eXBlcy4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25CYXNlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl90eXBlPzogVHJhbnNhY3Rpb25CYXNlVHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBUaGUgVVJMIG9mIGEgbG9nbyBhc3NvY2lhdGVkIHdpdGggdGhpcyB0cmFuc2FjdGlvbiwgaWYgYXZhaWxhYmxlLiBUaGUgbG9nbyB3aWxsIGFsd2F5cyBiZSAxMDDDlzEwMCBwaXhlbCBQTkcgZmlsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICBsb2dvX3VybD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHdlYnNpdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHJhbnNhY3Rpb24sIGlmIGF2YWlsYWJsZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkJhc2VcbiAgICAgKi9cbiAgICB3ZWJzaXRlPzogc3RyaW5nIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvbkJhc2VUcmFuc2FjdGlvblR5cGVFbnVtIHtcbiAgICBEaWdpdGFsID0gJ2RpZ2l0YWwnLFxuICAgIFBsYWNlID0gJ3BsYWNlJyxcbiAgICBTcGVjaWFsID0gJ3NwZWNpYWwnLFxuICAgIFVucmVzb2x2ZWQgPSAndW5yZXNvbHZlZCdcbn1cblxuLyoqXG4gKiBBbiBpZGVudGlmaWVyIGNsYXNzaWZ5aW5nIHRoZSB0cmFuc2FjdGlvbiB0eXBlLiAgVGhpcyBmaWVsZCBpcyBvbmx5IHBvcHVsYXRlZCBmb3IgRXVyb3BlYW4gaW5zdGl0dXRpb25zLiBGb3IgaW5zdGl0dXRpb25zIGluIHRoZSBVUyBhbmQgQ2FuYWRhLCB0aGlzIGZpZWxkIGlzIHNldCB0byBgbnVsbGAuICBgYWRqdXN0bWVudDpgIEJhbmsgYWRqdXN0bWVudCAgYGF0bTpgIENhc2ggZGVwb3NpdCBvciB3aXRoZHJhd2FsIHZpYSBhbiBhdXRvbWF0ZWQgdGVsbGVyIG1hY2hpbmUgIGBiYW5rIGNoYXJnZTpgIENoYXJnZSBvciBmZWUgbGV2aWVkIGJ5IHRoZSBpbnN0aXR1dGlvbiAgYGJpbGwgcGF5bWVudGA6IFBheW1lbnQgb2YgYSBiaWxsICBgY2FzaDpgIENhc2ggZGVwb3NpdCBvciB3aXRoZHJhd2FsICBgY2FzaGJhY2s6YCBDYXNoIHdpdGhkcmF3YWwgd2hpbGUgbWFraW5nIGEgZGViaXQgY2FyZCBwdXJjaGFzZSAgYGNoZXF1ZTpgIERvY3VtZW50IG9yZGVyaW5nIHRoZSBwYXltZW50IG9mIG1vbmV5IHRvIGFub3RoZXIgcGVyc29uIG9yIG9yZ2FuaXphdGlvbiAgYGRpcmVjdCBkZWJpdDpgIEF1dG9tYXRpYyB3aXRoZHJhd2FsIG9mIGZ1bmRzIGluaXRpYXRlZCBieSBhIHRoaXJkIHBhcnR5IGF0IGEgcmVndWxhciBpbnRlcnZhbCAgYGludGVyZXN0OmAgSW50ZXJlc3QgZWFybmVkIG9yIGluY3VycmVkICBgcHVyY2hhc2U6YCBQdXJjaGFzZSBtYWRlIHdpdGggYSBkZWJpdCBvciBjcmVkaXQgY2FyZCAgYHN0YW5kaW5nIG9yZGVyOmAgUGF5bWVudCBpbnN0cnVjdGVkIGJ5IHRoZSBhY2NvdW50IGhvbGRlciB0byBhIHRoaXJkIHBhcnR5IGF0IGEgcmVndWxhciBpbnRlcnZhbCAgYHRyYW5zZmVyOmAgVHJhbnNmZXIgb2YgbW9uZXkgYmV0d2VlbiBhY2NvdW50c1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25Db2RlIHtcbiAgICBBZGp1c3RtZW50ID0gJ2FkanVzdG1lbnQnLFxuICAgIEF0bSA9ICdhdG0nLFxuICAgIEJhbmtDaGFyZ2UgPSAnYmFuayBjaGFyZ2UnLFxuICAgIEJpbGxQYXltZW50ID0gJ2JpbGwgcGF5bWVudCcsXG4gICAgQ2FzaCA9ICdjYXNoJyxcbiAgICBDYXNoYmFjayA9ICdjYXNoYmFjaycsXG4gICAgQ2hlcXVlID0gJ2NoZXF1ZScsXG4gICAgRGlyZWN0RGViaXQgPSAnZGlyZWN0IGRlYml0JyxcbiAgICBJbnRlcmVzdCA9ICdpbnRlcmVzdCcsXG4gICAgUHVyY2hhc2UgPSAncHVyY2hhc2UnLFxuICAgIFN0YW5kaW5nT3JkZXIgPSAnc3RhbmRpbmcgb3JkZXInLFxuICAgIFRyYW5zZmVyID0gJ3RyYW5zZmVyJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIGNvdW50ZXJwYXJ0eSwgc3VjaCBhcyB0aGUgbWVyY2hhbnQgb3IgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5IHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY291bnRlcnBhcnR5LCBzdWNoIGFzIHRoZSBtZXJjaGFudCBvciB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBhcyBleHRyYWN0ZWQgYnkgUGxhaWQgZnJvbSB0aGUgcmF3IGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlLCBzdGFibGUsIFBsYWlkLWdlbmVyYXRlZCBJRCB0aGF0IG1hcHMgdG8gdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGVudGl0eV9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvdW50ZXJwYXJ0eVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgdHlwZTogQ291bnRlcnBhcnR5VHlwZTtcbiAgICAvKipcbiAgICAgKiBUaGUgd2Vic2l0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFVSTCBvZiBhIGxvZ28gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb3VudGVycGFydHksIGlmIGF2YWlsYWJsZS4gVGhlIGxvZ28gd2lsbCBhbHdheXMgYmUgMTAww5cxMDAgcGl4ZWwgUE5HIGZpbGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAgICAgKi9cbiAgICBsb2dvX3VybDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIGhvdyBjb25maWRlbnQgd2UgYXJlIHRoYXQgdGhlIHByb3ZpZGVkIGNvdW50ZXJwYXJ0eSBpcyBpbnZvbHZlZCBpbiB0aGUgdHJhbnNhY3Rpb24uICBgVkVSWV9ISUdIYDogV2UgcmVjb2duaXplIHRoaXMgY291bnRlcnBhcnR5IGFuZCB3ZSBhcmUgbW9yZSB0aGFuIDk4JSBjb25maWRlbnQgdGhhdCBpdCBpcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLiBgSElHSGA6IFdlIHJlY29nbml6ZSB0aGlzIGNvdW50ZXJwYXJ0eSBhbmQgd2UgYXJlIG1vcmUgdGhhbiA5MCUgY29uZmlkZW50IHRoYXQgaXQgaXMgaW52b2x2ZWQgaW4gdGhpcyB0cmFuc2FjdGlvbi4gYE1FRElVTWA6IFdlIGFyZSBtb2RlcmF0ZWx5IGNvbmZpZGVudCB0aGF0IHRoaXMgY291bnRlcnBhcnR5IHdhcyBpbnZvbHZlZCBpbiB0aGlzIHRyYW5zYWN0aW9uLCBidXQgc29tZSBkZXRhaWxzIG1heSBkaWZmZXIgZnJvbSBvdXIgcmVjb3Jkcy4gYExPV2A6IFdlIGRpZG7igJl0IGZpbmQgYSBtYXRjaGluZyBjb3VudGVycGFydHkgaW4gb3VyIHJlY29yZHMsIHNvIHdlIGFyZSByZXR1cm5pbmcgYSBjbGVhbnNlZCBuYW1lIHBhcnNlZCBvdXQgb2YgdGhlIHJlcXVlc3QgZGVzY3JpcHRpb24uIGBVTktOT1dOYDogV2UgZG9u4oCZdCBrbm93IHRoZSBjb25maWRlbmNlIGxldmVsIGZvciB0aGlzIGNvdW50ZXJwYXJ0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eVxuICAgICAqL1xuICAgIGNvbmZpZGVuY2VfbGV2ZWw/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbWF0Y2hlZCBkaXJlY3QgZGVwb3NpdCB0cmFuc2FjdGlvbiB1c2VkIHRvIHZlcmlmeSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uRGF0YSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGFtb3VudDogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSB0cmFuc2FjdGlvbiwgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChcXFwieXl5eS1tbS1kZFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uRGF0YVxuICAgICAqL1xuICAgIGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZW5kIHVzZXJcXCdzIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25EYXRhXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbkRhdGFcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEYXRhIHRvIHBvcHVsYXRlIGFzIHRlc3QgdHJhbnNhY3Rpb24gZGF0YS4gSWYgbm90IHNwZWNpZmllZCwgcmFuZG9tIHRyYW5zYWN0aW9ucyB3aWxsIGJlIGdlbmVyYXRlZCBpbnN0ZWFkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25PdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIHRyYW5zYWN0aW9uLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LiBUcmFuc2FjdGlvbnMgaW4gU2FuZGJveCB3aWxsIG1vdmUgZnJvbSBwZW5kaW5nIHRvIHBvc3RlZCBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGRhdGUgaGFzIGJlZW4gcmVhY2hlZC4gSWYgYSBgZGF0ZV90cmFuc2FjdGVkYCBpcyBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLCBhIHRyYW5zYWN0aW9uIGRhdGUgbWF5IGJlIGF2YWlsYWJsZSBpbiB0aGUgW2BhdXRob3JpemVkX2RhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9ucy1nZXQtcmVzcG9uc2UtdHJhbnNhY3Rpb25zLWF1dGhvcml6ZWQtZGF0ZSkgZmllbGQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25PdmVycmlkZVxuICAgICAqL1xuICAgIGRhdGVfdHJhbnNhY3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHRoZSB0cmFuc2FjdGlvbiBwb3N0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIChZWVlZLU1NLUREKSBmb3JtYXQuIFBvc3RlZCBkYXRlcyBpbiB0aGUgcGFzdCBvciBwcmVzZW50IHdpbGwgcmVzdWx0IGluIHBvc3RlZCB0cmFuc2FjdGlvbnM7IHBvc3RlZCBkYXRlcyBpbiB0aGUgZnV0dXJlIHdpbGwgcmVzdWx0IGluIHBlbmRpbmcgdHJhbnNhY3Rpb25zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkYXRlX3Bvc3RlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0cmFuc2FjdGlvbiBhbW91bnQuIENhbiBiZSBuZWdhdGl2ZS5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbk92ZXJyaWRlXG4gICAgICovXG4gICAgYW1vdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08tNDIxNyBmb3JtYXQgY3VycmVuY3kgY29kZSBmb3IgdGhlIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjdXJyZW5jeT86IHN0cmluZztcbn1cbi8qKlxuICogQSBncm91cGluZyBvZiByZWxhdGVkIHRyYW5zYWN0aW9uc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uU3RyZWFtIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGFjY291bnQgdG8gd2hpY2ggdGhlIHN0cmVhbSBiZWxvbmdzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWQgZm9yIHRoZSBzdHJlYW1cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgaGllcmFyY2hpY2FsIGFycmF5IG9mIHRoZSBjYXRlZ29yaWVzIHRvIHdoaWNoIHRoaXMgdHJhbnNhY3Rpb24gYmVsb25ncy4gU2VlIFtDYXRlZ29yaWVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2NhdGVnb3JpZXNnZXQpLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgdGhlIG5ldyBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgaW5zdGVhZCBvZiBgY2F0ZWdvcnlgLiBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGNhdGVnb3JpemF0aW9uIGFuZCBncmVhdGVyIGFjY3VyYWN5LlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnk6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBjYXRlZ29yeSB0byB3aGljaCB0aGlzIHRyYW5zYWN0aW9uIGJlbG9uZ3MuIFNlZSBbQ2F0ZWdvcmllc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNjYXRlZ29yaWVzZ2V0KS4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIHRoZSBuZXcgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIGluc3RlYWQgb2YgYGNhdGVnb3J5YC4gYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHByb3ZpZGVzIG1vcmUgbWVhbmluZ2Z1bCBjYXRlZ29yaXphdGlvbiBhbmQgZ3JlYXRlciBhY2N1cmFjeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY2F0ZWdvcnlfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB0cmFuc2FjdGlvbiBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtZXJjaGFudCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIG1lcmNoYW50X25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RlZCBkYXRlIG9mIHRoZSBlYXJsaWVzdCB0cmFuc2FjdGlvbiBpbiB0aGUgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgZmlyc3RfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0ZWQgZGF0ZSBvZiB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIGluIHRoZSBzdHJlYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcHJlZGljdGVkIGRhdGUgb2YgdGhlIG5leHQgcGF5bWVudC4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIHRoZSBuZXh0IHBheW1lbnQgZGF0ZSBjYW4gYmUgcHJlZGljdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgcHJlZGljdGVkX25leHRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGZyZXF1ZW5jeTogUmVjdXJyaW5nVHJhbnNhY3Rpb25GcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgUGxhaWQgdHJhbnNhY3Rpb24gSURzIGJlbG9uZ2luZyB0byB0aGUgc3RyZWFtLCBzb3J0ZWQgYnkgcG9zdGVkIGRhdGUuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbUFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBhdmVyYWdlX2Ftb3VudDogVHJhbnNhY3Rpb25TdHJlYW1BbW91bnQ7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uU3RyZWFtQW1vdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbVxuICAgICAqL1xuICAgIGxhc3RfYW1vdW50OiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudDtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtIGlzIHN0aWxsIGxpdmUuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uU3RyZWFtXG4gICAgICovXG4gICAgaXNfYWN0aXZlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvblN0cmVhbVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zYWN0aW9uU3RyZWFtU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQZXJzb25hbEZpbmFuY2VDYXRlZ29yeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5PzogUGVyc29uYWxGaW5hbmNlQ2F0ZWdvcnkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXMgd2lsbCBiZSBzZXQgdG8gYHRydWVgIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gbW9kaWZpZWQgYnkgcmVxdWVzdCB0byBhIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zYCBlbmRwb2ludC4gSXQgd2lsbCBiZSBgZmFsc2VgIGZvciBhbGwgb3RoZXIgc3RyZWFtcy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBpc191c2VyX21vZGlmaWVkOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCB1c2VyIG1vZGlmaWNhdGlvbi4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGlmIGBpc191c2VyX21vZGlmaWVkYCBpcyBgdHJ1ZWAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1cbiAgICAgKi9cbiAgICBsYXN0X3VzZXJfbW9kaWZpZWRfZGF0ZXRpbWU/OiBzdHJpbmc7XG59XG4vKipcbiAqIE9iamVjdCB3aXRoIGRhdGEgcGVydGFpbmluZyB0byBhbiBhbW91bnQgb24gdGhlIHRyYW5zYWN0aW9uIHN0cmVhbS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvblN0cmVhbUFtb3VudCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyB0aGUgbnVtZXJpY2FsIHZhbHVlIG9mIGFuIGFtb3VudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIGFtb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVNPLTQyMTcgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGB1bm9mZmljaWFsX2N1cnJlbmN5X2NvZGVgIGlzIG5vbi1gbnVsbGAuICBTZWUgdGhlIFtjdXJyZW5jeSBjb2RlIHNjaGVtYV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvYWNjb3VudHMjY3VycmVuY3ktY29kZS1zY2hlbWEpIGZvciBhIGZ1bGwgbGlzdGluZyBvZiBzdXBwb3J0ZWQgYGlzb19jdXJyZW5jeV9jb2RlYHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25TdHJlYW1BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVub2ZmaWNpYWwgY3VycmVuY3kgY29kZSBvZiB0aGUgYW1vdW50LiBBbHdheXMgYG51bGxgIGlmIGBpc29fY3VycmVuY3lfY29kZWAgaXMgbm9uLWBudWxsYC4gVW5vZmZpY2lhbCBjdXJyZW5jeSBjb2RlcyBhcmUgdXNlZCBmb3IgY3VycmVuY2llcyB0aGF0IGRvIG5vdCBoYXZlIG9mZmljaWFsIElTTyBjdXJyZW5jeSBjb2Rlcywgc3VjaCBhcyBjcnlwdG9jdXJyZW5jaWVzIGFuZCB0aGUgY3VycmVuY2llcyBvZiBjZXJ0YWluIGNvdW50cmllcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvblN0cmVhbUFtb3VudFxuICAgICAqL1xuICAgIHVub2ZmaWNpYWxfY3VycmVuY3lfY29kZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBjdXJyZW50IHN0YXR1cyBvZiB0aGUgdHJhbnNhY3Rpb24gc3RyZWFtLiAgYE1BVFVSRWA6IEEgYE1BVFVSRWAgcmVjdXJyaW5nIHN0cmVhbSBzaG91bGQgaGF2ZSBhdCBsZWFzdCAzIHRyYW5zYWN0aW9ucyBhbmQgaGFwcGVuIG9uIGEgcmVndWxhciBjYWRlbmNlIChGb3IgQW5udWFsIHJlY3VycmluZyBzdHJlYW0sIHdlIHdpbGwgbWFyayBpdCBgTUFUVVJFYCBhZnRlciAyIGluc3RhbmNlcykuICBgRUFSTFlfREVURUNUSU9OYDogV2hlbiBhIHJlY3VycmluZyB0cmFuc2FjdGlvbiBmaXJzdCBhcHBlYXJzIGluIHRoZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGFuZCBiZWZvcmUgaXQgZnVsZmlsbHMgdGhlIHJlcXVpcmVtZW50IG9mIGEgbWF0dXJlIHN0cmVhbSwgdGhlIHN0YXR1cyB3aWxsIGJlIGBFQVJMWV9ERVRFQ1RJT05gLiAgYFRPTUJTVE9ORURgOiBBIHN0cmVhbSB0aGF0IHdhcyBwcmV2aW91c2x5IGluIHRoZSBgRUFSTFlfREVURUNUSU9OYCBzdGF0dXMgd2lsbCBtb3ZlIHRvIHRoZSBgVE9NQlNUT05FRGAgc3RhdHVzIHdoZW4gbm8gZnVydGhlciB0cmFuc2FjdGlvbnMgd2VyZSBmb3VuZCBhdCB0aGUgbmV4dCBleHBlY3RlZCBkYXRlLiAgYFVOS05PV05gOiBBIHN0cmVhbSBpcyBhc3NpZ25lZCBhbiBgVU5LTk9XTmAgc3RhdHVzIHdoZW4gbm9uZSBvZiB0aGUgb3RoZXIgc3RhdHVzZXMgYXJlIGFwcGxpY2FibGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblN0cmVhbVN0YXR1cyB7XG4gICAgVW5rbm93biA9ICdVTktOT1dOJyxcbiAgICBNYXR1cmUgPSAnTUFUVVJFJyxcbiAgICBFYXJseURldGVjdGlvbiA9ICdFQVJMWV9ERVRFQ1RJT04nLFxuICAgIFRvbWJzdG9uZWQgPSAnVE9NQlNUT05FRCdcbn1cblxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGEgdHJhbnNhY3Rpb25zIGNhdGVnb3J5IHJ1bGUuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0NhdGVnb3J5UnVsZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcnVsZSBjcmVhdGVkXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgSXRlbSB0aGUgcnVsZSB3YXMgY3JlYXRlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBEYXRlIGFuZCB0aW1lIHdoZW4gYSBydWxlIHdhcyBjcmVhdGVkIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoIGBZWVlZLU1NLUREVEhIOm1tOnNzWmAgKS4gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQZXJzb25hbCBmaW5hbmNlIGNhdGVnb3J5IHVuaXF1ZSBpZGVudGlmaWVyLiAgSW4gdGhlIHBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcnkgdGF4b25vbXksIHRoaXMgZmllbGQgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIGRldGFpbGVkIGNhdGVnb3J5IGZpZWxkLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGVcbiAgICAgKi9cbiAgICBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zQ2F0ZWdvcnlSdWxlXG4gICAgICovXG4gICAgcnVsZV9kZXRhaWxzPzogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9lbmhhbmNlYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHR5cGUgb2YgYWNjb3VudCBmb3IgdGhlIHJlcXVlc3RlZCB0cmFuc2FjdGlvbnMgKGBkZXBvc2l0b3J5YCBvciBgY3JlZGl0YCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiByYXcgdHJhbnNhY3Rpb25zIHRvIGJlIGVuaGFuY2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZFJhd1RyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbnM6IEFycmF5PENsaWVudFByb3ZpZGVkUmF3VHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIGVuaGFuY2VkIHRyYW5zYWN0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8Q2xpZW50UHJvdmlkZWRFbmhhbmNlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5oYW5jZWRfdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZEVuaGFuY2VkVHJhbnNhY3Rpb24+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IHR5cGUgZm9yIHRoZSByZXF1ZXN0ZWQgdHJhbnNhY3Rpb25zIChlaXRoZXIgYGRlcG9zaXRvcnlgIG9yIGBjcmVkaXRgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF90eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgdHJhbnNhY3Rpb24gb2JqZWN0cyB0byBiZSBlbnJpY2hlZCBieSBQbGFpZC4gTWF4aW11bSBvZiAxMDAgdHJhbnNhY3Rpb25zIHBlciByZXF1ZXN0LlxuICAgICAqIEB0eXBlIHtBcnJheTxDbGllbnRQcm92aWRlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8Q2xpZW50UHJvdmlkZWRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zO1xufVxuLyoqXG4gKiBBbiBvcHRpb25hbCBvYmplY3QgdG8gYmUgdXNlZCB3aXRoIHRoZSByZXF1ZXN0LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIGBsZWdhY3lfY2F0ZWdvcnlgIGFuZCBgbGVnYWN5X2NhdGVnb3J5X2lkYCBpbiB0aGUgcmVzcG9uc2UgKGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0IGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCkuICBDYXRlZ29yaWVzIGFyZSBiYXNlZCBvbiBQbGFpZFxcJ3MgbGVnYWN5IHRheG9ub215LiBGb3IgYSBmdWxsIGxpc3Qgb2YgbGVnYWN5IGNhdGVnb3JpZXMsIHNlZSBbYC9jYXRlZ29yaWVzL2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jY2F0ZWdvcmllc2dldCkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9sZWdhY3lfY2F0ZWdvcnk/OiBib29sZWFuO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zRW5yaWNoUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBlbnJpY2hlZCB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge0FycmF5PENsaWVudFByb3ZpZGVkRW5yaWNoZWRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0VucmljaFJlc3BvbnNlXG4gICAgICovXG4gICAgZW5yaWNoZWRfdHJhbnNhY3Rpb25zOiBBcnJheTxDbGllbnRQcm92aWRlZEVucmljaGVkVHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZWFybGllc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXRlc3QgZGF0ZSBmb3Igd2hpY2ggZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuIERhdGVzIHNob3VsZCBiZSBmb3JtYXR0ZWQgYXMgWVlZWS1NTS1ERC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW5kX2RhdGU6IHN0cmluZztcbn1cbi8qKlxuICogQW4gb3B0aW9uYWwgb2JqZWN0IHRvIGJlIHVzZWQgd2l0aCB0aGUgcmVxdWVzdC4gSWYgc3BlY2lmaWVkLCBgb3B0aW9uc2AgbXVzdCBub3QgYmUgYG51bGxgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0T3B0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0gIE5vdGU6IEFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgaWYgYSBwcm92aWRlZCBgYWNjb3VudF9pZGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBza2lwLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEluY2x1ZGUgdGhlIHJhdyB1bnBhcnNlZCB0cmFuc2FjdGlvbiBkZXNjcmlwdGlvbiBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgaW5jbHVkZV9vcmlnaW5hbF9kZXNjcmlwdGlvbj86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgY2F0ZWdvcmllcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlfYmV0YT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQ291bnRlcnBhcnRpZXMgYW5kIGV4dHJhIG1lcmNoYW50IGZpZWxkcyBhcmUgbm93IHJldHVybmVkIGJ5IGRlZmF1bHQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX2xvZ29fYW5kX2NvdW50ZXJwYXJ0eV9iZXRhPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGlzIGZpZWxkIG9ubHkgYXBwbGllcyB0byBjYWxscyBmb3IgSXRlbXMgd2hlcmUgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIChpLmUuIGJ5IHNwZWNpZnlpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGByZXF1aXJlZF9pZl9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5IHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBvciBieSBtYWtpbmcgYSBwcmV2aW91cyBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGApLiBJbiB0aG9zZSBjYXNlcywgdGhlIGZpZWxkIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCBQbGFpZCB3aWxsIHJlcXVlc3QgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGUgbW9yZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlcXVlc3RlZCwgdGhlIGxvbmdlciB0aGUgaGlzdG9yaWNhbCB1cGRhdGUgcG9sbCB3aWxsIHRha2UuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgOTAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkIGJ5IGRlZmF1bHQuIElmIGEgdmFsdWUgdW5kZXIgMzAgaXMgcHJvdmlkZWQsIGEgbWluaW11bSBvZiAzMCBkYXlzIG9mIGhpc3Rvcnkgd2lsbCBiZSByZXF1ZXN0ZWQuICBJZiB5b3UgYXJlIGluaXRpYWxpemluZyB5b3VyIEl0ZW1zIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCAoZS5nLiBieSBpbmNsdWRpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBwcm9kdWN0c2AgYXJyYXkpLCB5b3UgbXVzdCB1c2UgdGhlIFtgdHJhbnNhY3Rpb25zLmRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIGZpZWxkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCByZXF1ZXN0IGluc3RlYWQgb2YgaW4gdGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgcmVxdWVzdC4gIElmIHRoZSBJdGVtIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QsIHRoaXMgZmllbGQgd2lsbCBoYXZlIG5vIGVmZmVjdC4gVGhlIG1heGltdW0gYW1vdW50IG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdG8gcmVxdWVzdCBvbiBhbiBJdGVtIGNhbm5vdCBiZSB1cGRhdGVkIGlmIFRyYW5zYWN0aW9ucyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtLiBUbyByZXF1ZXN0IG9sZGVyIHRyYW5zYWN0aW9uIGhpc3Rvcnkgb24gYW4gSXRlbSB3aGVyZSBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCwgeW91IG11c3QgZGVsZXRlIHRoZSBJdGVtIHZpYSBgL2l0ZW0vcmVtb3ZlYCBhbmQgc2VuZCB0aGUgdXNlciB0aHJvdWdoIExpbmsgdG8gY3JlYXRlIGEgbmV3IEl0ZW0uICAgQ3VzdG9tZXJzIHVzaW5nIFtSZWN1cnJpbmcgVHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc3JlY3VycmluZ2dldCkgc2hvdWxkIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSBmb3Igb3B0aW1hbCByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgZGF5c19yZXF1ZXN0ZWQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIHRoZSBgYWNjb3VudHNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBmb3Igd2hpY2ggdHJhbnNhY3Rpb25zIGFyZSBiZWluZyByZXR1cm5lZC4gRWFjaCB0cmFuc2FjdGlvbiBjYW4gYmUgbWFwcGVkIHRvIGl0cyBjb3JyZXNwb25kaW5nIGFjY291bnQgdmlhIHRoZSBgYWNjb3VudF9pZGAgZmllbGQuXG4gICAgICogQHR5cGUge0FycmF5PEFjY291bnRCYXNlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2NvdW50czogQXJyYXk8QWNjb3VudEJhc2U+O1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb25zIGZyb20gdGhlIGFjY291bnQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZSBjaHJvbm9sb2dpY2FsIG9yZGVyLCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcnJheS4gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBgY291bnRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uczogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGRhdGUgcmFuZ2Ugc3BlY2lmaWVkLiBJZiBgdG90YWxfdHJhbnNhY3Rpb25zYCBpcyBsYXJnZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgYHRyYW5zYWN0aW9uc2AgYXJyYXksIG1vcmUgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUgYW5kIGNhbiBiZSBmZXRjaGVkIHZpYSBtYW5pcHVsYXRpbmcgdGhlIGBvZmZzZXRgIHBhcmFtZXRlci5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRvdGFsX3RyYW5zYWN0aW9uczogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtJdGVtfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW06IEl0ZW07XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dCBkZWZpbmVzIGEgc2luZ2xlIGlucHV0IHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9jcmVhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRHMgb2YgYWxsIHRoZSB0cmFuc2FjdGlvbnMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIG9uZSBzdHJlYW0uIElmIGFueSB0cmFuc2FjdGlvbiBjdXJyZW50bHkgZXhpc3RzIGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3QgZGVmaW5lZCB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgYWxsIHRoZSBvcGVyYXRpb25zIHRvIGJlIHBlcmZvcm1lZC4gVGhpcyB3aWxsIGVpdGhlciBhbGwgc3VjY2VlZCBvciBhbGwgZmFpbC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlSW5wdXQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdDcmVhdGVJbnB1dD47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL2NyZWF0ZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFN0cmVhbXMgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYWRkZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIE90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zPzogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZW1vdmVkX3N0cmVhbV9pZHM/OiBBcnJheTxzdHJpbmc+O1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RPcHRpb25zO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byByZXRyaWV2ZSBmb3IgdGhlIEl0ZW0uIFJldHJpZXZlcyBhbGwgYWN0aXZlIGFjY291bnRzIG9uIGl0ZW0gaWYgbm8gYGFjY291bnRfaWRgcyBhcmUgcHJvdmlkZWQuICBOb3RlOiBBbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGlmIGEgcHJvdmlkZWQgYGFjY291bnRfaWRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeT86IGJvb2xlYW47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZGVwb3NpdG9yeSB0cmFuc2FjdGlvbiBzdHJlYW1zLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvblN0cmVhbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaW5mbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBleHBlbnNlIHRyYW5zYWN0aW9uIHN0cmVhbXMuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBvdXRmbG93X3N0cmVhbXM6IEFycmF5PFRyYW5zYWN0aW9uU3RyZWFtPjtcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChgWVlZWS1NTS1ERFRISDptbTpzc1pgKSBpbmRpY2F0aW5nIHRoZSBsYXN0IHRpbWUgdHJhbnNhY3Rpb24gc3RyZWFtcyBmb3IgdGhlIGdpdmVuIGFjY291bnQgd2VyZSB1cGRhdGVkIG9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB1cGRhdGVkX2RhdGV0aW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgaW5wdXQgdG8gdGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9zdHJlYW1zL21lcmdlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlSW5wdXQge1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHN0cmVhbXMgdGhhdCB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZSBmaXJzdCBzdHJlYW0uIFRoaXMgb3BlcmF0aW9uIHdpbGwgcmV0YWluIHRoZSBzdHJlYW1faWQgb2YgdGhlIGZpcnN0IHN0cmVhbS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZHM6IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvbWVyZ2VgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXF1ZXN0XG4gICAgICovXG4gICAgaW5wdXRzOiBBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy9tZXJnZWAgZW5kcG9pbnQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ01lcmdlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBEaXJlY3RseSBtb2RpZmllZCBzdHJlYW0sIGFsb25nIHdpdGggb3RoZXIgc3RyZWFtcyB3aXRoIHRyYW5zYWN0aW9ucyByZW1vdmVkIGZyb20gdGhlbSBhcyBhIHJlc3VsdCBvZiB0aGUgb3BlcmF0aW9uIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdNZXJnZVJlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWRfc3RyZWFtczogQXJyYXk8VHJhbnNhY3Rpb25TdHJlYW0+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZHMgb2Ygc3RyZWFtcyB0aGF0IGFyZSBubyBsb25nZXIgcXVhbGlmaWVkIGFzIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zIChpbiBubyBwYXJ0aWN1bGFyIG9yZGVyKS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nTWVyZ2VSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IGRlZmluZXMgYSBzaW5nbGUgb3BlcmF0aW9uIHRvIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvc3RyZWFtcy91cGRhdGVgIGVuZHBvaW50LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgc3RyZWFtIHRoYXQgYWxsIHRoZSB0cmFuc2FjdGlvbnMgd2lsbCBiZSBhZGRlZCBpbiB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHN0cmVhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEcyBvZiBhbGwgdGhlIHRyYW5zYWN0aW9ucyB0aGF0IHdpbGwgYmUgYWRkZWQgaW50byB0aGUgc3RyZWFtLiBJZiBhbnkgdHJhbnNhY3Rpb24gY3VycmVudGx5IGV4aXN0IGluIGFub3RoZXIgc3RyZWFtLCBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgb3RoZXIgc3RyZWFtLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkczogQXJyYXk8c3RyaW5nPjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdCBkZWZpbmVkIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG9wZXJhdGlvbnMgdG8gYmUgcGVyZm9ybWVkLiBUaGlzIHdpbGwgZWl0aGVyIGFsbCBzdWNjZWVkIG9yIGFsbCBmYWlsLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVJbnB1dD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpbnB1dHM6IEFycmF5PFRyYW5zYWN0aW9uc1JlY3VycmluZ1VwZGF0ZUlucHV0Pjtcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciB0aGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL3N0cmVhbXMvdXBkYXRlYCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogRGlyZWN0bHkgbW9kaWZpZWQgc3RyZWFtLCBhbG9uZyB3aXRoIG90aGVyIHN0cmVhbXMgd2l0aCB0cmFuc2FjdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZW0gYXMgYSByZXN1bHQgb2YgdGhlIG9wZXJhdGlvbiAoaW4gbm8gcGFydGljdWxhciBvcmRlcikuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uU3RyZWFtPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVjdXJyaW5nVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb2RpZmllZF9zdHJlYW1zOiBBcnJheTxUcmFuc2FjdGlvblN0cmVhbT47XG4gICAgLyoqXG4gICAgICogVGhlIGlkcyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vIGxvbmdlciBxdWFsaWZpZWQgYXMgcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXMgKGluIG5vIHBhcnRpY3VsYXIgb3JkZXIpLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWRfc3RyZWFtX2lkcz86IEFycmF5PHN0cmluZz47XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVmcmVzaFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIHRyYW5zYWN0aW9uKHMpIGZvciBhbiBJdGVtIGFyZSBkZWxldGVkLiBUaGUgZGVsZXRlZCB0cmFuc2FjdGlvbiBJRHMgYXJlIGluY2x1ZGVkIGluIHRoZSB3ZWJob29rIHBheWxvYWQuIFBsYWlkIHdpbGwgdHlwaWNhbGx5IGNoZWNrIGZvciBkZWxldGVkIHRyYW5zYWN0aW9uIGRhdGEgc2V2ZXJhbCB0aW1lcyBhIGRheS4gIFRoaXMgd2ViaG9vayBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggYC90cmFuc2FjdGlvbnMvZ2V0YDsgaWYgeW91IGFyZSB1c2luZyB0aGUgbmV3ZXIgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQsIHRoaXMgd2ViaG9vayB3aWxsIHN0aWxsIGJlIGZpcmVkIHRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gbGlzdGVuIGZvciBhbmQgcmVzcG9uZCB0byB0aGUgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgIHdlYmhvb2sgaW5zdGVhZC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFRSQU5TQUNUSU9OU2BcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0FDVElPTlNfUkVNT1ZFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSZW1vdmVkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgYHRyYW5zYWN0aW9uX2lkc2AgY29ycmVzcG9uZGluZyB0byB0aGUgcmVtb3ZlZCB0cmFuc2FjdGlvbnNcbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICByZW1vdmVkX3RyYW5zYWN0aW9uczogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUmVtb3ZlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBBIHJlcHJlc2VudGF0aW9uIG9mIHRyYW5zYWN0aW9ucyBydWxlIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZURldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNSdWxlRmllbGR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgZmllbGQ6IFRyYW5zYWN0aW9uc1J1bGVGaWVsZDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVEZXRhaWxzXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNhY3Rpb25zUnVsZVR5cGU7XG4gICAgLyoqXG4gICAgICogRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBwcm92aWRlIHRyYW5zYWN0aW9uX2lkLiBGb3IgTkFNRSBmaWVsZCwgcHJvdmlkZSBhIHN0cmluZyBwYXR0ZXJuLiBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlRGV0YWlsc1xuICAgICAqL1xuICAgIHF1ZXJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uIGZpZWxkIGZvciB3aGljaCB0aGUgcnVsZSBpcyBkZWZpbmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNhY3Rpb25zUnVsZUZpZWxkIHtcbiAgICBUcmFuc2FjdGlvbklkID0gJ1RSQU5TQUNUSU9OX0lEJyxcbiAgICBOYW1lID0gJ05BTUUnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb24gcnVsZVxcJ3MgbWF0Y2ggdHlwZS4gRm9yIFRSQU5TQUNUSU9OX0lEIGZpZWxkLCBFWEFDVF9NQVRDSCBpcyBhdmFpbGFibGUuIE1hdGNoZXMgYXJlIGNhc2Ugc2Vuc2l0aXZlLiBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1J1bGVUeXBlIHtcbiAgICBFeGFjdE1hdGNoID0gJ0VYQUNUX01BVENIJyxcbiAgICBTdWJzdHJpbmdNYXRjaCA9ICdTVUJTVFJJTkdfTUFUQ0gnXG59XG5cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBlcnNvbmFsIGZpbmFuY2UgZGV0YWlsZWQgY2F0ZWdvcnkuICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGlzIGZpZWxkIGluc3RlYWQgb2YgYGNhdGVnb3J5YCwgYXMgaXQgcHJvdmlkZXMgbW9yZSBtZWFuaW5nZnVsIGFuZCBhY2N1cmF0ZSBjYXRlZ29yaXphdGlvbi4gIFNlZSB0aGUgW2B0YXhvbm9teSBjc3YgZmlsZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGZvciBhIGZ1bGwgbGlzdCBvZiBwZXJzb25hbCBmaW5hbmNlIGNhdGVnb3JpZXMuIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zUnVsZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVfZGV0YWlsczogVHJhbnNhY3Rpb25zUnVsZURldGFpbHM7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBydWxlOiBUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbiBydWxlc1xuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJ1bGVzOiBBcnJheTxUcmFuc2FjdGlvbnNDYXRlZ29yeVJ1bGU+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJ1bGVcXCdzIHVuaXF1ZSBpZGVudGlmaWVyXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgcnVsZV9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2Nlc3MgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJzb3IgdmFsdWUgcmVwcmVzZW50cyB0aGUgbGFzdCB1cGRhdGUgcmVxdWVzdGVkLiBQcm92aWRpbmcgaXQgd2lsbCBjYXVzZSB0aGUgcmVzcG9uc2UgdG8gb25seSByZXR1cm4gY2hhbmdlcyBhZnRlciB0aGlzIHVwZGF0ZS4gSWYgb21pdHRlZCwgdGhlIGVudGlyZSBoaXN0b3J5IG9mIHVwZGF0ZXMgd2lsbCBiZSByZXR1cm5lZCwgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QtYWRkZWQgdHJhbnNhY3Rpb25zIG9uIHRoZSBJdGVtLiBUaGUgY3Vyc29yIGFsc28gYWNjZXB0cyB0aGUgc3BlY2lhbCB2YWx1ZSBvZiBgXFxcIm5vd1xcXCJgLCB3aGljaCBjYW4gYmUgdXNlZCB0byBmYXN0LWZvcndhcmQgdGhlIGN1cnNvciBhcyBwYXJ0IG9mIG1pZ3JhdGluZyBhbiBleGlzdGluZyBJdGVtIGZyb20gYC90cmFuc2FjdGlvbnMvZ2V0YCB0byBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBzeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gTm90ZSB0aGF0IHVzaW5nIHRoZSBgXFxcIm5vd1xcXCJgIHZhbHVlIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGFueSB1c2UgY2FzZSBvdGhlciB0aGFuIG1pZ3JhdGluZyBleGlzdGluZyBJdGVtcyBmcm9tIGAvdHJhbnNhY3Rpb25zL2dldGAuICBUaGUgdXBwZXItYm91bmQgbGVuZ3RoIG9mIHRoaXMgY3Vyc29yIGlzIDI1NiBjaGFyYWN0ZXJzIG9mIGJhc2U2NC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9uIHVwZGF0ZXMgdG8gZmV0Y2guXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIG9wdGlvbnM/OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnM7XG59XG4vKipcbiAqIEFuIG9wdGlvbmFsIG9iamVjdCB0byBiZSB1c2VkIHdpdGggdGhlIHJlcXVlc3QuIElmIHNwZWNpZmllZCwgYG9wdGlvbnNgIG11c3Qgbm90IGJlIGBudWxsYC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBJbmNsdWRlIHRoZSByYXcgdW5wYXJzZWQgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb24gZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBpbmNsdWRlX29yaWdpbmFsX2Rlc2NyaXB0aW9uPzogYm9vbGVhbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGVyc29uYWwgZmluYW5jZSBjYXRlZ29yaWVzIGFyZSBub3cgcmV0dXJuZWQgYnkgZGVmYXVsdC5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1JlcXVlc3RPcHRpb25zXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpbmNsdWRlX3BlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnk/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIENvdW50ZXJwYXJ0aWVzIGFuZCBleHRyYSBtZXJjaGFudCBmaWVsZHMgYXJlIG5vdyByZXR1cm5lZCBieSBkZWZhdWx0LlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGluY2x1ZGVfbG9nb19hbmRfY291bnRlcnBhcnR5X2JldGE/OiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFRoaXMgZmllbGQgb25seSBhcHBsaWVzIHRvIGNhbGxzIGZvciBJdGVtcyB3aGVyZSB0aGUgVHJhbnNhY3Rpb25zIHByb2R1Y3QgaGFzIG5vdCBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgKGkuZS4sIGJ5IHNwZWNpZnlpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGBwcm9kdWN0c2AsIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgLCBvciBgb3B0aW9uYWxfcHJvZHVjdHNgIGFycmF5IHdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCBvciBieSBtYWtpbmcgYSBwcmV2aW91cyBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIG9yIGAvdHJhbnNhY3Rpb25zL2dldGApLiBJbiB0aG9zZSBjYXNlcywgdGhlIGZpZWxkIGNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBkYXlzIG9mIHRyYW5zYWN0aW9uIGhpc3RvcnkgdGhhdCBQbGFpZCB3aWxsIHJlcXVlc3QgZnJvbSB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLiBUaGUgbW9yZSB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlcXVlc3RlZCwgdGhlIGxvbmdlciB0aGUgaGlzdG9yaWNhbCB1cGRhdGUgcG9sbCB3aWxsIHRha2UuIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgOTAgZGF5cyBvZiBoaXN0b3J5IHdpbGwgYmUgcmVxdWVzdGVkIGJ5IGRlZmF1bHQuICBJZiB5b3UgYXJlIGluaXRpYWxpemluZyB5b3VyIEl0ZW1zIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCAoZS5nLiBieSBpbmNsdWRpbmcgYHRyYW5zYWN0aW9uc2AgaW4gdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBwcm9kdWN0c2AgYXJyYXkpLCB5b3UgbXVzdCB1c2UgdGhlIFtgdHJhbnNhY3Rpb25zLmRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIGZpZWxkIGluIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCByZXF1ZXN0IGluc3RlYWQgb2YgaW4gdGhlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJlcXVlc3QuICBJZiB0aGUgSXRlbSBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LCB0aGlzIGZpZWxkIHdpbGwgaGF2ZSBubyBlZmZlY3QuIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0cmFuc2FjdGlvbiBoaXN0b3J5IHRvIHJlcXVlc3Qgb24gYW4gSXRlbSBjYW5ub3QgYmUgdXBkYXRlZCBpZiBUcmFuc2FjdGlvbnMgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgSXRlbS4gVG8gcmVxdWVzdCBvbGRlciB0cmFuc2FjdGlvbiBoaXN0b3J5IG9uIGFuIEl0ZW0gd2hlcmUgVHJhbnNhY3Rpb25zIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQsIHlvdSBtdXN0IGRlbGV0ZSB0aGUgSXRlbSB2aWEgYC9pdGVtL3JlbW92ZWAgYW5kIHNlbmQgdGhlIHVzZXIgdGhyb3VnaCBMaW5rIHRvIGNyZWF0ZSBhIG5ldyBJdGVtLiAgIEN1c3RvbWVycyB1c2luZyBbUmVjdXJyaW5nIFRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNyZWN1cnJpbmdnZXQpIHNob3VsZCByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3RvcnkgZm9yIG9wdGltYWwgcmVzdWx0cy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdE9wdGlvbnNcbiAgICAgKi9cbiAgICBkYXlzX3JlcXVlc3RlZD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBJZiBwcm92aWRlZCwgdGhlIHJldHVybmVkIHVwZGF0ZXMgYW5kIGN1cnNvciB3aWxsIG9ubHkgcmVmbGVjdCB0aGUgc3BlY2lmaWVkIGFjY291bnRcXCdzIHRyYW5zYWN0aW9ucy4gT21pdHRpbmcgYGFjY291bnRfaWRgIHJldHVybnMgdXBkYXRlcyBmb3IgYWxsIGFjY291bnRzIHVuZGVyIHRoZSBJdGVtLiBOb3RlIHRoYXQgc3BlY2lmeWluZyBhbiBgYWNjb3VudF9pZGAgZWZmZWN0aXZlbHkgY3JlYXRlcyBhIHNlcGFyYXRlIGluY3JlbWVudGFsIHVwZGF0ZSBzdHJlYW3igJRhbmQgdGhlcmVmb3JlIGEgc2VwYXJhdGUgY3Vyc29y4oCUZm9yIHRoYXQgYWNjb3VudC4gSWYgbXVsdGlwbGUgYWNjb3VudHMgYXJlIHF1ZXJpZWQgdGhpcyB3YXksIHlvdSB3aWxsIG1haW50YWluIG11bHRpcGxlIGN1cnNvcnMsIG9uZSBwZXIgYGFjY291bnRfaWRgLiAgIElmIHlvdSBkZWNpZGUgdG8gYmVnaW4gZmlsdGVyaW5nIGJ5IGBhY2NvdW50X2lkYCBhZnRlciB1c2luZyBubyBgYWNjb3VudF9pZGAsIHN0YXJ0IGZyZXNoIHdpdGggYSBudWxsIGN1cnNvciBhbmQgbWFpbnRhaW4gc2VwYXJhdGUgYChhY2NvdW50X2lkLCBjdXJzb3IpYCBwYWlycyBnb2luZyBmb3J3YXJkLiBEbyBub3QgcmV1c2UgYW55IHByZXZpb3VzbHkgc2F2ZWQgY3Vyc29ycywgYXMgdGhpcyBjYW4gY2F1c2UgcGFnaW5hdGlvbiBlcnJvcnMgb3IgaW5jb21wbGV0ZSBkYXRhLiAgTm90ZTogQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiBhIHByb3ZpZGVkIGBhY2NvdW50X2lkYCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zX3VwZGF0ZV9zdGF0dXM6IFRyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50cyBhdCBhIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9ucyBpbiB0aGlzIHJlc3BvbnNlLiBPbmx5IGFjY291bnRzIHRoYXQgaGF2ZSBhc3NvY2lhdGVkIHRyYW5zYWN0aW9ucyB3aWxsIGJlIHNob3duLiBGb3IgZXhhbXBsZSwgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMgd2lsbCBiZSBvbWl0dGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxBY2NvdW50QmFzZT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1N5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRzOiBBcnJheTxBY2NvdW50QmFzZT47XG4gICAgLyoqXG4gICAgICogVHJhbnNhY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNhY3Rpb24+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhZGRlZDogQXJyYXk8VHJhbnNhY3Rpb24+O1xuICAgIC8qKlxuICAgICAqIFRyYW5zYWN0aW9ucyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZCBvbiB0aGUgSXRlbSBzaW5jZSBgY3Vyc29yYCBvcmRlcmVkIGJ5IGFzY2VuZGluZyBsYXN0IG1vZGlmaWVkIHRpbWUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgbW9kaWZpZWQ6IEFycmF5PFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBUcmFuc2FjdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBJdGVtIHNpbmNlIGBjdXJzb3JgIG9yZGVyZWQgYnkgYXNjZW5kaW5nIGxhc3QgbW9kaWZpZWQgdGltZS5cbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVtb3ZlZDogQXJyYXk8UmVtb3ZlZFRyYW5zYWN0aW9uPjtcbiAgICAvKipcbiAgICAgKiBDdXJzb3IgdXNlZCBmb3IgZmV0Y2hpbmcgYW55IGZ1dHVyZSB1cGRhdGVzIGFmdGVyIHRoZSBsYXRlc3QgdXBkYXRlIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2UuIFRoZSBjdXJzb3Igb2J0YWluZWQgYWZ0ZXIgYWxsIHBhZ2VzIGhhdmUgYmVlbiBwdWxsZWQgKGluZGljYXRlZCBieSBgaGFzX21vcmVgIGJlaW5nIGBmYWxzZWApIHdpbGwgYmUgdmFsaWQgZm9yIGF0IGxlYXN0IDEgeWVhci4gVGhpcyBjdXJzb3Igc2hvdWxkIGJlIHBlcnNpc3RlZCBmb3IgbGF0ZXIgY2FsbHMuIElmIHRyYW5zYWN0aW9ucyBhcmUgbm90IHlldCBhdmFpbGFibGUsIHRoaXMgd2lsbCBiZSBhbiBlbXB0eSBzdHJpbmcuICBJZiBgYWNjb3VudF9pZGAgaXMgaW5jbHVkZWQgaW4gdGhlIHJlcXVlc3QsIHRoZSByZXR1cm5lZCBjdXJzb3Igd2lsbCByZWZsZWN0IHVwZGF0ZXMgZm9yIHRoYXQgc3BlY2lmaWMgYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgaWYgbW9yZSB0aGFuIHJlcXVlc3RlZCBjb3VudCBvZiB0cmFuc2FjdGlvbiB1cGRhdGVzIGV4aXN0LiBJZiB0cnVlLCB0aGUgYWRkaXRpb25hbCB1cGRhdGVzIGNhbiBiZSBmZXRjaGVkIGJ5IG1ha2luZyBhbiBhZGRpdGlvbmFsIHJlcXVlc3Qgd2l0aCBgY3Vyc29yYCBzZXQgdG8gYG5leHRfY3Vyc29yYC4gSWYgYGhhc19tb3JlYCBpcyB0cnVlLCBpdOKAmXMgaW1wb3J0YW50IHRvIHB1bGwgYWxsIGF2YWlsYWJsZSBwYWdlcywgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSBmb3IgdW5kZXJseWluZyBkYXRhIGNoYW5nZXMgdG8gY29uZmxpY3Qgd2l0aCBwYWdpbmF0aW9uLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2VcbiAgICAgKi9cbiAgICBoYXNfbW9yZTogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSB1cGRhdGUgc3RhdHVzIGZvciB0cmFuc2FjdGlvbiBwdWxscyBvZiBhbiBJdGVtLiBUaGlzIGZpZWxkIGNvbnRhaW5zIHRoZSBzYW1lIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IHRyYW5zYWN0aW9ucyB3ZWJob29rcywgYW5kIG1heSBiZSBoZWxwZnVsIGZvciB3ZWJob29rIHRyb3VibGVzaG9vdGluZyBvciB3aGVuIHJlY292ZXJpbmcgZnJvbSBtaXNzZWQgd2ViaG9va3MuICBgVFJBTlNBQ1RJT05TX1VQREFURV9TVEFUVVNfVU5LTk9XTmA6IFVuYWJsZSB0byBmZXRjaCB0cmFuc2FjdGlvbnMgdXBkYXRlIHN0YXR1cyBmb3IgSXRlbS4gYE5PVF9SRUFEWWA6IFRoZSBJdGVtIGlzIHBlbmRpbmcgdHJhbnNhY3Rpb24gcHVsbC4gYElOSVRJQUxfVVBEQVRFX0NPTVBMRVRFYDogSW5pdGlhbCBwdWxsIGZvciB0aGUgSXRlbSBpcyBjb21wbGV0ZSwgaGlzdG9yaWNhbCBwdWxsIGlzIHBlbmRpbmcuIGBISVNUT1JJQ0FMX1VQREFURV9DT01QTEVURWA6IEJvdGggaW5pdGlhbCBhbmQgaGlzdG9yaWNhbCBwdWxsIGZvciBJdGVtIGFyZSBjb21wbGV0ZS5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zYWN0aW9uc1VwZGF0ZVN0YXR1cyB7XG4gICAgVHJhbnNhY3Rpb25zVXBkYXRlU3RhdHVzVW5rbm93biA9ICdUUkFOU0FDVElPTlNfVVBEQVRFX1NUQVRVU19VTktOT1dOJyxcbiAgICBOb3RSZWFkeSA9ICdOT1RfUkVBRFknLFxuICAgIEluaXRpYWxVcGRhdGVDb21wbGV0ZSA9ICdJTklUSUFMX1VQREFURV9DT01QTEVURScsXG4gICAgSGlzdG9yaWNhbFVwZGF0ZUNvbXBsZXRlID0gJ0hJU1RPUklDQUxfVVBEQVRFX0NPTVBMRVRFJ1xufVxuXG4vKipcbiAqIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGNsaWVudC1wcm92aWRlZCB1c2VyX2lkIHRvIHJldHJpZXZlIGluc2lnaHRzIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJEYXRhT3ZlcnZpZXd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgdXNlcl9kYXRhX292ZXJ2aWV3OiBVc2VyRGF0YU92ZXJ2aWV3O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtDb3VudGVycGFydHlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHlfaW5zaWdodHM/OiBDb3VudGVycGFydHlJbnNpZ2h0cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q2F0ZWdvcnlJbnNpZ2h0c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjYXRlZ29yeV9pbnNpZ2h0cz86IENhdGVnb3J5SW5zaWdodHM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1JlY3VycmluZ1RyYW5zYWN0aW9uc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNhY3Rpb25zPzogUmVjdXJyaW5nVHJhbnNhY3Rpb25zO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGVuZC11c2VyIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBsZWRnZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVzcG9uc2U7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB3aGVuIHRoaXMgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJTdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3dlZXBfc3RhdHVzPzogVHJhbnNmZXJTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyV2lyZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgd2lyZV9kZXRhaWxzPzogVHJhbnNmZXJXaXJlRGV0YWlscyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHlvdSBjYW4gc3RpbGwgY2FuY2VsIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgY2FuY2VsbGFibGU6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbjogVHJhbnNmZXJGYWlsdXJlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgTWV0YWRhdGEgb2JqZWN0IGlzIGEgbWFwcGluZyBvZiBjbGllbnQtcHJvdmlkZWQgc3RyaW5nIGZpZWxkcyB0byBhbnkgc3RyaW5nIHZhbHVlLiBUaGUgZm9sbG93aW5nIGxpbWl0YXRpb25zIGFwcGx5OiBUaGUgSlNPTiB2YWx1ZXMgbXVzdCBiZSBTdHJpbmdzIChubyBuZXN0ZWQgSlNPTiBvYmplY3RzIGFsbG93ZWQpIE9ubHkgQVNDSUkgY2hhcmFjdGVycyBtYXkgYmUgdXNlZCBNYXhpbXVtIG9mIDUwIGtleS92YWx1ZSBwYWlycyBNYXhpbXVtIGtleSBsZW5ndGggb2YgNDAgY2hhcmFjdGVycyBNYXhpbXVtIHZhbHVlIGxlbmd0aCBvZiA1MDAgY2hhcmFjdGVycyBcbiAgICAgKiBAdHlwZSB7eyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH19XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgbWV0YWRhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IHRoYXQgd2FzIHVzZWQgZm9yIHRoaXMgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGd1YXJhbnRlZV9kZWNpc2lvbl9yYXRpb25hbGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSAzIGJ1c2luZXNzIGRheXMgZnJvbSBzZXR0bGVtZW50IGRhdGUgaW5kaWNhdGluZyB0aGUgZm9sbG93aW5nIEFDSCByZXR1cm5zIGNhbiBubyBsb25nZXIgaGFwcGVuOiBSMDEsIFIwMiwgUjAzLCBSMjkuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgc3RhbmRhcmRfcmV0dXJuX3dpbmRvdzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSA2MSBidXNpbmVzcyBkYXlzIGZyb20gc2V0dGxlbWVudCBkYXRlIGluZGljYXRpbmcgdGhlIGZvbGxvd2luZyBBQ0ggcmV0dXJucyBjYW4gbm8gbG9uZ2VyIGhhcHBlbjogUjA1LCBSMDcsIFIxMCwgUjExLCBSNTEsIFIzMywgUjM3LCBSMzgsIFI1MSwgUjUyLCBSNTMuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgdW5hdXRob3JpemVkX3JldHVybl93aW5kb3c6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgd2hlbiBzZXR0bGVtZW50IHdpbGwgb2NjdXIgYmV0d2VlbiBQbGFpZCBhbmQgdGhlIHJlY2VpdmluZyBiYW5rIChSREZJKS4gRm9yIEFDSCBkZWJpdHMsIHRoaXMgaXMgdGhlIGRhdGUgZnVuZHMgd2lsbCBiZSBwdWxsZWQgZnJvbSB0aGUgYmFuayBhY2NvdW50IGJlaW5nIGRlYml0ZWQuIEZvciBBQ0ggY3JlZGl0cywgdGhpcyBpcyB0aGUgZGF0ZSBmdW5kcyB3aWxsIGJlIGRlbGl2ZXJlZCB0byB0aGUgYmFuayBhY2NvdW50IGJlaW5nIGNyZWRpdGVkLiBPbmx5IHNldCBmb3IgQUNIIHRyYW5zZmVyczsgYG51bGxgIGZvciBub24tQUNIIHRyYW5zZmVycy4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIFlZWVktTU0tREQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJcbiAgICAgKi9cbiAgICBleHBlY3RlZF9zZXR0bGVtZW50X2RhdGU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgcHJlc2VudCBpZiBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiByZWZ1bmRzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2ZlclJlZnVuZD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgcmVmdW5kczogQXJyYXk8VHJhbnNmZXJSZWZ1bmQ+O1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGlmIHRoaXMgdHJhbnNmZXIgYmVsb25ncyB0byBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwZWN0ZWQgc3dlZXAgc2V0dGxlbWVudCBzY2hlZHVsZSBvZiB0aGlzIHRyYW5zZmVyLCBhc3N1bWluZyB0aGlzIHRyYW5zZmVyIGlzIG5vdCBgcmV0dXJuZWRgLiBPbmx5IGFwcGxpZXMgdG8gQUNIIGRlYml0IHRyYW5zZmVycy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbT59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyXG4gICAgICovXG4gICAgZXhwZWN0ZWRfc3dlZXBfc2V0dGxlbWVudF9zY2hlZHVsZT86IEFycmF5PFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0+O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZTogVHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IHRvIGRlZHVjdCBmcm9tIGB0cmFuc2Zlci5hbW91bnRgIGFuZCBkaXN0cmlidXRlIHRvIHRoZSBwbGF0Zm9ybeKAmXMgTGVkZ2VyIGJhbGFuY2UgYXMgYSBmYWNpbGl0YXRvciBmZWUgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhlIHJlbWFpbmRlciB3aWxsIGdvIHRvIHRoZSBlbmQtY3VzdG9tZXLigJlzIExlZGdlciBiYWxhbmNlLiBUaGlzIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBgdHJhbnNmZXIuYW1vdW50YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHJhY2UgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGJhc2VkIG9uIGl0cyBuZXR3b3JrLiBUaGlzIHdpbGwgb25seSBiZSBzZXQgYWZ0ZXIgdGhlIHRyYW5zZmVyIGhhcyBwb3N0ZWQuICBGb3IgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBBQ0ggdHJhY2UgbnVtYmVyLiBGb3IgYHJ0cGAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBUcmFuc2FjdGlvbiBJZGVudGlmaWNhdGlvbiBudW1iZXIuIEZvciBgd2lyZWAgdHJhbnNmZXJzLCB0aGlzIGlzIHRoZSBJTUFEIChJbnB1dCBNZXNzYWdlIEFjY291bnRhYmlsaXR5IERhdGEpIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgQUNIIG5ldHdvcmtzIHVzZWQgZm9yIHRoZSBmdW5kcyBmbG93LiAgRm9yIHJlcXVlc3RzIHN1Ym1pdHRlZCBhcyBlaXRoZXIgYGFjaGAgb3IgYHNhbWUtZGF5LWFjaGAgdGhlIGN1dG9mZiBmb3Igc2FtZS1kYXkgaXMgMzozMCBQTSBFYXN0ZXJuIFRpbWUgYW5kIHRoZSBjdXRvZmYgZm9yIG5leHQtZGF5IHRyYW5zZmVycyBpcyA4OjMwIFBNIEVhc3Rlcm4gVGltZS4gSXQgaXMgcmVjb21tZW5kZWQgdG8gc3VibWl0IGEgcmVxdWVzdCBhdCBsZWFzdCAxNSBtaW51dGVzIGJlZm9yZSB0aGUgY3V0b2ZmIHRpbWUgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgaXQgd2lsbCBiZSBwcm9jZXNzZWQgYmVmb3JlIHRoZSBjdXRvZmYuIEFueSByZXF1ZXN0IHRoYXQgaXMgaW5kaWNhdGVkIGFzIGBzYW1lLWRheS1hY2hgIGFuZCB0aGF0IG1pc3NlcyB0aGUgc2FtZS1kYXkgY3V0b2ZmLCBidXQgaXMgc3VibWl0dGVkIGluIHRpbWUgZm9yIHRoZSBuZXh0LWRheSBjdXRvZmYsIHdpbGwgYmUgc2VudCBvdmVyIG5leHQtZGF5IHJhaWxzIGFuZCB3aWxsIG5vdCBpbmN1ciBzYW1lLWRheSBjaGFyZ2VzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJBQ0hOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCdcbn1cblxuLyoqXG4gKiBDb250YWlucyB0aGUgYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBmb3IgYSBwcm9wb3NlZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSByZXByZXNlbnRpbmcgd2hlbiB0aGUgYXV0aG9yaXphdGlvbiB3YXMgY3JlYXRlZCwgaW4gdGhlIGZvcm1hdCBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblxuICAgICAqL1xuICAgIGRlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uXG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBheW1lbnRfcmlzazogVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2sgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25cbiAgICAgKi9cbiAgICBwcm9wb3NlZF90cmFuc2ZlcjogVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2Zlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25faWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gU2hvdWxkIGJlIHNwZWNpZmllZCBpZiB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzIG9ubHkuIElmIHVzaW5nIFBsYWlkIExlZGdlciwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgYW5kIHlvdSBhcmUgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLiBPdGhlcndpc2UsIFBsYWlkIExlZGdlciB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBwcm9maWxlIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXF1aXJlZCBpZiBub3QgdXNpbmcgYGFjY2Vzc190b2tlbmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBheW1lbnRfcHJvZmlsZV90b2tlbj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck5ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FDSENsYXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNoX2NsYXNzPzogQUNIQ2xhc3M7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyV2lyZURldGFpbHN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX2RldGFpbHM/OiBUcmFuc2ZlcldpcmVEZXRhaWxzIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZTtcbiAgICAvKipcbiAgICAgKiBQbGFpZFxcJ3MgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIGF1dGhvcml6YXRpb24uIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IGFjY291bnQgd2lsbCBiZSB1c2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSBhdXRob3JpemF0aW9uLCB3aGljaCBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGFuIGF1dGhvcml6YXRpb24gZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgYXV0aG9yaXphdGlvbiBpcyBjcmVhdGVkLiAgSWRlbXBvdGVuY3kgZG9lcyBub3QgYXBwbHkgdG8gYXV0aG9yaXphdGlvbnMgd2hvc2UgZGVjaXNpb25zIGFyZSBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLiBUaGVyZWZvcmUgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uIGFmdGVyIGNvbXBsZXRpbmcgdGhlIHJlcXVpcmVkIHVzZXIgYWN0aW9uIHdpdGhvdXQgY2hhbmdpbmcgYGlkZW1wb3RlbmN5X2tleWAuICBUaGlzIGlkZW1wb3RlbmN5IGtleSBleHBpcmVzIGFmdGVyIDQ4IGhvdXJzLCBhZnRlciB3aGljaCB0aGUgc2FtZSBrZXkgY2FuIGJlIHJldXNlZC4gRmFpbHVyZSB0byBwcm92aWRlIHRoaXMga2V5IG1heSByZXN1bHQgaW4gZHVwbGljYXRlIGNoYXJnZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVuZCB1c2VyIGlzIGluaXRpYXRpbmcgdGhlIHNwZWNpZmljIHRyYW5zZmVyIHRoZW1zZWx2ZXMgdmlhIGFuIGludGVyYWN0aXZlIFVJLCB0aGlzIHNob3VsZCBiZSBgdHJ1ZWA7IGZvciBhdXRvbWF0aWMgcmVjdXJyaW5nIHBheW1lbnRzIHdoZXJlIHRoZSBlbmQgdXNlciBpcyBub3QgYWN0dWFsbHkgaW5pdGlhdGluZyBlYWNoIGluZGl2aWR1YWwgdHJhbnNmZXIsIGl0IHNob3VsZCBiZSBgZmFsc2VgLiBUaGlzIGZpZWxkIGlzIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgaXMgcHJlc2VudCB0byBzdXBwb3J0IHBsYW5uZWQgZnV0dXJlIGZ1bmN0aW9uYWxpdHkuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJZiBzZXQgdG8gYGZhbHNlYCwgUGxhaWQgd2lsbCBub3Qgb2ZmZXIgYSBgZ3VhcmFudGVlX2RlY2lzaW9uYCBmb3IgdGhpcyByZXF1ZXN0IChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2l0aF9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgcmV0dXJuZWQgYnkgUGxhaWRcXCdzIFtiZWFjb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvZ3VhcmFudGVlLyN1c2luZy1hLWJlYWNvbikgd2hlbiBpdCBpcyBydW4gb24geW91ciB3ZWJwYWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBiZWFjb25fc2Vzc2lvbl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCB0aGF0IGlzIHRoZSBvcmlnaW5hdG9yIG9mIHRoaXMgdHJhbnNmZXIuIE9ubHkgbmVlZGVkIGlmIGNyZWF0aW5nIHRyYW5zZmVycyBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJDcmVkaXRGdW5kc1NvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgY3JlZGl0X2Z1bmRzX3NvdXJjZT86IFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2U7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRlc3QgY2xvY2suIFRoaXMgZmllbGQgbWF5IG9ubHkgYmUgdXNlZCB3aGVuIHVzaW5nIGBzYW5kYm94YCBlbnZpcm9ubWVudC4gSWYgcHJvdmlkZWQsIHRoZSBgYXV0aG9yaXphdGlvbmAgaXMgY3JlYXRlZCBhdCB0aGUgYHZpcnR1YWxfdGltZWAgb24gdGhlIHByb3ZpZGVkIHRlc3QgY2xvY2suXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBrZXkgb2YgdGhlIFJ1bGVzZXQgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBpbiBjbG9zZWQgYmV0YTsgdG8gcmVxdWVzdCBhY2Nlc3MsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJ1bGVzZXRfa2V5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgYXBwcm92ZWRgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy4gIGBkZWNsaW5lZGAg4oCTIFBsYWlkIHJldmlld2VkIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBhbmQgZGVjbGluZWQgcHJvY2Vzc2luZy4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLiAgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCDigJMgQW4gYWN0aW9uIGlzIHJlcXVpcmVkIGJlZm9yZSBQbGFpZCBjYW4gYXNzZXNzIHRoZSB0cmFuc2ZlciByaXNrIGFuZCBtYWtlIGEgZGVjaXNpb24uIFRoZSBtb3N0IGNvbW1vbiBzY2VuYXJpbyBpcyB0byB1cGRhdGUgYXV0aGVudGljYXRpb24gZm9yIGFuIEl0ZW0uIFRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCBhY3Rpb24sIGluaXRpYWxpemUgTGluayBieSBzZXR0aW5nIGB0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYCBpbiB0aGUgcmVxdWVzdCBvZiBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gQWZ0ZXIgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uIHJlcXVlc3QuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvbiB7XG4gICAgQXBwcm92ZWQgPSAnYXBwcm92ZWQnLFxuICAgIERlY2xpbmVkID0gJ2RlY2xpbmVkJyxcbiAgICBVc2VyQWN0aW9uUmVxdWlyZWQgPSAndXNlcl9hY3Rpb25fcmVxdWlyZWQnXG59XG5cbi8qKlxuICogVGhlIHJhdGlvbmFsZSBmb3IgUGxhaWRcXCdzIGRlY2lzaW9uIHJlZ2FyZGluZyBhIHByb3Bvc2VkIHRyYW5zZmVyLiBJdCBpcyBhbHdheXMgc2V0IGZvciBgZGVjbGluZWRgIGRlY2lzaW9ucywgYW5kIG1heSBvciBtYXkgbm90IGJlIG51bGwgZm9yIGBhcHByb3ZlZGAgZGVjaXNpb25zLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVDb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGNvZGU6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlQ29kZTtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIHRyYW5zZmVyIGFwcHJvdmFsIG9yIHRyYW5zZmVyIGRlY2xpbmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGVcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xufVxuLyoqXG4gKiBBIGNvZGUgcmVwcmVzZW50aW5nIHRoZSByYXRpb25hbGUgZm9yIGFwcHJvdmluZyBvciBkZWNsaW5pbmcgdGhlIHByb3Bvc2VkIHRyYW5zZmVyLiAgSWYgdGhlIGByYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgcGFzc2VkIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrLiAgQW55IG5vbi1gbnVsbGAgdmFsdWUgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgaW5kaWNhdGVzIHRoYXQgdGhlIHRoZSBhdXRob3JpemF0aW9uIGNoZWNrIGNvdWxkIG5vdCBiZSBydW4gYW5kIHRoYXQgeW91IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgYXNzZXNzbWVudCBvbiB0aGUgdHJhbnNmZXIuIFRoZSBjb2RlIHdpbGwgaW5kaWNhdGUgd2h5IHRoZSBjaGVjayBjb3VsZCBub3QgYmUgcnVuLiBQb3NzaWJsZSB2YWx1ZXMgZm9yIGFuIGBhcHByb3ZlZGAgdHJhbnNmZXIgYXJlOiAgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gIOKAkyBJdGVtIGNyZWF0ZWQgdmlhIGEgbWFudWFsIGVudHJ5IGZsb3cgKGkuZS4gU2FtZSBEYXkgTWljcm8tZGVwb3NpdCwgSW5zdGFudCBNaWNyby1kZXBvc2l0LCBEYXRhYmFzZSBJbnNpZ2h0cywgb3IgRGF0YWJhc2UgTWF0Y2gpLCBsaW1pdGVkIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4gIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCDigJMgVW5hYmxlIHRvIGNvbGxlY3QgdGhlIGFjY291bnQgaW5mb3JtYXRpb24gZHVlIHRvIEl0ZW0gc3RhbGVuZXNzLiBDYW4gYmUgcmVzb2x2ZWQgYnkgdXNpbmcgTGluayBhbmQgc2V0dGluZyBbYHRyYW5zZmVyLmF1dGhvcml6YXRpb25faWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zZmVyLWF1dGhvcml6YXRpb24taWQpIGluIHRoZSByZXF1ZXN0IHRvIGAvbGluay90b2tlbi9jcmVhdGVgLiAgYE1JR1JBVEVEX0FDQ09VTlRfSVRFTWAgLSBJdGVtIGNyZWF0ZWQgdmlhIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCwgbGltaXRlZCBpbmZvcm1hdGlvbiBhdmFpbGFibGUuICBgRVJST1JgIOKAkyBVbmFibGUgdG8gY29sbGVjdCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbiBkdWUgdG8gYW4gdW5zcGVjaWZpZWQgZXJyb3IuICBUaGUgZm9sbG93aW5nIGNvZGVzIGluZGljYXRlIHRoYXQgdGhlIGF1dGhvcml6YXRpb24gZGVjaXNpb24gd2FzIGBkZWNsaW5lZGA6ICBgTlNGYCDigJMgVHJhbnNhY3Rpb24gbGlrZWx5IHRvIHJlc3VsdCBpbiBhIHJldHVybiBkdWUgdG8gaW5zdWZmaWNpZW50IGZ1bmRzLiAgYFJJU0tgIC0gVHJhbnNhY3Rpb24gaXMgaGlnaC1yaXNrLiAgYFRSQU5TRkVSX0xJTUlUX1JFQUNIRURgIC0gT25lIG9yIHNldmVyYWwgdHJhbnNmZXIgbGltaXRzIGFyZSByZWFjaGVkLCBlLmcuIG1vbnRobHkgdHJhbnNmZXIgbGltaXQuIENoZWNrIHRoZSBhY2NvbXBhbnlpbmcgYGRlc2NyaXB0aW9uYCBmaWVsZCB0byB1bmRlcnN0YW5kIHdoaWNoIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZUNvZGUge1xuICAgIE5zZiA9ICdOU0YnLFxuICAgIFJpc2sgPSAnUklTSycsXG4gICAgVHJhbnNmZXJMaW1pdFJlYWNoZWQgPSAnVFJBTlNGRVJfTElNSVRfUkVBQ0hFRCcsXG4gICAgTWFudWFsbHlWZXJpZmllZEl0ZW0gPSAnTUFOVUFMTFlfVkVSSUZJRURfSVRFTScsXG4gICAgSXRlbUxvZ2luUmVxdWlyZWQgPSAnSVRFTV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgUGF5bWVudFByb2ZpbGVMb2dpblJlcXVpcmVkID0gJ1BBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRCcsXG4gICAgRXJyb3IgPSAnRVJST1InLFxuICAgIE1pZ3JhdGVkQWNjb3VudEl0ZW0gPSAnTUlHUkFURURfQUNDT1VOVF9JVEVNJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLiBUaGVzZSBmaWVsZHMgYXJlIG5vdCBjdXJyZW50bHkgaW5jb3Jwb3JhdGVkIGludG8gdGhlIHJpc2sgY2hlY2suXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElQIGFkZHJlc3Mgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICAgICAqL1xuICAgIGlwX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkRldmljZVxuICAgICAqL1xuICAgIHVzZXJfYWdlbnQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0cmFuc2ZlciBpcyBndWFyYW50ZWVkIGJ5IFBsYWlkIChHdWFyYW50ZWUgY3VzdG9tZXJzIG9ubHkpLiBUaGlzIGZpZWxkIHdpbGwgY29udGFpbiBlaXRoZXIgYEdVQVJBTlRFRURgIG9yIGBOT1RfR1VBUkFOVEVFRGAgaW5kaWNhdGluZyB3aGV0aGVyIFBsYWlkIHdpbGwgZ3VhcmFudGVlIHRoZSB0cmFuc2Zlci4gSWYgdGhlIHRyYW5zZmVyIGlzIG5vdCBndWFyYW50ZWVkLCBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHdpbGwgYmUgcHJvdmlkZWQgaW4gdGhlIGBndWFyYW50ZWVfZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZC4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiBgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZWAgZm9yIGRldGFpbHMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbiB7XG4gICAgR3VhcmFudGVlZCA9ICdHVUFSQU5URUVEJyxcbiAgICBOb3RHdWFyYW50ZWVkID0gJ05PVF9HVUFSQU5URUVEJyxcbiAgICBOdWxsID0gJ251bGwnXG59XG5cbi8qKlxuICogVGhlIHJhdGlvbmFsZSBmb3IgUGxhaWRcXCdzIGRlY2lzaW9uIHRvIG5vdCBndWFyYW50ZWUgYSB0cmFuc2Zlci4gV2lsbCBiZSBgbnVsbGAgdW5sZXNzIGBndWFyYW50ZWVfZGVjaXNpb25gIGlzIGBOT1RfR1VBUkFOVEVFRGAuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlXG4gICAgICovXG4gICAgY29kZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGVDb2RlO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2Ygd2h5IHRoZSB0cmFuc2ZlciBjYW5ub3QgYmUgZ3VhcmFudGVlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvblJhdGlvbmFsZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgY29kZSByZXByZXNlbnRpbmcgdGhlIHJlYXNvbiBQbGFpZCBkZWNsaW5lZCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2ZlcjogIGBSRVRVUk5fQkFOS2A6IFRoZSByaXNrIG9mIGEgYmFuay1pbml0aWF0ZWQgcmV0dXJuIChmb3IgZXhhbXBsZSwgYW4gUjAxL05TRikgaXMgdG9vIGhpZ2ggdG8gZ3VhcmFudGVlIHRoaXMgdHJhbnNmZXIuICBgUkVUVVJOX0NVU1RPTUVSYDogVGhlIHJpc2sgb2YgYSBjdXN0b21lci1pbml0aWF0ZWQgcmV0dXJuIChmb3IgZXhhbXBsZSwgYSBSMTAvVW5hdXRob3JpemVkKSBpcyB0b28gaGlnaCB0byBndWFyYW50ZWUgdGhpcyB0cmFuc2Zlci4gIGBHVUFSQU5URUVfTElNSVRfUkVBQ0hFRGA6IFRoaXMgdHJhbnNmZXIgaXMgbG93LXJpc2ssIGJ1dCBHdWFyYW50ZWUgaGFzIGV4aGF1c3RlZCBhbiBpbnRlcm5hbCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9yIHJhdGUgb2YgZ3VhcmFudGVlcyB0aGF0IGFwcGxpZXMgdG8gdGhpcyB0cmFuc2Zlci4gIGBSSVNLX0VTVElNQVRFX1VOQVZBSUxBQkxFYDogQSByaXNrIGVzdGltYXRlIGlzIHVuYXZhaWxhYmxlIGZvciB0aGlzIEl0ZW0uICBgUkVRVUlSRURfUEFSQU1fTUlTU0lOR2A6IFJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uUmF0aW9uYWxlQ29kZSB7XG4gICAgUmV0dXJuQmFuayA9ICdSRVRVUk5fQkFOSycsXG4gICAgUmV0dXJuQ3VzdG9tZXIgPSAnUkVUVVJOX0NVU1RPTUVSJyxcbiAgICBHdWFyYW50ZWVMaW1pdFJlYWNoZWQgPSAnR1VBUkFOVEVFX0xJTUlUX1JFQUNIRUQnLFxuICAgIFJpc2tFc3RpbWF0ZVVuYXZhaWxhYmxlID0gJ1JJU0tfRVNUSU1BVEVfVU5BVkFJTEFCTEUnLFxuICAgIFJlcXVpcmVkUGFyYW1NaXNzaW5nID0gJ1JFUVVJUkVEX1BBUkFNX01JU1NJTkcnXG59XG5cbi8qKlxuICogVGhpcyBvYmplY3QgaW5jbHVkZXMgdGhlIHNjb3JlcyBhbmQgcmlzayBsZXZlbC4gVGhpcyByZXNwb25zZSBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGUuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoZXNlIGZpZWxkcyBwbGVhc2UgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50UmlzayB7XG4gICAgLyoqXG4gICAgICogQSBzY29yZSBmcm9tIDEtOTkgdGhhdCBpbmRpY2F0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrOiBhIGhpZ2hlciByaXNrIHNjb3JlIHN1Z2dlc3RzIGEgaGlnaGVyIHJldHVybiBsaWtlbGlob29kLiAgVGhlIHNjb3JlIGV2YWx1YXRlcyB0aGUgdHJhbnNhY3Rpb24gcmV0dXJuIHJpc2sgYmVjYXVzZSBhbiBhY2NvdW50IGlzIG92ZXJkcmF3biBvciBiZWNhdXNlIGFuIGluZWxpZ2libGUgYWNjb3VudCBpcyB1c2VkIGFuZCBjb3ZlcnMgcmV0dXJuIGNvZGVzOiBcXFwiUjAxXFxcIiwgXFxcIlIwMlxcXCIsIFxcXCJSMDNcXFwiLCBcXFwiUjA0XFxcIiwgXFxcIlIwNlxcXCIsIFxcXCJSMDhcXFwiLCAgXFxcIlIwOVxcXCIsIFxcXCJSMTNcXFwiLCBcXFwiUjE2XFxcIiwgXFxcIlIxN1xcXCIsIFxcXCJSMjBcXFwiLCBcXFwiUjIzXFxcIi4gVGhlc2UgcmV0dXJucyBoYXZlIGEgdHVybmFyb3VuZCB0aW1lIG9mIDIgYmFua2luZyBkYXlzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblBheW1lbnRSaXNrXG4gICAgICovXG4gICAgYmFua19pbml0aWF0ZWRfcmV0dXJuX3Njb3JlOiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgc2NvcmUgZnJvbSAxLTk5IHRoYXQgaW5kaWNhdGVzIHRoZSB0cmFuc2FjdGlvbiByZXR1cm4gcmlzazogYSBoaWdoZXIgcmlzayBzY29yZSBzdWdnZXN0cyBhIGhpZ2hlciByZXR1cm4gbGlrZWxpaG9vZC4gIFRoZSBzY29yZSBldmFsdWF0ZXMgdGhlIHRyYW5zYWN0aW9uIHJldHVybiByaXNrIG9mIGFuIHVuYXV0aG9yaXplZCBkZWJpdCBhbmQgY292ZXJzIHJldHVybiBjb2RlczogXFxcIlIwNVxcXCIsIFxcXCJSMDdcXFwiLCBcXFwiUjEwXFxcIiwgXFxcIlIxMVxcXCIsIFxcXCJSMjlcXFwiLiBUaGVzZSByZXR1cm5zIHR5cGljYWxseSBoYXZlIGEgcmV0dXJuIHRpbWUgZnJhbWUgb2YgdXAgdG8gNjAgY2FsZW5kYXIgZGF5cy4gRHVyaW5nIHRoaXMgcGVyaW9kLCB0aGUgY3VzdG9tZXIgb2YgZmluYW5jaWFsIGluc3RpdHV0aW9ucyBjYW4gZGlzcHV0ZSBhIHRyYW5zYWN0aW9uIGFzIHVuYXV0aG9yaXplZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25QYXltZW50Umlza1xuICAgICAqL1xuICAgIGN1c3RvbWVyX2luaXRpYXRlZF9yZXR1cm5fc2NvcmU6IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICByaXNrX2xldmVsOiBUcmFuc2ZlckF1dGhvcml6YXRpb25SaXNrTGV2ZWwgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElmIGJhbmsgaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUgdG8gYmUgdXNlZCBpbiB0aGUgU2lnbmFsIG1vZGVsLCB0aGlzIGFycmF5IGNvbnRhaW5zIHdhcm5pbmdzIGRlc2NyaWJpbmcgd2h5IGJhbmsgZGF0YSBpcyBtaXNzaW5nLiBJZiB5b3Ugd2FudCB0byByZWNlaXZlIGFuIEFQSSBlcnJvciBpbnN0ZWFkIG9mIFNpZ25hbCBzY29yZXMgaW4gdGhlIGNhc2Ugb2YgbWlzc2luZyBiYW5rIGRhdGEsIGZpbGUgYSBzdXBwb3J0IHRpY2tldCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEB0eXBlIHtBcnJheTxTaWduYWxXYXJuaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUGF5bWVudFJpc2tcbiAgICAgKi9cbiAgICB3YXJuaW5nczogQXJyYXk8U2lnbmFsV2FybmluZz47XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHRoZSBwcm9wb3NlZCB0cmFuc2Zlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXIge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlc3BvbnNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICovXG4gICAgdXNlcjogVHJhbnNmZXJVc2VySW5SZXNwb25zZTtcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG5ldHdvcms6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJXaXJlRGV0YWlsc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIHdpcmVfZGV0YWlscz86IFRyYW5zZmVyV2lyZURldGFpbHMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgdGhhdCB3YXMgdXNlZCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSB0cmFuc2ZlciBhbW91bnQuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblByb3Bvc2VkVHJhbnNmZXJcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgdGhhdCBpcyB0aGUgb3JpZ2luYXRvciBvZiB0aGlzIHRyYW5zZmVyLiBPbmx5IHByZXNlbnQgaWYgY3JlYXRlZCBvbiBiZWhhbGYgb2YgYW5vdGhlciBjbGllbnQgYXMgYSBbUGxhdGZvcm0gY3VzdG9tZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uUHJvcG9zZWRUcmFuc2ZlclxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckF1dGhvcml6YXRpb25Qcm9wb3NlZFRyYW5zZmVyXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBjcmVkaXRfZnVuZHNfc291cmNlOiBUcmFuc2ZlckNyZWRpdEZ1bmRzU291cmNlO1xufVxuLyoqXG4gKiBDb21wcmlzZXMgZml2ZSByaXNrIGNhdGVnb3JpZXMgKGhpZ2ggcmlzaywgbWVkaXVtLWhpZ2ggcmlzaywgbWVkaXVtIHJpc2ssIG1lZGl1bS1sb3cgcmlzaywgbG93IHJpc2spIGJhc2VkIG9uIHRoZSBwcm9iYWJpbGl0eSBvZiByZXR1cm5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQXV0aG9yaXphdGlvblJpc2tMZXZlbCB7XG4gICAgSGlnaFJpc2sgPSAnSElHSF9SSVNLJyxcbiAgICBNZWRpdW1IaWdoUmlzayA9ICdNRURJVU1fSElHSF9SSVNLJyxcbiAgICBNZWRpdW1SaXNrID0gJ01FRElVTV9SSVNLJyxcbiAgICBNZWRpdW1Mb3dSaXNrID0gJ01FRElVTV9MT1dfUklTSycsXG4gICAgTG93UmlzayA9ICdMT1dfUklTSydcbn1cblxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci4gIElmIHRoZSBhY2NvdW50IGhhcyBtdWx0aXBsZSBhY2NvdW50IGhvbGRlcnMsIHByb3ZpZGUgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIgb24gd2hvc2UgYmVoYWxmIHRoZSBhdXRob3JpemF0aW9uIGlzIGJlaW5nIHJlcXVlc3RlZC4gVGhlIGB1c2VyLmxlZ2FsX25hbWVgIGZpZWxkIGlzIHJlcXVpcmVkLiBPdGhlciBmaWVsZHMgYXJlIG5vdCBjdXJyZW50bHkgdXNlZCBhbmQgYXJlIHByZXNlbnQgdG8gc3VwcG9ydCBwbGFubmVkIGZ1dHVyZSBmdW5jdGlvbmFsaXR5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckF1dGhvcml6YXRpb25Vc2VySW5SZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuIElmIHRoZSB1c2VyIGlzIGEgYnVzaW5lc3MsIHByb3ZpZGUgdGhlIGJ1c2luZXNzIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgcGhvbmUgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBwaG9uZV9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGVtYWlsIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJBdXRob3JpemF0aW9uVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQXV0aG9yaXphdGlvblVzZXJJblJlcXVlc3RcbiAgICAgKi9cbiAgICBhZGRyZXNzPzogVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhpcyBiYWxhbmNlIGF2YWlsYWJsZSBmb3IgdXNlIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlXG4gICAgICovXG4gICAgYXZhaWxhYmxlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGF2YWlsYWJsZSBiYWxhbmNlLCBwbHVzIGFtb3VudCBvZiBwZW5kaW5nIGZ1bmRzIHRoYXQgaW4gcHJvY2Vzc2luZyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQmFsYW5jZVR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZVxuICAgICAqL1xuICAgIHR5cGU6IFRyYW5zZmVyQmFsYW5jZVR5cGU7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJCYWxhbmNlVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHR5cGU/OiBUcmFuc2ZlckJhbGFuY2VUeXBlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYmFsYW5jZTogVHJhbnNmZXJCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckJhbGFuY2VHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgYmFsYW5jZS4gIGBwcmVmdW5kZWRfcnRwX2NyZWRpdHNgIC0gWW91ciBwcmVmdW5kZWQgUlRQIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWQgYHByZWZ1bmRlZF9hY2hfY3JlZGl0c2AgLSBZb3VyIHByZWZ1bmRlZCBBQ0ggY3JlZGl0IGJhbGFuY2Ugd2l0aCBQbGFpZFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJCYWxhbmNlVHlwZSB7XG4gICAgUnRwQ3JlZGl0cyA9ICdwcmVmdW5kZWRfcnRwX2NyZWRpdHMnLFxuICAgIEFjaENyZWRpdHMgPSAncHJlZnVuZGVkX2FjaF9jcmVkaXRzJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ29udGFpbnMgdGhlIHN1cHBvcnRlZCBzZXJ2aWNlIHR5cGVzIGluIFJUUFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UlRQIHtcbiAgICAvKipcbiAgICAgKiBXaGVuIGB0cnVlYCwgdGhlIGxpbmtlZCBJdGVtXFwncyBpbnN0aXR1dGlvbiBzdXBwb3J0cyBSVFAgY3JlZGl0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJUUFxuICAgICAqL1xuICAgIGNyZWRpdD86IGJvb2xlYW47XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY2Vzc190b2tlbmAgZm9yIHRoZSBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY2Vzc190b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwYXltZW50IHByb2ZpbGUgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBQYXltZW50IFByb2ZpbGUgZGF0YSB0aGF0IGlzIGJlaW5nIHJlcXVlc3RlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwYXltZW50X3Byb2ZpbGVfdG9rZW4/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0luc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpbnN0aXR1dGlvbl9zdXBwb3J0ZWRfbmV0d29ya3M6IEluc3RpdHV0aW9uU3VwcG9ydGVkTmV0d29ya3M7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIENvbnRhaW5zIHRoZSBzdXBwb3J0ZWQgc2VydmljZSB0eXBlcyBpbiBSZlBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZlBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJmUCB7XG4gICAgLyoqXG4gICAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsaW5rZWQgSXRlbVxcJ3MgaW5zdGl0dXRpb24gc3VwcG9ydHMgUmZQIGRlYml0IHRyYW5zZmVyLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJmUFxuICAgICAqL1xuICAgIGRlYml0PzogYm9vbGVhbjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci4gU2hvdWxkIG9ubHkgYmUgcHJlc2VudCBpZiBgY2xpZW50X2lkYCBpcyBhIFtQbGF0Zm9ybSBjdXN0b21lcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hcHBsaWNhdGlvbi8jb3JpZ2luYXRvcnMtdnMtcGxhdGZvcm1zKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgbWF4X3NpbmdsZV90cmFuc2Zlcl9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgY3JlZGl0IHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtYXhfc2luZ2xlX3RyYW5zZmVyX2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIGRvbGxhciBhbW91bnQgb2YgYSBzaW5nbGUgZGViaXQgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9zaW5nbGVfdHJhbnNmZXJfZGViaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9kYWlseV9jcmVkaXRfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heCBsaW1pdCBvZiBzdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBkZWJpdCB0cmFuc2ZlcnMgaW4gbGFzdCAyNCBob3VycyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbWF4X2RhaWx5X2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IGFuZCBkZWJpdCB0cmFuc2ZlcnMgaW4gb25lIGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXggbGltaXQgb2Ygc3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2NyZWRpdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4IGxpbWl0IG9mIHN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBvbmUgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1heF9tb250aGx5X2RlYml0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgZG9sbGFyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQuIGBhdXRob3JpemF0aW9uX2lkYCBpcyBub3cgdXNlZCBhcyBpZGVtcG90ZW5jeSBpbnN0ZWFkLiAgQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgdHJhbnNmZXIuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyByZXF1ZXN0cyB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSB0cmFuc2ZlciBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gVGhpcyBwYXJhbWV0ZXIgYWxzbyBzZXJ2ZXMgdGhlIHB1cnBvc2Ugb2YgYWN0aW5nIGFzIGFuIGlkZW1wb3RlbmN5IGlkZW50aWZpZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYXV0aG9yaXphdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclR5cGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgdHlwZT86IFRyYW5zZmVyVHlwZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG5ldHdvcms/OiBUcmFuc2Zlck5ldHdvcms7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBtYXhpbXVtIGFtb3VudCB0byBhdXRob3JpemUuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIGV4YWN0IGFtb3VudCBvZiB0aGUgdHJhbnNmZXIsIHVwIHRvIGEgbWF4aW11bSBvZiB0aGUgYW1vdW50IGF1dGhvcml6ZWQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuayB3aGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCB0aGUgbWF4aW11bSBhbW91bnQgYXV0aG9yaXplZCBpbiB0aGUgYGF1dGhvcml6YXRpb25faWRgIHdpbGwgYmUgc2VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYW5zZmVyIGRlc2NyaXB0aW9uLiBNYXhpbXVtIG9mIDE1IGNoYXJhY3RlcnMuIElmIHJlcHJvY2Vzc2luZyBhIHJldHVybmVkIHRyYW5zZmVyLCBwbGVhc2Ugbm90ZSB0aGF0IHRoZSBgZGVzY3JpcHRpb25gIGZpZWxkIG11c3QgYmUgYFxcXCJSZXRyeSAxXFxcImAgb3IgYFxcXCJSZXRyeSAyXFxcImAgdG8gaW5kaWNhdGUgdGhhdCBpdFxcJ3MgYSByZXRyeSBvZiBhIHByZXZpb3VzbHkgcmV0dXJuZWQgdHJhbnNmZXIuIFlvdSBtYXkgcmV0cnkgYSB0cmFuc2ZlciB1cCB0byAyIHRpbWVzLCB3aXRoaW4gMTgwIGRheXMgb2YgY3JlYXRpbmcgdGhlIG9yaWdpbmFsIHRyYW5zZmVyLiBPbmx5IHRyYW5zZmVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2l0aCBjb2RlIGBSMDFgIG9yIGBSMDlgIG1heSBiZSByZXRyaWVkLiBGb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2Rlcywgc2VlIFtUcmFuc2ZlciBlcnJvcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICB1c2VyPzogVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZCB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50IGZvciB0aGlzIHRyYW5zZmVyLiBJZiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIG9yaWdpbmF0aW9uIGFjY291bnQsIHRoaXMgdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQuIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBzaG91bGQgYmUgbGVmdCBibGFuay5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBcXFwiVVNEXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBUaGlzIGZpZWxkIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgYHRyYW5zZmVyYCBpcyBjcmVhdGVkIGF0IHRoZSBgdmlydHVhbF90aW1lYCBvbiB0aGUgcHJvdmlkZWQgYHRlc3RfY2xvY2tgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRlc3RfY2xvY2tfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdG8gZGVkdWN0IGZyb20gYHRyYW5zZmVyLmFtb3VudGAgYW5kIGRpc3RyaWJ1dGUgdG8gdGhlIHBsYXRmb3Jt4oCZcyBMZWRnZXIgYmFsYW5jZSBhcyBhIGZhY2lsaXRhdG9yIGZlZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBUaGUgcmVtYWluZGVyIHdpbGwgZ28gdG8gdGhlIGVuZC1jdXN0b21lcuKAmXMgTGVkZ2VyIGJhbGFuY2UuIFRoaXMgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGB0cmFuc2Zlci5hbW91bnRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZhY2lsaXRhdG9yX2ZlZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyOiBUcmFuc2ZlcjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhpcyBmaWVsZCBpcyBub3cgZGVwcmVjYXRlZC4gWW91IG1heSBpZ25vcmUgaXQgZm9yIHRyYW5zZmVycyBjcmVhdGVkIG9uIGFuZCBhZnRlciAxMi8wMS8yMDIzLiAgU3BlY2lmaWVzIHRoZSBzb3VyY2Ugb2YgZnVuZHMgZm9yIHRoZSB0cmFuc2Zlci4gT25seSB2YWxpZCBmb3IgYGNyZWRpdGAgdHJhbnNmZXJzLCBhbmQgZGVmYXVsdHMgdG8gYHN3ZWVwYCBpZiBub3Qgc3BlY2lmaWVkLiBUaGlzIGZpZWxkIGlzIG5vdCBzcGVjaWZpZWQgZm9yIGBkZWJpdGAgdHJhbnNmZXJzLiAgYHN3ZWVwYCAtIFN3ZWVwIGZ1bmRzIGZyb20geW91ciBmdW5kaW5nIGFjY291bnQgYHByZWZ1bmRlZF9ydHBfY3JlZGl0c2AgLSBVc2UgeW91ciBwcmVmdW5kZWQgUlRQIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWQgYHByZWZ1bmRlZF9hY2hfY3JlZGl0c2AgLSBVc2UgeW91ciBwcmVmdW5kZWQgQUNIIGNyZWRpdCBiYWxhbmNlIHdpdGggUGxhaWRcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyQ3JlZGl0RnVuZHNTb3VyY2Uge1xuICAgIFN3ZWVwID0gJ3N3ZWVwJyxcbiAgICBQcmVmdW5kZWRSdHBDcmVkaXRzID0gJ3ByZWZ1bmRlZF9ydHBfY3JlZGl0cycsXG4gICAgUHJlZnVuZGVkQWNoQ3JlZGl0cyA9ICdwcmVmdW5kZWRfYWNoX2NyZWRpdHMnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhlIG9yaWdpbmF0b3JcXCdzIGV4cGVjdGVkIHVzYWdlIG9mIGNyZWRpdHMuIEZvciBhbGwgZG9sbGFyIGFtb3VudHMsIHVzZSBhIGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiLiBUaGlzIGZpZWxkIGlzIHJlcXVpcmVkIGlmIHRoZSBvcmlnaW5hdG9yIGlzIGV4cGVjdGVkIHRvIHByb2Nlc3MgY3JlZGl0IHRyYW5zZmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvbiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09yaWdpbmF0b3JFeHBlY3RlZFRyYW5zZmVyRnJlcXVlbmN5fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2ZyZXF1ZW5jeTogT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGhpZ2hlc3QgYW1vdW50IGZvciBhIHNpbmdsZSBjcmVkaXQgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJDcmVkaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9oaWdoZXN0X2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBleHBlY3RlZCBhdmVyYWdlIGFtb3VudCBwZXIgY3JlZGl0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfYXZlcmFnZV9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgbW9udGhseSBleHBlY3RlZCBBQ0ggY3JlZGl0IHByb2Nlc3NpbmcgYW1vdW50IGZvciB0aGUgbmV4dCA2LTEyIG1vbnRocy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckNyZWRpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX21vbnRobHlfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBleHBlY3RlZCB1c2UgY2FzZXMgZm9yIHRoZSBvcmlnaW5hdG9y4oCZcyBjcmVkaXQgdHJhbnNmZXJzLiBUaGlzIHNob3VsZCBiZSBhIGxpc3QgdGhhdCBjb250YWlucyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGNvZGVzOiAgYFxcXCJjY2RcXFwiYCAtIENvcnBvcmF0ZSBDcmVkaXQgb3IgRGViaXQgLSBmdW5kIHRyYW5zZmVyIGJldHdlZW4gdHdvIGNvcnBvcmF0ZSBiYW5rIGFjY291bnRzICBgXFxcInBwZFxcXCJgIC0gUHJlYXJyYW5nZWQgUGF5bWVudCBvciBEZXBvc2l0IC0gdGhlIHRyYW5zZmVyIGlzIHBhcnQgb2YgYSBwcmUtZXhpc3RpbmcgcmVsYXRpb25zaGlwIHdpdGggYSBjb25zdW1lciwgZS5nLiBiaWxsIHBheW1lbnQgIGBcXFwid2ViXFxcImAgLSBBIGNyZWRpdCBFbnRyeSBpbml0aWF0ZWQgYnkgb3Igb24gYmVoYWxmIG9mIGEgaG9sZGVyIG9mIGEgQ29uc3VtZXIgQWNjb3VudCB0aGF0IGlzIGludGVuZGVkIGZvciBhIENvbnN1bWVyIEFjY291bnQgb2YgYSBSZWNlaXZlclxuICAgICAqIEB0eXBlIHtBcnJheTxDcmVkaXRBQ0hDbGFzcz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgc2VjX2NvZGVzOiBBcnJheTxDcmVkaXRBQ0hDbGFzcz47XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgb3JpZ2luYXRvclxcJ3MgZXhwZWN0ZWQgdXNhZ2Ugb2YgZGViaXRzLiBGb3IgYWxsIGRvbGxhciBhbW91bnRzLCB1c2UgYSBkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIi4gVGhpcyBmaWVsZCBpcyByZXF1aXJlZCBpZiB0aGUgb3JpZ2luYXRvciBpcyBleHBlY3RlZCB0byBwcm9jZXNzIGRlYml0IHRyYW5zZmVycy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb24ge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdG9yRXhwZWN0ZWRUcmFuc2ZlckZyZXF1ZW5jeX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX2ZyZXF1ZW5jeTogT3JpZ2luYXRvckV4cGVjdGVkVHJhbnNmZXJGcmVxdWVuY3k7XG4gICAgLyoqXG4gICAgICogVGhlIG9yaWdpbmF0b3LigJlzIGV4cGVjdGVkIGhpZ2hlc3QgYW1vdW50IGZvciBhIHNpbmdsZSBkZWJpdCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRlYml0VXNhZ2VDb25maWd1cmF0aW9uXG4gICAgICovXG4gICAgZXhwZWN0ZWRfaGlnaGVzdF9hbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRvcuKAmXMgZXhwZWN0ZWQgYXZlcmFnZSBhbW91bnQgcGVyIGRlYml0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBleHBlY3RlZF9hdmVyYWdlX2Ftb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBvcmlnaW5hdG9y4oCZcyBtb250aGx5IGV4cGVjdGVkIEFDSCBkZWJpdCBwcm9jZXNzaW5nIGFtb3VudCBmb3IgdGhlIG5leHQgNi0xMiBtb250aHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvblxuICAgICAqL1xuICAgIGV4cGVjdGVkX21vbnRobHlfYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmaWVzIHRoZSBleHBlY3RlZCB1c2UgY2FzZXMgZm9yIHRoZSBvcmlnaW5hdG9y4oCZcyBkZWJpdCB0cmFuc2ZlcnMuIFRoaXMgc2hvdWxkIGJlIGEgbGlzdCB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcgY29kZXM6ICBgXFxcImNjZFxcXCJgIC0gQ29ycG9yYXRlIENyZWRpdCBvciBEZWJpdCAtIGZ1bmQgdHJhbnNmZXIgYmV0d2VlbiB0d28gY29ycG9yYXRlIGJhbmsgYWNjb3VudHMgIGBcXFwicHBkXFxcImAgLSBQcmVhcnJhbmdlZCBQYXltZW50IG9yIERlcG9zaXQgLSB0aGUgdHJhbnNmZXIgaXMgcGFydCBvZiBhIHByZS1leGlzdGluZyByZWxhdGlvbnNoaXAgd2l0aCBhIGNvbnN1bWVyLCBlZy4gYmlsbCBwYXltZW50ICBgXFxcInRlbFxcXCJgIC0gVGVsZXBob25lLUluaXRpYXRlZCBFbnRyeSAgYFxcXCJ3ZWJcXFwiYCAtIEludGVybmV0LUluaXRpYXRlZCBFbnRyeSAtIGRlYml0cyBmcm9tIGEgY29uc3VtZXLigJlzIGFjY291bnQgd2hlcmUgdGhlaXIgYXV0aG9yaXphdGlvbiBpcyBvYnRhaW5lZCBvdmVyIHRoZSBJbnRlcm5ldFxuICAgICAqIEB0eXBlIHtBcnJheTxBQ0hDbGFzcz59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb25cbiAgICAgKi9cbiAgICBzZWNfY29kZXM6IEFycmF5PEFDSENsYXNzPjtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRldmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGV2aWNlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgZGV2aWNlIGJlaW5nIHVzZWQgdG8gaW5pdGlhdGUgdGhlIGF1dGhvcml6YXRpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEZXZpY2VcbiAgICAgKi9cbiAgICBpcF9hZGRyZXNzOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgYWdlbnQgb2YgdGhlIGRldmljZSBiZWluZyB1c2VkIHRvIGluaXRpYXRlIHRoZSBhdXRob3JpemF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGV2aWNlXG4gICAgICovXG4gICAgdXNlcl9hZ2VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBUaGUgQ2xpZW50IElEIG9mIHRoZSBvcmlnaW5hdG9yIHdob3NlIGRvY3VtZW50IHRoYXQgeW91IHdhbnQgdG8gdXBsb2FkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGZpbGUgdG8gdXBsb2FkLiBUaGUgZmlsZSBzaXplIG11c3QgYmUgbGVzcyB0aGFuIDIwTUIuIFN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnM6IC5wZGYuXG4gICAgICogQHR5cGUge2FueX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3RcbiAgICAgKi9cbiAgICBmaWxlOiBhbnk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRG9jdW1lbnRQdXJwb3NlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdFxuICAgICAqL1xuICAgIHB1cnBvc2U6IFRyYW5zZmVyRG9jdW1lbnRQdXJwb3NlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBPcmlnaW5hdG9y4oCZcyBkaWxpZ2VuY2Ugc3RhdHVzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJEaWxpZ2VuY2VTdGF0dXMge1xuICAgIE5vdFN1Ym1pdHRlZCA9ICdub3Rfc3VibWl0dGVkJyxcbiAgICBTdWJtaXR0ZWQgPSAnc3VibWl0dGVkJyxcbiAgICBVbmRlclJldmlldyA9ICd1bmRlcl9yZXZpZXcnLFxuICAgIEFwcHJvdmVkID0gJ2FwcHJvdmVkJyxcbiAgICBEZW5pZWQgPSAnZGVuaWVkJyxcbiAgICBNb3JlSW5mb3JtYXRpb25SZXF1aXJlZCA9ICdtb3JlX2luZm9ybWF0aW9uX3JlcXVpcmVkJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIHRoZSBvcmlnaW5hdG9yIHdob3NlIGRpbGlnZW5jZSB0aGF0IHlvdSB3YW50IHRvIHN1Ym1pdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfZGlsaWdlbmNlOiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2U7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9kaWxpZ2VuY2Uvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFNwZWNpZmllcyB0aGUgcHVycG9zZSBvZiB0aGUgdXBsb2FkZWQgZmlsZS4gIGBcXFwiRFVFX0RJTElHRU5DRVxcXCJgIC0gVGhlIHRyYW5zZmVyIGR1ZSBkaWxpZ2VuY2UgZG9jdW1lbnQgb2YgdGhlIG9yaWdpbmF0b3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckRvY3VtZW50UHVycG9zZSB7XG4gICAgRHVlRGlsaWdlbmNlID0gJ0RVRV9ESUxJR0VOQ0UnXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBldmVudCBpbiB0aGUgVHJhbnNmZXJzIEFQSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnQge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBldmVudC4gSURzIGFyZSBzZXF1ZW50aWFsIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2Vycy5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZXRpbWUgd2hlbiB0aGlzIGV2ZW50IG9jY3VycmVkLiBUaGlzIHdpbGwgYmUgb2YgdGhlIGZvcm0gYDIwMDYtMDEtMDJUMTU6MDQ6MDVaYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRXZlbnRUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZXZlbnRfdHlwZTogVHJhbnNmZXJFdmVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY291bnQgSUQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFuc2Zlci4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBpZCBvZiB0aGUgYXNzb2NpYXRlZCBmdW5kaW5nIGFjY291bnQsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBJZiBwcmVzZW50LCB0aGlzIGluZGljYXRlcyB3aGljaCBvZiB5b3VyIGJ1c2luZXNzIGNoZWNraW5nIGFjY291bnRzIHdpbGwgYmUgY3JlZGl0ZWQgb3IgZGViaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuIFRoaXMgZmllbGQgaXMgYG51bGxgIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB0aGF0IHRoaXMgYmFsYW5jZSBiZWxvbmdzIHRvLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge09taXR0YWJsZVRyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHRyYW5zZmVyX3R5cGU/OiBPbWl0dGFibGVUcmFuc2ZlclR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgdHJhbnNmZXIgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS4gVGhpcyBmaWVsZCBpcyBvbWl0dGVkIGZvciBQbGFpZCBMZWRnZXIgU3dlZXAgZXZlbnRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9hbW91bnQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRmFpbHVyZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBzd2VlcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgc3dlZXBfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBzaWduZWQgYW1vdW50IG9mIGhvdyBtdWNoIHdhcyBgc3dlcHRgIG9yIGByZXR1cm5fc3dlcHRgIGZvciB0aGlzIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIi01LjUwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHN3ZWVwX2Ftb3VudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLiBBIG5vbi1udWxsIHZhbHVlIGluZGljYXRlcyB0aGUgZXZlbnQgaXMgZm9yIHRoZSBhc3NvY2lhdGVkIHJlZnVuZCBvZiB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFxuICAgICAqL1xuICAgIHJlZnVuZF9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIHRoYXQgaXMgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIHRyYW5zZmVyIHRoYXQgdGhpcyBldmVudCBhcHBsaWVzIHRvLiBPbmx5IHByZXNlbnQgaWYgdGhlIHRyYW5zZmVyIHdhcyBjcmVhdGVkIG9uIGJlaGFsZiBvZiBhbm90aGVyIGNsaWVudCBhcyBhIHRoaXJkLXBhcnR5IHNlbmRlciAoVFBTKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBhY2NvdW50IElEIHRvIGdldCBldmVudHMgZm9yIGFsbCB0cmFuc2FjdGlvbnMgdG8vZnJvbSBhbiBhY2NvdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckV2ZW50TGlzdFRyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgdHJhbnNmZXJfdHlwZT86IFRyYW5zZmVyRXZlbnRMaXN0VHJhbnNmZXJUeXBlIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgZXZlbnRzIGJ5IGV2ZW50IHR5cGUuXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnRUeXBlPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZXZlbnRfdHlwZXM/OiBBcnJheTxUcmFuc2ZlckV2ZW50VHlwZT47XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHN3ZWVwLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN3ZWVwX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0cmFuc2ZlciBldmVudHMgdG8gcmV0dXJuLiBJZiB0aGUgbnVtYmVyIG9mIGV2ZW50cyBtYXRjaGluZyB0aGUgYWJvdmUgcGFyYW1ldGVycyBpcyBncmVhdGVyIHRoYW4gYGNvdW50YCwgdGhlIG1vc3QgcmVjZW50IGV2ZW50cyB3aWxsIGJlIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb2Zmc2V0IGludG8gdGhlIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzLiBXaGVuIGBjb3VudGA9MjUgYW5kIGBvZmZzZXRgPTAsIHRoZSBmaXJzdCAyNSBldmVudHMgd2lsbCBiZSByZXR1cm5lZC4gV2hlbiBgY291bnRgPTI1IGFuZCBgb2Zmc2V0YD0yNSwgdGhlIG5leHQgMjUgZXZlbnRzIHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgb3JpZ2luYXRpb24gYWNjb3VudCBJRCB0byBnZXQgZXZlbnRzIGZvciB0cmFuc2ZlcnMgZnJvbSBhIHNwZWNpZmljIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXIgZXZlbnRzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXIgZXZlbnRzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIGBmdW5kaW5nX2FjY291bnRfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBtb3JlIGV2ZW50cyB0byBiZSBwdWxsZWQgZnJvbSB0aGUgZW5kcG9pbnQgdGhhdCBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGhhc19tb3JlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiB0cmFuc2Zlci4gVGhpcyB3aWxsIGJlIGVpdGhlciBgZGViaXRgIG9yIGBjcmVkaXRgLiAgQSBgZGViaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IGludG8geW91ciBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB5b3VyIG9yaWdpbmF0aW9uIGFjY291bnQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlckV2ZW50TGlzdFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGxhdGVzdCAobGFyZ2VzdCkgYGV2ZW50X2lkYCBmZXRjaGVkIHZpYSB0aGUgc3luYyBlbmRwb2ludCwgb3IgMCBpbml0aWFsbHkuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0XG4gICAgICovXG4gICAgYWZ0ZXJfaWQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXIgZXZlbnRzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9ldmVudC9zeW5jYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyRXZlbnQ+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJfZXZlbnRzOiBBcnJheTxUcmFuc2ZlckV2ZW50PjtcbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBtb3JlIGV2ZW50cyB0byBiZSBwdWxsZWQgZnJvbSB0aGUgZW5kcG9pbnQgdGhhdCBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gcmV0dXJuZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZVxuICAgICAqL1xuICAgIGhhc19tb3JlOiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdHlwZSBvZiBldmVudCB0aGF0IHRoaXMgdHJhbnNmZXIgcmVwcmVzZW50cy4gRXZlbnQgdHlwZXMgd2l0aCBwcmVmaXggYHN3ZWVwYCByZXByZXNlbnRzIGV2ZW50cyBmb3IgUGxhaWQgTGVkZ2VyIHN3ZWVwcy4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiAgYGNhbmNlbGxlZGA6IFRoZSB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQuICBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gIGBwb3N0ZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHNldHRsZWRgOiBUaGUgdHJhbnNmZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCBieSB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYGZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIHRyYW5zZmVyIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIChPbmx5IGFwcGxpY2FibGUgdG8gQUNIIGRlYml0cy4pICBgcmV0dXJuZWRgOiBBIHBvc3RlZCB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuICBgc3dlcHRgOiBUaGUgdHJhbnNmZXIgd2FzIHN3ZXB0IHRvIC8gZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIGBzd2VwdF9zZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIGN1c3RvbWVy4oCZcyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LiAgYHJldHVybl9zd2VwdGA6IER1ZSB0byB0aGUgdHJhbnNmZXIgYmVpbmcgcmV0dXJuZWQsIGZ1bmRzIHdlcmUgcHVsbGVkIGZyb20gb3IgcHVzaGVkIGJhY2sgdG8gdGhlIHN3ZWVwIGFjY291bnQuICBgc3dlZXAucGVuZGluZ2A6IEEgbmV3IGxlZGdlciBzd2VlcCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgc3dlZXAucG9zdGVkYDogVGhlIGxlZGdlciBzd2VlcCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuICBgc3dlZXAuc2V0dGxlZGA6IFRoZSB0cmFuc2FjdGlvbiBoYXMgc2V0dGxlZCBpbiB0aGUgZnVuZGluZyBhY2NvdW50LiBUaGlzIG1lYW5zIHRoYXQgZnVuZHMgd2l0aGRyYXduIGZyb20gUGxhaWQgTGVkZ2VyIGJhbGFuY2UgaGF2ZSByZWFjaGVkIHRoZSBmdW5kaW5nIGFjY291bnQsIG9yIGZ1bmRzIHRvIGJlIGRlcG9zaXRlZCBpbnRvIHRoZSBQbGFpZCBMZWRnZXIgQmFsYW5jZSBoYXZlIGJlZW4gcHVsbGVkLCBhbmQgdGhlIGhvbGQgcGVyaW9kIGhhcyBiZWd1bi4gIGBzd2VlcC5yZXR1cm5lZGA6IEEgcG9zdGVkIGxlZGdlciBzd2VlcCB3YXMgcmV0dXJuZWQuICBgc3dlZXAuZmFpbGVkYDogVGhlIGxlZGdlciBzd2VlcCBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgc3dlZXAuZnVuZHNfYXZhaWxhYmxlYDogRnVuZHMgZnJvbSB0aGUgbGVkZ2VyIHN3ZWVwIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIGRlYml0cy4gIGByZWZ1bmQucGVuZGluZ2A6IEEgbmV3IHJlZnVuZCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuICBgcmVmdW5kLmNhbmNlbGxlZGA6IFRoZSByZWZ1bmQgd2FzIGNhbmNlbGxlZC4gIGByZWZ1bmQuZmFpbGVkYDogVGhlIHJlZnVuZCBmYWlsZWQsIG5vIGZ1bmRzIHdlcmUgbW92ZWQuICBgcmVmdW5kLnBvc3RlZGA6IFRoZSByZWZ1bmQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLiAgYHJlZnVuZC5zZXR0bGVkYDogVGhlIHJlZnVuZCB0cmFuc2FjdGlvbiBoYXMgc2V0dGxlZCBpbiB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuICBgcmVmdW5kLnJldHVybmVkYDogQSBwb3N0ZWQgcmVmdW5kIHdhcyByZXR1cm5lZC4gIGByZWZ1bmQuc3dlcHRgOiBUaGUgcmVmdW5kIHdhcyBzd2VwdCBmcm9tIHRoZSBzd2VlcCBhY2NvdW50LiAgYHJlZnVuZC5yZXR1cm5fc3dlcHRgOiBEdWUgdG8gdGhlIHJlZnVuZCBiZWluZyByZXR1cm5lZCwgZnVuZHMgd2VyZSBwdXNoZWQgYmFjayB0byB0aGUgc3dlZXAgYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyRXZlbnRUeXBlIHtcbiAgICBQZW5kaW5nID0gJ3BlbmRpbmcnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFBvc3RlZCA9ICdwb3N0ZWQnLFxuICAgIFNldHRsZWQgPSAnc2V0dGxlZCcsXG4gICAgRnVuZHNBdmFpbGFibGUgPSAnZnVuZHNfYXZhaWxhYmxlJyxcbiAgICBSZXR1cm5lZCA9ICdyZXR1cm5lZCcsXG4gICAgU3dlcHQgPSAnc3dlcHQnLFxuICAgIFN3ZXB0U2V0dGxlZCA9ICdzd2VwdF9zZXR0bGVkJyxcbiAgICBSZXR1cm5Td2VwdCA9ICdyZXR1cm5fc3dlcHQnLFxuICAgIFN3ZWVwUGVuZGluZyA9ICdzd2VlcC5wZW5kaW5nJyxcbiAgICBTd2VlcFBvc3RlZCA9ICdzd2VlcC5wb3N0ZWQnLFxuICAgIFN3ZWVwU2V0dGxlZCA9ICdzd2VlcC5zZXR0bGVkJyxcbiAgICBTd2VlcFJldHVybmVkID0gJ3N3ZWVwLnJldHVybmVkJyxcbiAgICBTd2VlcEZhaWxlZCA9ICdzd2VlcC5mYWlsZWQnLFxuICAgIFN3ZWVwRnVuZHNBdmFpbGFibGUgPSAnc3dlZXAuZnVuZHNfYXZhaWxhYmxlJyxcbiAgICBSZWZ1bmRQZW5kaW5nID0gJ3JlZnVuZC5wZW5kaW5nJyxcbiAgICBSZWZ1bmRDYW5jZWxsZWQgPSAncmVmdW5kLmNhbmNlbGxlZCcsXG4gICAgUmVmdW5kRmFpbGVkID0gJ3JlZnVuZC5mYWlsZWQnLFxuICAgIFJlZnVuZFBvc3RlZCA9ICdyZWZ1bmQucG9zdGVkJyxcbiAgICBSZWZ1bmRTZXR0bGVkID0gJ3JlZnVuZC5zZXR0bGVkJyxcbiAgICBSZWZ1bmRSZXR1cm5lZCA9ICdyZWZ1bmQucmV0dXJuZWQnLFxuICAgIFJlZnVuZFN3ZXB0ID0gJ3JlZnVuZC5zd2VwdCcsXG4gICAgUmVmdW5kUmV0dXJuU3dlcHQgPSAncmVmdW5kLnJldHVybl9zd2VwdCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIG5ldyB0cmFuc2ZlciBldmVudHMgYXJlIGF2YWlsYWJsZS4gUmVjZWl2aW5nIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgeW91IHNob3VsZCBmZXRjaCB0aGUgbmV3IGV2ZW50cyBmcm9tIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AuIElmIG11bHRpcGxlIHRyYW5zZmVyIGV2ZW50cyBvY2N1ciB3aXRoaW4gYSBzaW5nbGUgbWludXRlLCBvbmx5IG9uZSB3ZWJob29rIHdpbGwgYmUgZmlyZWQsIHNvIGEgc2luZ2xlIHdlYmhvb2sgaW5zdGFuY2UgbWF5IGNvcnJlc3BvbmQgdG8gbXVsdGlwbGUgdHJhbnNmZXIgZXZlbnRzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBUUkFOU0ZFUmBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2ViaG9va0Vudmlyb25tZW50VmFsdWVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV2ZW50c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBEZWZpbmVzIGFuIGV4cGVjdGVkIHN3ZWVwIGRhdGUgYW5kIGFtb3VudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJFeHBlY3RlZFN3ZWVwU2V0dGxlbWVudFNjaGVkdWxlSXRlbVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBzZXR0bGVtZW50IGRhdGUgb2YgYSBzd2VlcCBmb3IgdGhpcyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckV4cGVjdGVkU3dlZXBTZXR0bGVtZW50U2NoZWR1bGVJdGVtXG4gICAgICovXG4gICAgc3dlZXBfc2V0dGxlbWVudF9kYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY3VtdWxhdGVkIGFtb3VudCB0aGF0IGhhcyBiZWVuIHN3ZXB0IGJ5IGBzd2VlcF9zZXR0bGVtZW50X2RhdGVgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRXhwZWN0ZWRTd2VlcFNldHRsZW1lbnRTY2hlZHVsZUl0ZW1cbiAgICAgKi9cbiAgICBzd2VwdF9zZXR0bGVkX2Ftb3VudDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIGV2ZW50IHR5cGUgZm9yIGEgdHJhbnNmZXIgaXMgYFxcXCJmYWlsZWRcXFwiYCBvciBgXFxcInJldHVybmVkXFxcImAuIE51bGwgdmFsdWUgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZhaWx1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckZhaWx1cmUge1xuICAgIC8qKlxuICAgICAqIFRoZSBmYWlsdXJlIGNvZGUsIGUuZy4gYFIwMWAuICBBIGZhaWx1cmUgY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgYHJldHVybmVkYC4gU2VlIFtBQ0ggcmV0dXJuIGNvZGVzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykgZm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMgYW5kIFtSVFAgZXJyb3IgY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNydHAtZXJyb3ItY29kZXMpIGZvciBSVFAgZXJyb3IgY29kZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZmFpbHVyZV9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgQUNIIHJldHVybiBjb2RlLCBlLmcuIGBSMDFgLiAgQSByZXR1cm4gY29kZSB3aWxsIGJlIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSB0cmFuc2ZlciBzdGF0dXMgaXMgYHJldHVybmVkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbVHJhbnNmZXIgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBhY2hfcmV0dXJuX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlYXNvbiBmb3IgdGhlIGZhaWx1cmUgb3IgcmV2ZXJzYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJGYWlsdXJlXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBmdW5kaW5nIGFjY291bnQsIGxpbmtlZCB3aXRoIFBsYWlkIExpbmsgb3IgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckZ1bmRpbmdBY2NvdW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJGdW5kaW5nQWNjb3VudCB7XG4gICAgLyoqXG4gICAgICogVGhlIGFjY2VzcyB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0gZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyRnVuZGluZ0FjY291bnRcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBjbGllbnQgSUQgb2YgdGhlIHRyYW5zZmVyIG9yaWdpbmF0b3IuIFNob3VsZCBvbmx5IGJlIHByZXNlbnQgaWYgYGNsaWVudF9pZGAgaXMgYSB0aGlyZC1wYXJ0eSBzZW5kZXIgKFRQUykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJHZXRSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2ZlcjogVHJhbnNmZXI7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqICBBIGRlY2lzaW9uIHJlZ2FyZGluZyB0aGUgcHJvcG9zZWQgdHJhbnNmZXIuICBgQVBQUk9WRURgIOKAkyBUaGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIHJlY2VpdmVkIHRoZSBlbmQgdXNlclxcJ3MgY29uc2VudCBhbmQgaGFzIGJlZW4gYXBwcm92ZWQgZm9yIHByb2Nlc3NpbmcgYnkgUGxhaWQuIFRoZSBgZGVjaXNpb25fcmF0aW9uYWxlYCBmaWVsZCBpcyBzZXQgaWYgUGxhaWQgd2FzIHVuYWJsZSB0byBmZXRjaCB0aGUgYWNjb3VudCBpbmZvcm1hdGlvbi4gWW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgZnVydGhlciByZXZpZXcgaXMgcmVjb21tZW5kZWQgKGkuZS4sIHVzZSBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIHJlLWF1dGhlbnRpY2F0ZSB5b3VyIHVzZXIgd2hlbiBgZGVjaXNpb25fcmF0aW9uYWxlLmNvZGVgIGlzIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCkuIFJlZmVyIHRvIHRoZSBgY29kZWAgZmllbGQgaW4gdGhlIGBkZWNpc2lvbl9yYXRpb25hbGVgIG9iamVjdCBmb3IgZGV0YWlscy4gIGBERUNMSU5FRGAg4oCTIFBsYWlkIHJldmlld2VkIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBhbmQgZGVjbGluZWQgcHJvY2Vzc2luZy4gUmVmZXIgdG8gdGhlIGBjb2RlYCBmaWVsZCBpbiB0aGUgYGRlY2lzaW9uX3JhdGlvbmFsZWAgb2JqZWN0IGZvciBkZXRhaWxzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRBdXRob3JpemF0aW9uRGVjaXNpb24ge1xuICAgIEFwcHJvdmVkID0gJ0FQUFJPVkVEJyxcbiAgICBEZWNsaW5lZCA9ICdERUNMSU5FRCdcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgaW50ZW50IHdpdGhpbiBUcmFuc2ZlciBVSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHJhbnNmZXIgaW50ZW50IG9iamVjdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHRoZSB0cmFuc2ZlciB3YXMgY3JlYXRlZC4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIHN0YXR1czogVHJhbnNmZXJJbnRlbnRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLiBSZXR1cm5lZCBvbmx5IGlmIGBhY2NvdW50X2lkYCB3YXMgc2V0IG9uIGludGVudCBjcmVhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBpbnRlbnQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlXG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDggY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVcbiAgICAgKi9cbiAgICByZXF1aXJlX2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgZGlyZWN0aW9uIG9mIHRoZSBmbG93IG9mIHRyYW5zZmVyIGZ1bmRzLiAgYFBBWU1FTlRgOiBUcmFuc2ZlcnMgZnVuZHMgZnJvbSBhbiBlbmQgdXNlclxcJ3MgYWNjb3VudCB0byB5b3VyIGJ1c2luZXNzIGFjY291bnQuICBgRElTQlVSU0VNRU5UYDogVHJhbnNmZXJzIGZ1bmRzIGZyb20geW91ciBidXNpbmVzcyBhY2NvdW50IHRvIGFuIGVuZCB1c2VyXFwncyBhY2NvdW50LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlIHtcbiAgICBQYXltZW50ID0gJ1BBWU1FTlQnLFxuICAgIERpc2J1cnNlbWVudCA9ICdESVNCVVJTRU1FTlQnXG59XG5cbi8qKlxuICogVGhlIG5ldHdvcmsgb3IgcmFpbHMgdXNlZCBmb3IgdGhlIHRyYW5zZmVyLiBEZWZhdWx0cyB0byBgc2FtZS1kYXktYWNoYC4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIHVzaW5nIGBhY2hgLCB0aGUgbmV4dC1kYXkgY3V0b2ZmIGlzIDg6MzAgUE0gRWFzdGVybiBUaW1lLiAgRm9yIHRyYW5zZmVycyBzdWJtaXR0ZWQgdXNpbmcgYHNhbWUtZGF5LWFjaGAsIHRoZSBzYW1lLWRheSBjdXRvZmYgaXMgMzozMCBQTSBFYXN0ZXJuIFRpbWUuIElmIHRoZSB0cmFuc2ZlciBpcyBzdWJtaXR0ZWQgYWZ0ZXIgdGhpcyBjdXRvZmYgYnV0IGJlZm9yZSB0aGUgbmV4dC1kYXkgY3V0b2ZmLCBpdCB3aWxsIGJlIHNlbnQgb3ZlciBuZXh0LWRheSByYWlscyBhbmQgd2lsbCBub3QgaW5jdXIgc2FtZS1kYXkgY2hhcmdlcy4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIHVzaW5nIGBydHBgLCBpbiB0aGUgY2FzZSB0aGF0IHRoZSBhY2NvdW50IGJlaW5nIGNyZWRpdGVkIGRvZXMgbm90IHN1cHBvcnQgUlRQLCB0aGUgdHJhbnNmZXIgd2lsbCBiZSBzZW50IG92ZXIgQUNIIGFzIGxvbmcgYXMgYW4gYGFjaF9jbGFzc2AgaXMgcHJvdmlkZWQgaW4gdGhlIHJlcXVlc3QuIElmIFJUUCBpc25cXCd0IHN1cHBvcnRlZCBieSB0aGUgYWNjb3VudCBhbmQgbm8gYGFjaF9jbGFzc2AgaXMgcHJvdmlkZWQsIHRoZSB0cmFuc2ZlciB3aWxsIGZhaWwgdG8gYmUgc3VibWl0dGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCcsXG4gICAgUnRwID0gJ3J0cCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9pbnRlbnQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBjb3JyZXNwb25kaW5nIHRvIHRoZSBlbmQtdXNlciBhY2NvdW50IHRoYXQgd2lsbCBiZSBkZWJpdGVkIG9yIGNyZWRpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgdGhlIGFjY291bnQgdXNlZCB0byBmdW5kIHRoZSB0cmFuc2Zlci4gU2hvdWxkIGJlIHNwZWNpZmllZCBpZiB1c2luZyBsZWdhY3kgZnVuZGluZyBtZXRob2RzIG9ubHkuIElmIHVzaW5nIFBsYWlkIExlZGdlciwgbGVhdmUgdGhpcyBmaWVsZCBibGFuay4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgYW5kIHlvdSBhcmUgdXNpbmcgbGVnYWN5IGZ1bmRpbmcgbWV0aG9kcywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlIGRlZmF1bHQgYGZ1bmRpbmdfYWNjb3VudF9pZGAgc3BlY2lmaWVkIGR1cmluZyBvbmJvYXJkaW5nLiBPdGhlcndpc2UsIFBsYWlkIExlZGdlciB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVNb2RlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yaz86IFRyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDE1IGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG9yaWdpbmF0aW9uIGFjY291bnQgZm9yIHRoZSBpbnRlbnQuIElmIG5vdCBwcm92aWRlZCwgdGhlIGRlZmF1bHQgYWNjb3VudCB3aWxsIGJlIHVzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXF1ZXN0fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBtZXRhZGF0YT86IHsgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9IHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudCwgZS5nLiBcXFwiVVNEXFxcIlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlzb19jdXJyZW5jeV9jb2RlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVxdWlyZV9ndWFyYW50ZWU/OiBib29sZWFuIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRDcmVhdGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pbnRlbnQ6IFRyYW5zZmVySW50ZW50Q3JlYXRlO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgdHJhbnNmZXIgaW50ZW50IHdpdGhpbiBUcmFuc2ZlciBVSS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldCB7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHRyYW5zZmVyIGludGVudCBvYmplY3QuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRldGltZSB0aGUgdHJhbnNmZXIgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFRyYW5zZmVySW50ZW50U3RhdHVzO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHRyYW5zZmVyIGNyZWF0ZWQgdGhyb3VnaCB0aGUgVUkuIFJldHVybmVkIG9ubHkgaWYgdGhlIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZC4gTnVsbCB2YWx1ZSBvdGhlcndpc2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX2RlY2lzaW9uOiBUcmFuc2ZlckludGVudEF1dGhvcml6YXRpb25EZWNpc2lvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGF1dGhvcml6YXRpb25fZGVjaXNpb25fcmF0aW9uYWxlOiBUcmFuc2ZlckF1dGhvcml6YXRpb25EZWNpc2lvblJhdGlvbmFsZSB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGBhY2NvdW50X2lkYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuIFJldHVybmVkIG9ubHkgaWYgYGFjY291bnRfaWRgIHdhcyBzZXQgb24gaW50ZW50IGNyZWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgb3JpZ2luYXRpb24gYWNjb3VudCB1c2VkIGZvciB0aGUgdHJhbnNmZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG9yaWdpbmF0aW9uX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgaWQgb2YgdGhlIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UsIGF2YWlsYWJsZSBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkLiBUaGlzIGRldGVybWluZXMgd2hpY2ggb2YgeW91ciBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50cyB3aWxsIGJlIGNyZWRpdGVkIG9yIGRlYml0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAsIHNwZWNpZnkgdGhlIG1heGltdW0gYW1vdW50IHRvIGF1dGhvcml6ZS4gV2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgc3BlY2lmeSB0aGUgZXhhY3QgYW1vdW50IG9mIHRoZSB0cmFuc2ZlciwgdXAgdG8gYSBtYXhpbXVtIG9mIHRoZSBhbW91bnQgYXV0aG9yaXplZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rIHdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAsIHRoZSBtYXhpbXVtIGFtb3VudCBhdXRob3JpemVkIGluIHRoZSBgYXV0aG9yaXphdGlvbl9pZGAgd2lsbCBiZSBzZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTW9kZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBtb2RlOiBUcmFuc2ZlckludGVudENyZWF0ZU1vZGU7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVySW50ZW50Q3JlYXRlTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBuZXR3b3JrPzogVHJhbnNmZXJJbnRlbnRDcmVhdGVOZXR3b3JrO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBQ0hDbGFzc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBhY2hfY2xhc3M/OiBBQ0hDbGFzcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VySW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICB1c2VyOiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlO1xuICAgIC8qKlxuICAgICAqIEEgZGVzY3JpcHRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDggY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIE1ldGFkYXRhIG9iamVjdCBpcyBhIG1hcHBpbmcgb2YgY2xpZW50LXByb3ZpZGVkIHN0cmluZyBmaWVsZHMgdG8gYW55IHN0cmluZyB2YWx1ZS4gVGhlIGZvbGxvd2luZyBsaW1pdGF0aW9ucyBhcHBseTogVGhlIEpTT04gdmFsdWVzIG11c3QgYmUgU3RyaW5ncyAobm8gbmVzdGVkIEpTT04gb2JqZWN0cyBhbGxvd2VkKSBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgbWF5IGJlIHVzZWQgTWF4aW11bSBvZiA1MCBrZXkvdmFsdWUgcGFpcnMgTWF4aW11bSBrZXkgbGVuZ3RoIG9mIDQwIGNoYXJhY3RlcnMgTWF4aW11bSB2YWx1ZSBsZW5ndGggb2YgNTAwIGNoYXJhY3RlcnMgXG4gICAgICogQHR5cGUge3sgW2tleTogc3RyaW5nXTogc3RyaW5nOyB9fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFxuICAgICAqL1xuICAgIG1ldGFkYXRhPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmc7IH0gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgdHJhbnNmZXIgYW1vdW50LCBlLmcuIFxcXCJVU0RcXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHRydWVgLCB0aGUgdHJhbnNmZXIgcmVxdWlyZXMgYSBgR1VBUkFOVEVFRGAgZGVjaXNpb24gYnkgUGxhaWQgdG8gcHJvY2VlZCAoR3VhcmFudGVlIGN1c3RvbWVycyBvbmx5KS5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICByZXF1aXJlX2d1YXJhbnRlZT86IGJvb2xlYW4gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckF1dGhvcml6YXRpb25HdWFyYW50ZWVEZWNpc2lvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRcbiAgICAgKi9cbiAgICBndWFyYW50ZWVfZGVjaXNpb246IFRyYW5zZmVyQXV0aG9yaXphdGlvbkd1YXJhbnRlZURlY2lzaW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0XG4gICAgICovXG4gICAgZ3VhcmFudGVlX2RlY2lzaW9uX3JhdGlvbmFsZTogVHJhbnNmZXJBdXRob3JpemF0aW9uR3VhcmFudGVlRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgcmVhc29uIGZvciBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQuIFJldHVybmVkIG9ubHkgaWYgdGhlIHRyYW5zZmVyIGludGVudCBzdGF0dXMgaXMgYGZhaWxlZGAuIE51bGwgb3RoZXJ3aXNlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckludGVudEdldEZhaWx1cmVSZWFzb24ge1xuICAgIC8qKlxuICAgICAqIEEgYnJvYWQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGVycm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0RmFpbHVyZVJlYXNvblxuICAgICAqL1xuICAgIGVycm9yX3R5cGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBjb2RlIHJlcHJlc2VudGluZyB0aGUgcmVhc29uIGZvciBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQgKGkuZS4sIGFuIEFQSSBlcnJvciBvciB0aGUgYXV0aG9yaXphdGlvbiBiZWluZyBkZWNsaW5lZCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gICAgICovXG4gICAgZXJyb3JfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGZhaWxlZCB0cmFuc2ZlciBpbnRlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRGYWlsdXJlUmVhc29uXG4gICAgICovXG4gICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvaW50ZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckludGVudEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlkXFwncyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2ludGVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvaW50ZW50L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckludGVudEdldH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHRyYW5zZmVyX2ludGVudDogVHJhbnNmZXJJbnRlbnRHZXQ7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVySW50ZW50R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zZmVyIGludGVudC4gIGBQRU5ESU5HYDogVGhlIHRyYW5zZmVyIGludGVudCBpcyBwZW5kaW5nLiBgU1VDQ0VFREVEYDogVGhlIHRyYW5zZmVyIGludGVudCB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQuIGBGQUlMRURgOiBUaGUgdHJhbnNmZXIgaW50ZW50IHdhcyB1bmFibGUgdG8gYmUgY3JlYXRlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVySW50ZW50U3RhdHVzIHtcbiAgICBQZW5kaW5nID0gJ1BFTkRJTkcnLFxuICAgIFN1Y2NlZWRlZCA9ICdTVUNDRUVERUQnLFxuICAgIEZhaWxlZCA9ICdGQUlMRUQnXG59XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbGFuY2Ugb2YgdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGlzIGJhbGFuY2UgYXZhaWxhYmxlIGZvciB1c2UgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYW1vdW50IG9mIHBlbmRpbmcgZnVuZHMgdGhhdCBhcmUgaW4gcHJvY2Vzc2luZyAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyQmFsYW5jZVxuICAgICAqL1xuICAgIHBlbmRpbmc6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBjdXN0b21lciB0aGF0IG93bnMgdGhlIExlZGdlciBiYWxhbmNlLiBUaGlzIGlzIHNvIFBsYWlkIGtub3dzIHdoaWNoIG9mIHlvdXIgY3VzdG9tZXJzIHRvIHBheW91dCBvciBjb2xsZWN0IGZ1bmRzLiBPbmx5IGFwcGxpY2FibGUgZm9yIFtQbGF0Zm9ybSBjdXN0b21lcnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYXBwbGljYXRpb24vI29yaWdpbmF0b3JzLXZzLXBsYXRmb3JtcykuIERvIG5vdCBpbmNsdWRlIGlmIHlvdeKAmXJlIHBheWluZyBvdXQgdG8geW91cnNlbGYuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGZ1bmRpbmcgYWNjb3VudCB0byB1c2UuIEN1c3RvbWVycyBjYW4gZmluZCBhIGxpc3Qgb2YgYGZ1bmRpbmdfYWNjb3VudF9pZGBzIGluIHRoZSBBY2NvdW50cyBwYWdlIG9mIHRoZSBQbGFpZCBEYXNoYm9hcmQsIHVuZGVyIHRoZSBcXFwiQWNjb3VudCBJRFxcXCIgY29sdW1uLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmssIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgTGVkZ2VyIHdpbGwgYmUgdXNlZC4gSWYgYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYCBpcyBzcGVjaWZpZWQsIHRoZSBgZnVuZGluZ19hY2NvdW50X2lkYCBtdXN0IGJlbG9uZyB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byBkZXBvc2l0IHRvLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHBvc2l0aXZlIGFtb3VudCBvZiBob3cgbXVjaCB3aWxsIGJlIGRlcG9zaXRlZCBpbnRvIGxlZGdlciAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCI1LjUwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGxlZGdlciBkZXBvc2l0LiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgdGhlIHJlcXVlc3Qgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZmFpbHMgZHVlIHRvIGEgbmV0d29yayBjb25uZWN0aW9uIGVycm9yLCB5b3UgY2FuIHJldHJ5IHRoZSByZXF1ZXN0IHdpdGggdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5IHRvIGd1YXJhbnRlZSB0aGF0IG9ubHkgYSBzaW5nbGUgZGVwb3NpdCBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBQ0hOZXR3b3JrfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0XG4gICAgICovXG4gICAgbmV0d29yazogVHJhbnNmZXJBQ0hOZXR3b3JrO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExlZGdlciB0byBwdWxsIG1vbmV5IGZyb20uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGZyb21fbGVkZ2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIExlZGdlciB0byBjcmVkaXQgbW9uZXkgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRvX2xlZGdlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgdG8gbW92ZSAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLiBBbW91bnQgbXVzdCBiZSBwb3NpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgbGVkZ2VyIGRpc3RyaWJ1dGUuIE1heGltdW0gb2YgNTAgY2hhcmFjdGVycy4gIFRoZSBBUEkgc3VwcG9ydHMgaWRlbXBvdGVuY3kgZm9yIHNhZmVseSByZXRyeWluZyB0aGUgcmVxdWVzdCB3aXRob3V0IGFjY2lkZW50YWxseSBwZXJmb3JtaW5nIHRoZSBzYW1lIG9wZXJhdGlvbiB0d2ljZS4gRm9yIGV4YW1wbGUsIGlmIGEgcmVxdWVzdCB0byBjcmVhdGUgYSBsZWRnZXIgZGlzdHJpYnV0ZSBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBkaXN0cmlidXRlIGlzIGNyZWF0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIG9wdGlvbmFsIGRlc2NyaXB0aW9uIGZvciB0aGUgbGVkZ2VyIGRpc3RyaWJ1dGUgb3BlcmF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9kaXN0cmlidXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xlZGdlci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTcGVjaWZ5IHdoaWNoIGxlZGdlciBiYWxhbmNlIHRvIGdldC4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgbGVkZ2VyX2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgeW91ciBQbGFpZCBEYXNoYm9hcmQuIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhpcyB3aWxsIGRlZmF1bHQgdG8gaWQgb2YgdGhlIGRlZmF1bHQgbGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgbGVkZ2VyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBMZWRnZXIgdGhhdCB3YXMgcmV0dXJuZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGxlZGdlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckxlZGdlckJhbGFuY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBUcmFuc2ZlckxlZGdlckJhbGFuY2U7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIExlZGdlclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogV2hldGhlciB0aGlzIExlZGdlciBpcyB0aGUgY2xpZW50XFwncyBkZWZhdWx0IGxlZGdlci5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX2RlZmF1bHQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhc3luY2hyb25vdXMgZXZlbnQgdG8gYmUgc2ltdWxhdGVkLiBNYXkgYmU6IGBwb3N0ZWRgLCBgc2V0dGxlZGAsIGBmYWlsZWRgLCBvciBgcmV0dXJuZWRgLiAgQW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgZXZlbnQgdHlwZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgY3VycmVudCBsZWRnZXIgc3dlZXAgc3RhdHVzLiBDb21wYXRpYmxlIHN0YXR1cyAtLT4gZXZlbnQgdHlwZSB0cmFuc2l0aW9ucyBpbmNsdWRlOiAgYHN3ZWVwLnBlbmRpbmdgIC0tPiBgc3dlZXAucG9zdGVkYCAgYHN3ZWVwLnBlbmRpbmdgIC0tPiBgc3dlZXAuZmFpbGVkYCAgYHN3ZWVwLnBvc3RlZGAgLS0+IGBzd2VlcC5zZXR0bGVkYCAgYHN3ZWVwLnBvc3RlZGAgLS0+IGBzd2VlcC5yZXR1cm5lZGAgIGBzd2VlcC5zZXR0bGVkYCAtLT4gYHN3ZWVwLnJldHVybmVkYCBcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyTGVkZ2VyU3dlZXBTaW11bGF0ZUV2ZW50VHlwZSB7XG4gICAgUG9zdGVkID0gJ3N3ZWVwLnBvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzd2VlcC5zZXR0bGVkJyxcbiAgICBSZXR1cm5lZCA9ICdzd2VlcC5yZXR1cm5lZCcsXG4gICAgRmFpbGVkID0gJ3N3ZWVwLmZhaWxlZCdcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIENsaWVudCBJRCBvZiB0aGUgY3VzdG9tZXIgdGhhdCBvd25zIHRoZSBMZWRnZXIgYmFsYW5jZS4gVGhpcyBpcyBzbyBQbGFpZCBrbm93cyB3aGljaCBvZiB5b3VyIGN1c3RvbWVycyB0byBwYXlvdXQgb3IgY29sbGVjdCBmdW5kcy4gT25seSBhcHBsaWNhYmxlIGZvciBbUGxhdGZvcm0gY3VzdG9tZXJzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLiBEbyBub3QgaW5jbHVkZSBpZiB5b3XigJlyZSBwYXlpbmcgb3V0IHRvIHlvdXJzZWxmLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNwZWNpZnkgd2hpY2ggZnVuZGluZyBhY2NvdW50IHRvIHVzZS4gQ3VzdG9tZXJzIGNhbiBmaW5kIGEgbGlzdCBvZiBgZnVuZGluZ19hY2NvdW50X2lkYHMgaW4gdGhlIEFjY291bnRzIHBhZ2Ugb2YgdGhlIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBMZWRnZXIgd2lsbCBiZSB1c2VkLiBJZiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgIGlzIHNwZWNpZmllZCwgdGhlIGBmdW5kaW5nX2FjY291bnRfaWRgIG11c3QgYmVsb25nIHRvIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB3aGljaCBsZWRnZXIgYmFsYW5jZSB0byB3aXRoZHJhdyBmcm9tLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBsZWRnZXJfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZC4gSWYgdGhpcyBmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGlzIHdpbGwgZGVmYXVsdCB0byBpZCBvZiB0aGUgZGVmYXVsdCBsZWRnZXIgYmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBwb3NpdGl2ZSBhbW91bnQgb2YgaG93IG11Y2ggd2lsbCBiZSB3aXRoZHJhd24gZnJvbSB0aGUgbGVkZ2VyIGJhbGFuY2UgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiNS41MFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBkZXBvc2l0IHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBiYW5rICh1cCB0byAxMCBjaGFyYWN0ZXJzKS4gTm90ZSB0aGF0IGJhbmtzIHV0aWxpemUgdGhpcyBmaWVsZCBkaWZmZXJlbnRseSwgYW5kIG1heSBvciBtYXkgbm90IHNob3cgaXQgb24gdGhlIGJhbmsgc3RhdGVtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIGxlZGdlciB3aXRoZHJhdy4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHRoZSByZXF1ZXN0IHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIGxlZGdlciB3aXRoZHJhdyBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSB3aXRoZHJhdyBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0XG4gICAgICovXG4gICAgaWRlbXBvdGVuY3lfa2V5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTmV0d29ya31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3RcbiAgICAgKi9cbiAgICBuZXR3b3JrOiBUcmFuc2Zlck5ldHdvcms7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyU3dlZXB9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXNwb25zZVxuICAgICAqL1xuICAgIHN3ZWVwOiBUcmFuc2ZlclN3ZWVwO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiB0cmFuc2ZlcnMgdG8gbGlzdC4gVGhpcyBzaG91bGQgYmUgaW4gUkZDIDMzMzkgZm9ybWF0IChpLmUuIGAyMDE5LTEyLTA2VDIyOjM1OjQ5WmApXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgdHJhbnNmZXJzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugb3JpZ2luYXRlZCB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBvcmlnaW5hdGlvbl9hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgdHJhbnNmZXJzIHRvIG9ubHkgdGhvc2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG9yaWdpbmF0b3IgY2xpZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxUcmFuc2Zlcj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNmZXJzOiBBcnJheTxUcmFuc2Zlcj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZXRhaWxzIHJlZ2FyZGluZyBhdXRob3JpemF0aW9uIHVzYWdlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBkYWlseSBjcmVkaXQgdXRpbGl6YXRpb24gZm9ybWF0dGVkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAgICAgKi9cbiAgICBkYWlseV9jcmVkaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhaWx5IGRlYml0IHV0aWxpemF0aW9uIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gICAgICovXG4gICAgZGFpbHlfZGViaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgY3JlZGl0IHV0aWxpemF0aW9uIGZvcm1hdHRlZCBhcyBhIGRlY2ltYWwuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlXG4gICAgICovXG4gICAgbW9udGhseV9jcmVkaXRfdXRpbGl6YXRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1vbnRobHkgZGViaXQgdXRpbGl6YXRpb24gZm9ybWF0dGVkIGFzIGEgZGVjaW1hbC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRBdXRob3JpemF0aW9uVXNhZ2VcbiAgICAgKi9cbiAgICBtb250aGx5X2RlYml0X3V0aWxpemF0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgY2xpZW50IElEIG9mIHRoZSB0cmFuc2ZlciBvcmlnaW5hdG9yLiBTaG91bGQgb25seSBiZSBwcmVzZW50IGlmIGBjbGllbnRfaWRgIGlzIGEgW1BsYXRmb3JtIGN1c3RvbWVyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FwcGxpY2F0aW9uLyNvcmlnaW5hdG9ycy12cy1wbGF0Zm9ybXMpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9tZXRyaWNzL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBkb2xsYXIgYW1vdW50IG9mIGRlYml0IHRyYW5zZmVycyBpbiBsYXN0IDI0IGhvdXJzIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBkYWlseV9kZWJpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgdHJhbnNmZXJzIGluIGxhc3QgMjQgaG91cnMgKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGRhaWx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTdW0gb2YgZG9sbGFyIGFtb3VudCBvZiBjcmVkaXQgYW5kIGRlYml0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIG1vbnRobHlfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgZGViaXQgdHJhbnNmZXJzIGluIGN1cnJlbnQgY2FsZW5kYXIgbW9udGggKGRlY2ltYWwgc3RyaW5nIHdpdGggdHdvIGRpZ2l0cyBvZiBwcmVjaXNpb24gZS5nLiBcXFwiMTAuMDBcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG1vbnRobHlfZGViaXRfdHJhbnNmZXJfdm9sdW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGRvbGxhciBhbW91bnQgb2YgY3JlZGl0IHRyYW5zZmVycyBpbiBjdXJyZW50IGNhbGVuZGFyIG1vbnRoIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBtb250aGx5X2NyZWRpdF90cmFuc2Zlcl92b2x1bWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIGRvbGxhciBhbW91bnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXR1cm5fcmF0ZXM/OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyTWV0cmljc0dldEF1dGhvcml6YXRpb25Vc2FnZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdXRob3JpemF0aW9uX3VzYWdlPzogVHJhbnNmZXJNZXRyaWNzR2V0QXV0aG9yaXphdGlvblVzYWdlIHwgbnVsbDtcbn1cbi8qKlxuICogRGV0YWlscyByZWdhcmRpbmcgcmV0dXJuIHJhdGVzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWx9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzXG4gICAgICovXG4gICAgbGFzdF82MGQ/OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc092ZXJJbnRlcnZhbCB8IG51bGw7XG59XG4vKipcbiAqIERldGFpbHMgcmVnYXJkaW5nIHJldHVybiByYXRlcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1ldHJpY3NHZXRSZXR1cm5SYXRlc092ZXJJbnRlcnZhbCB7XG4gICAgLyoqXG4gICAgICogVGhlIG92ZXJhbGwgcmV0dXJuIHJhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAgICAgKi9cbiAgICBvdmVyYWxsX3JldHVybl9yYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1bmF1dGhvcml6ZWQgcmV0dXJuIHJhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNZXRyaWNzR2V0UmV0dXJuUmF0ZXNPdmVySW50ZXJ2YWxcbiAgICAgKi9cbiAgICB1bmF1dGhvcml6ZWRfcmV0dXJuX3JhdGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFkbWluaXN0cmF0aXZlIHJldHVybiByYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWV0cmljc0dldFJldHVyblJhdGVzT3ZlckludGVydmFsXG4gICAgICovXG4gICAgYWRtaW5pc3RyYXRpdmVfcmV0dXJuX3JhdGU/OiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGFjY291bnQgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjb3VudF9udW1iZXI6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3Mgcm91dGluZyBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICByb3V0aW5nX251bWJlcjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyB3aXJlIHRyYW5zZmVyIHJvdXRpbmcgbnVtYmVyLiBUaGlzIGlzIHRoZSBBQkEgbnVtYmVyOyBmb3Igc29tZSBpbnN0aXR1dGlvbnMsIHRoaXMgbWF5IGRpZmZlciBmcm9tIHRoZSBBQ0ggbnVtYmVyIHVzZWQgaW4gYHJvdXRpbmdfbnVtYmVyYC4gVGhpcyBmaWVsZCBtdXN0IGJlIHNldCBmb3IgdGhlIGNyZWF0ZWQgaXRlbSB0byBiZSBlbGlnaWJsZSBmb3Igd2lyZSB0cmFuc2ZlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3RcbiAgICAgKi9cbiAgICB3aXJlX3JvdXRpbmdfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSBiYW5rIGFjY291bnQgKGBjaGVja2luZ2Agb3IgYHNhdmluZ3NgKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdFxuICAgICAqL1xuICAgIGFjY291bnRfdHlwZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgSXRlbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhY2Nlc3NfdG9rZW46IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgUGxhaWQgYGFjY291bnRfaWRgIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBJdGVtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZVxuICAgICAqL1xuICAgIGFjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgbmV0d29yayBvciByYWlscyB1c2VkIGZvciB0aGUgdHJhbnNmZXIuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgYWNoYCwgdGhlIG5leHQtZGF5IGN1dG9mZiBpcyA4OjMwIFBNIEVhc3Rlcm4gVGltZS4gIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGBzYW1lLWRheS1hY2hgLCB0aGUgc2FtZS1kYXkgY3V0b2ZmIGlzIDM6MzAgUE0gRWFzdGVybiBUaW1lLiBJZiB0aGUgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFmdGVyIHRoaXMgY3V0b2ZmIGJ1dCBiZWZvcmUgdGhlIG5leHQtZGF5IGN1dG9mZiwgaXQgd2lsbCBiZSBzZW50IG92ZXIgbmV4dC1kYXkgcmFpbHMgYW5kIHdpbGwgbm90IGluY3VyIHNhbWUtZGF5IGNoYXJnZXM7IHRoaXMgd2lsbCBhcHBseSB0byBib3RoIGxlZ3Mgb2YgdGhlIHRyYW5zZmVyIGlmIGFwcGxpY2FibGUuICBGb3IgdHJhbnNmZXJzIHN1Ym1pdHRlZCBhcyBgcnRwYCwgIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSByb3V0ZSBiZXR3ZWVuIFJlYWwgVGltZSBQYXltZW50IHJhaWwgYnkgVENIIG9yIEZlZE5vdyByYWlscyBhcyBuZWNlc3NhcnkuIElmIGEgdHJhbnNmZXIgaXMgc3VibWl0dGVkIGFzIGBydHBgIGFuZCB0aGUgY291bnRlcnBhcnR5IGFjY291bnQgaXMgbm90IGVsaWdpYmxlIGZvciBSVFAsIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCByZXF1ZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGBJTlZBTElEX0ZJRUxEYCBlcnJvciBjb2RlLiBUbyBwcmUtY2hlY2sgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBjb3VudGVycGFydHkgYWNjb3VudCBjYW4gc3VwcG9ydCBSVFAsIGNhbGwgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBiZWZvcmUgY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYC4gIFdpcmUgdHJhbnNmZXJzIGFyZSBjdXJyZW50bHkgaW4gZWFybHkgYXZhaWxhYmlsaXR5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byBgd2lyZWAgYXMgYSBwYXltZW50IG5ldHdvcmssIGNvbnRhY3QgeW91ciBBY2NvdW50IE1hbmFnZXIuIEZvciB0cmFuc2ZlcnMgc3VibWl0dGVkIGFzIGB3aXJlYCwgdGhlIGB0eXBlYCBtdXN0IGJlIGBjcmVkaXRgOyB3aXJlIGRlYml0cyBhcmUgbm90IHN1cHBvcnRlZC4gVGhlIGN1dG9mZiB0byBzdWJtaXQgYSB3aXJlIHBheW1lbnQgaXMgNDozMCBQTSBFYXN0ZXJuIFRpbWUgb24gYSBidXNpbmVzcyBkYXk7IHdpcmVzIHN1Ym1pdHRlZCBhZnRlciB0aGF0IHRpbWUgd2lsbCBiZSBwcm9jZXNzZWQgb24gdGhlIG5leHQgYnVzaW5lc3MgZGF5LlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCcsXG4gICAgUnRwID0gJ3J0cCcsXG4gICAgV2lyZSA9ICd3aXJlJ1xufVxuXG4vKipcbiAqIFRoZSBvcmlnaW5hdG9yXFwncyBhZGRyZXNzLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzcyB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgY2l0eSBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgc3RyZWV0IGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0d28tbGV0dGVyIGNvZGUgZm9yIHRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZSAoZS5nLiwgXFxcIjk0MTAzXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQWRkcmVzc1xuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSVNPLTMxNjYtMSBhbHBoYS0yIGNvdW50cnkgY29kZSBzdGFuZGFyZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzXG4gICAgICovXG4gICAgY291bnRyeV9jb2RlOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjb21wYW55IG5hbWUgb2YgdGhlIGVuZCBjdXN0b21lciBiZWluZyBjcmVhdGVkLiBUaGlzIHdpbGwgYmUgZGlzcGxheWVkIGluIHB1YmxpYy1mYWNpbmcgc3VyZmFjZXMsIGUuZy4gUGxhaWQgRGFzaGJvYXJkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3IuIFRoaXMgaWRlbnRpZmllciB3aWxsIGJlIHVzZWQgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgYW5kIHNob3VsZCBiZSBzdG9yZWQgYXNzb2NpYXRlZCB3aXRoIGVuZCB1c2VyIGluZm9ybWF0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY29tcGFueSBuYW1lIG9mIHRoZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjb21wYW55X25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gZm9yIHRoZSBvcmlnaW5hdG9yLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBidXNpbmVzcyBuYW1lIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGRiYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0YXggSUQgb2YgdGhlIG9yaWdpbmF0b3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgdGF4X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9ufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBjcmVkaXRfdXNhZ2VfY29uZmlndXJhdGlvbj86IFRyYW5zZmVyQ3JlZGl0VXNhZ2VDb25maWd1cmF0aW9uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEZWJpdFVzYWdlQ29uZmlndXJhdGlvbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRGlsaWdlbmNlXG4gICAgICovXG4gICAgZGViaXRfdXNhZ2VfY29uZmlndXJhdGlvbj86IFRyYW5zZmVyRGViaXRVc2FnZUNvbmZpZ3VyYXRpb24gfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBhZGRyZXNzOiBUcmFuc2Zlck9yaWdpbmF0b3JBZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSB3ZWJzaXRlIG9mIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIHdlYnNpdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgTkFJQ1MgY29kZSBvZiB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JEaWxpZ2VuY2VcbiAgICAgKi9cbiAgICBuYWljc19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyRnVuZGluZ0FjY291bnR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckRpbGlnZW5jZVxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudDogVHJhbnNmZXJGdW5kaW5nQWNjb3VudDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGNsaWVudCBJRCBvZiB0aGUgdHJhbnNmZXIgb3JpZ2luYXRvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlckZ1bmRpbmdBY2NvdW50fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnQ6IFRyYW5zZmVyRnVuZGluZ0FjY291bnQ7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQ2xpZW50IElEIG9mIHRoZSBlbmQgY3VzdG9tZXIgKGkuZS4gdGhlIG9yaWdpbmF0b3IpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtEZXRhaWxlZE9yaWdpbmF0b3J9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRvcjogRGV0YWlsZWRPcmlnaW5hdG9yO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygb3JpZ2luYXRvcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2Ygb3JpZ2luYXRvcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXIgfCBudWxsO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxPcmlnaW5hdG9yPn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgb3JpZ2luYXRvcnM6IEFycmF5PE9yaWdpbmF0b3I+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEZpcmVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhbiBvbmJvYXJkaW5nIG9yaWdpbmF0b3IgaGFzIGJlZW4gdXBkYXRlZC4gQ2FsbCBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCB0byBjaGVjayB0aGUgbGF0ZXN0IHN0YXR1c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2sge1xuICAgIC8qKlxuICAgICAqIGBcXFwiVFJBTlNGRVJcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PbmJvYXJkaW5nVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBcXFwiUExBVEZPUk1fT05CT0FSRElOR19VUERBVEVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PbmJvYXJkaW5nVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT25ib2FyZGluZ1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PbmJvYXJkaW5nVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGNsaWVudCBJRCBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGF9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHRvc19hY2NlcHRhbmNlX21ldGFkYXRhOiBUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhO1xuICAgIC8qKlxuICAgICAqIElTTzg2MDEgdGltZXN0YW1wIGluZGljYXRpbmcgdGhlIG1vc3QgcmVjZW50IHRpbWUgdGhlIHBsYXRmb3JtIGNvbGxlY3RlZCBvbmJvYXJkaW5nIGRhdGEgZnJvbSB0aGUgb3JpZ2luYXRvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfcmV2aWV3ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgd2ViaG9vayBVUkwgdG8gd2hpY2ggYSBgUExBVEZPUk1fT05CT0FSRElOR19VUERBVEVgIHdlYmhvb2sgc2hvdWxkIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2ViaG9vaz86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEhvbWUgYWRkcmVzcyBvZiBhIHBlcnNvblxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBjaXR5IG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVmFsaWQsIGNhcGl0YWxpemVkLCB0d28tbGV0dGVyIElTTyBjb2RlIHJlcHJlc2VudGluZyB0aGUgY291bnRyeSBvZiB0aGlzIG9iamVjdC4gTXVzdCBiZSBpbiBJU08gMzE2Ni0xIGFscGhhLTIgZm9ybS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcG9zdGFsIGNvZGUgb2YgdGhlIGFkZHJlc3MuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3NcbiAgICAgKi9cbiAgICBwb3N0YWxfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTyAzMTY2LTIgc3ViZGl2aXNpb24gY29kZS4gUmVsYXRlZCB0ZXJtcyB3b3VsZCBiZSBcXFwic3RhdGVcXFwiLCBcXFwicHJvdmluY2VcXFwiLCBcXFwicHJlZmVjdHVyZVxcXCIsIFxcXCJ6b25lXFxcIiwgXFxcInN1YmRpdmlzaW9uXFxcIiwgZXRjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gICAgICovXG4gICAgcmVnaW9uOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgc3RyZWV0IHBvcnRpb24gb2YgYW4gYWRkcmVzcy4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4dHJhIHN0cmVldCBpbmZvcm1hdGlvbiwgbGlrZSBhbiBhcGFydG1lbnQgb3Igc3VpdGUgbnVtYmVyLiBJZiBwcm92aWRlZCwgYSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiA1MCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Mj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfY2xpZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25OYW1lfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5hbWU/OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZTtcbiAgICAvKipcbiAgICAgKiBBIHZhbGlkIGVtYWlsIGFkZHJlc3MuIE11c3Qgbm90IGhhdmUgbGVhZGluZyBvciB0cmFpbGluZyBzcGFjZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdmFsaWQgcGhvbmUgbnVtYmVyIGluIEUuMTY0IGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWRkcmVzcz86IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25BZGRyZXNzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uSUROdW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgaWRfbnVtYmVyPzogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbklETnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIGJpcnRoIG9mIHRoZSBwZXJzb24uIEZvcm1hdHRlZCBhcyBZWVlZLU1NLURELlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhpcyBwZXJzb24gYW5kIHRoZSBvcmlnaW5hdG9yIHRoZXkgYXJlIHJlbGF0ZWQgdG8uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICByZWxhdGlvbnNoaXBfdG9fb3JpZ2luYXRvcj86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3BsYXRmb3JtL3BlcnNvbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJRCB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gc3VibWl0dGluZyBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwZXJzb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcGVyc29uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIElEIG51bWJlciBvZiB0aGUgcGVyc29uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25JRE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25JRE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgdGhlIHBlcnNvblxcJ3MgSUQgTnVtYmVyLiBBbHBoYS1udW1lcmljLCB3aXRoIGFsbCBmb3JtYXR0aW5nIGNoYXJhY3RlcnMgc3RyaXBwZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbklETnVtYmVyXG4gICAgICovXG4gICAgdmFsdWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SUROdW1iZXJUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uSUROdW1iZXJcbiAgICAgKi9cbiAgICB0eXBlOiBJRE51bWJlclR5cGU7XG59XG4vKipcbiAqIFRoZSBwZXJzb25cXCdzIGxlZ2FsIG5hbWVcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbk5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZSB7XG4gICAgLyoqXG4gICAgICogQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uTmFtZVxuICAgICAqL1xuICAgIGdpdmVuX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDEwMCBjaGFyYWN0ZXJzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1QZXJzb25OYW1lXG4gICAgICovXG4gICAgZmFtaWx5X25hbWU6IHN0cmluZztcbn1cbi8qKlxuICogQSBwaWVjZSBvZiBpbmZvcm1hdGlvbiB0aGF0IGlzIG91dHN0YW5kaW5nIGZvciB0aGUgc2NhbGVkIHBsYXRmb3JtIG9uYm9hcmRpbmcgcHJvY2Vzcy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50IHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiByZXF1aXJlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRcbiAgICAgKi9cbiAgICByZXF1aXJlbWVudF90eXBlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFVVSUQgb2YgdGhlIHBlcnNvbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVpcmVtZW50LiBPbmx5IHByZXNlbnQgZm9yIGluZGl2aWR1YWwtc2NvcGVkIHJlcXVpcmVtZW50cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRcbiAgICAgKi9cbiAgICBwZXJzb25faWQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBIHNpbmdsZSByZXF1aXJlbWVudCBzdWJtaXNzaW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiByZXF1aXJlbWVudCBiZWluZyBzdWJtaXR0ZWRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXNzaW9uXG4gICAgICovXG4gICAgcmVxdWlyZW1lbnRfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcmVxdWlyZW1lbnQsIHdoaWNoIGNhbiBiZSBhIHN0cmluZyBvciBhbiBvYmplY3QgZGVwZW5kaW5nIG9uIHRoZSBgcmVxdWlyZW1lbnRfdHlwZWAuIElmIGl0IGlzIGFuIG9iamVjdCwgdGhlIG9iamVjdCBzaG91bGQgYmUgSlNPTiBtYXJzaGFsZWQgaW50byBhIHN0cmluZy4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9uIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pc3Npb25cbiAgICAgKi9cbiAgICB2YWx1ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgcGVyc29uX2lkYCBvZiB0aGUgcGVyc29uIHRoZSByZXF1aXJlbWVudCBzdWJtaXNzaW9uIGlzIHJlbGF0ZWQgdG8uIEEgYHBlcnNvbl9pZGAgaXMgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYC4gVGhpcyBmaWVsZCBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGZvciByZXF1aXJlbWVudHMgdGhhdCBhcmUgbm90IHJlbGF0ZWQgdG8gYSBwZXJzb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvblxuICAgICAqL1xuICAgIHBlcnNvbl9pZD86IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjbGllbnQgSUQgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2YgcmVxdWlyZW1lbnQgc3VibWlzc2lvbnMgdGhhdCBhbGwgcmVsYXRlIHRvIHRoZSBvcmlnaW5hdG9yLiBNdXN0IGNvbnRhaW4gYmV0d2VlbiAxIGFuZCA1MCByZXF1aXJlbWVudCBzdWJtaXNzaW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvbj59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3RcbiAgICAgKi9cbiAgICByZXF1aXJlbWVudF9zdWJtaXNzaW9uczogQXJyYXk8VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWlzc2lvbj47XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9wbGF0Zm9ybS9yZXF1aXJlbWVudC9zdWJtaXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogTWV0YWRhdGEgcmVsYXRlZCB0byB0aGUgYWNjZXB0YW5jZSBvZiBUZXJtcyBvZiBTZXJ2aWNlXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUGxhdGZvcm1UT1NBY2NlcHRhbmNlTWV0YWRhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclBsYXRmb3JtVE9TQWNjZXB0YW5jZU1ldGFkYXRhIHtcbiAgICAvKipcbiAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgVE9TIGFncmVlbWVudCB3YXMgYWNjZXB0ZWRcbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YVxuICAgICAqL1xuICAgIGFncmVlbWVudF9hY2NlcHRlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBUaGUgSVAgYWRkcmVzcyBvZiB0aGUgb3JpZ2luYXRvciB3aGVuIHRoZXkgYWNjZXB0ZWQgdGhlIFRPUy4gRm9ybWF0dGVkIGFzIGFuIElQdjQgb3IgSVB2NiBJUCBhZGRyZXNzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YVxuICAgICAqL1xuICAgIG9yaWdpbmF0b3JfaXBfYWRkcmVzczogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElTTzg2MDEgdGltZXN0YW1wIGluZGljYXRpbmcgd2hlbiB0aGUgb3JpZ2luYXRvciBhY2NlcHRlZCB0aGUgVE9TXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJQbGF0Zm9ybVRPU0FjY2VwdGFuY2VNZXRhZGF0YVxuICAgICAqL1xuICAgIGFncmVlbWVudF9hY2NlcHRlZF9hdDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBDbGllbnQgSUQgb2YgdGhlIGVuZCBjdXN0b21lci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgb3JpZ2luYXRvcl9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBVUkwgdGhlIGVuZCBjdXN0b21lciB3aWxsIGJlIHJlZGlyZWN0ZWQgdG8gYWZ0ZXIgY29tcGxldGluZyBxdWVzdGlvbnMgaW4gUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgZmxvdy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVkaXJlY3RfdXJpOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVVJMIHRoYXQgeW91IHdpbGwgcmVkaXJlY3QgdGhlIGVuZCBjdXN0b21lciB0by5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG9uYm9hcmRpbmdfdXJsOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9jYW5jZWxgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjZXNzX3Rva2VuYCBmb3IgdGhlIGFjY291bnQgdGhhdCB3aWxsIGJlIGRlYml0ZWQgb3IgY3JlZGl0ZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSByYW5kb20ga2V5IHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQsIHBlciB1bmlxdWUgcmVjdXJyaW5nIHRyYW5zZmVyLiBNYXhpbXVtIG9mIDUwIGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIEZvciBleGFtcGxlLCBpZiBhIHJlcXVlc3QgdG8gY3JlYXRlIGEgcmVjdXJyaW5nIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHJlY3VycmluZyB0cmFuc2ZlciBpcyBjcmVhdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBgYWNjb3VudF9pZGAgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kLXVzZXIgYWNjb3VudCB0aGF0IHdpbGwgYmUgZGViaXRlZCBvciBjcmVkaXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogU3BlY2lmeSB0aGUgYWNjb3VudCB1c2VkIHRvIGZ1bmQgdGhlIHRyYW5zZmVyLiBDdXN0b21lcnMgY2FuIGZpbmQgYSBsaXN0IG9mIGBmdW5kaW5nX2FjY291bnRfaWRgcyBpbiB0aGUgQWNjb3VudHMgcGFnZSBvZiB5b3VyIFBsYWlkIERhc2hib2FyZCwgdW5kZXIgdGhlIFxcXCJBY2NvdW50IElEXFxcIiBjb2x1bW4uIElmIHRoaXMgZmllbGQgaXMgbGVmdCBibGFuaywgaXQgd2lsbCBkZWZhdWx0IHRvIHRoZSBkZWZhdWx0IGBmdW5kaW5nX2FjY291bnRfaWRgIHNwZWNpZmllZCBkdXJpbmcgb25ib2FyZGluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKiBAZGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGZ1bmRpbmdfYWNjb3VudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdHlwZTogVHJhbnNmZXJUeXBlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclJlY3VycmluZ05ldHdvcmt9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIG5ldHdvcms6IFRyYW5zZmVyUmVjdXJyaW5nTmV0d29yaztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QUNIQ2xhc3N9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFjaF9jbGFzcz86IEFDSENsYXNzO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zZmVyIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuIFdoZW4gY2FsbGluZyBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCwgc3BlY2lmeSB0aGUgbWF4aW11bSBhbW91bnQgdG8gYXV0aG9yaXplLiBXaGVuIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLCBzcGVjaWZ5IHRoZSBleGFjdCBhbW91bnQgb2YgdGhlIHRyYW5zZmVyLCB1cCB0byBhIG1heGltdW0gb2YgdGhlIGFtb3VudCBhdXRob3JpemVkLiBJZiB0aGlzIGZpZWxkIGlzIGxlZnQgYmxhbmsgd2hlbiBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYCwgdGhlIG1heGltdW0gYW1vdW50IGF1dGhvcml6ZWQgaW4gdGhlIGBhdXRob3JpemF0aW9uX2lkYCB3aWxsIGJlIHNlbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGVuZCB1c2VyIGlzIGluaXRpYXRpbmcgdGhlIHNwZWNpZmljIHRyYW5zZmVyIHRoZW1zZWx2ZXMgdmlhIGFuIGludGVyYWN0aXZlIFVJLCB0aGlzIHNob3VsZCBiZSBgdHJ1ZWA7IGZvciBhdXRvbWF0aWMgcmVjdXJyaW5nIHBheW1lbnRzIHdoZXJlIHRoZSBlbmQgdXNlciBpcyBub3QgYWN0dWFsbHkgaW5pdGlhdGluZyBlYWNoIGluZGl2aWR1YWwgdHJhbnNmZXIsIGl0IHNob3VsZCBiZSBgZmFsc2VgLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3ByZXNlbnQ/OiBib29sZWFuIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHRyYW5zZmVyIGFtb3VudC4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICogQGRlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLiBUaGlzIGZpZWxkIG1heSBvbmx5IGJlIHVzZWQgd2hlbiB1c2luZyBgc2FuZGJveGAgZW52aXJvbm1lbnQuIElmIHByb3ZpZGVkLCB0aGUgY3JlYXRlZCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gTmV3IG9yaWdpbmF0aW9ucyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBgdGVzdF9jbG9ja2AgYWR2YW5jZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNjaGVkdWxlOiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXI6IFRyYW5zZmVyVXNlckluUmVxdWVzdDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJEZXZpY2V9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRldmljZT86IFRyYW5zZmVyRGV2aWNlO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWN1cnJpbmdUcmFuc2Zlck51bGxhYmxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVjdXJyaW5nX3RyYW5zZmVyPzogUmVjdXJyaW5nVHJhbnNmZXJOdWxsYWJsZTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb259XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkZWNpc2lvbjogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb247XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyQXV0aG9yaXphdGlvbkRlY2lzaW9uUmF0aW9uYWxlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgZGVjaXNpb25fcmF0aW9uYWxlPzogVHJhbnNmZXJBdXRob3JpemF0aW9uRGVjaXNpb25SYXRpb25hbGUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXJfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVjdXJyaW5nVHJhbnNmZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWN1cnJpbmdfdHJhbnNmZXI6IFJlY3VycmluZ1RyYW5zZmVyO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBsaXN0LiBUaGlzIHNob3VsZCBiZSBpbiBSRkMgMzMzOSBmb3JtYXQgKGkuZS4gYDIwMTktMTItMDZUMjI6MzU6NDlaYClcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiByZWN1cnJpbmcgdHJhbnNmZXJzIHRvIGxpc3QuIFRoaXMgc2hvdWxkIGJlIGluIFJGQyAzMzM5IGZvcm1hdCAoaS5lLiBgMjAxOS0xMi0wNlQyMjozNTo0OVpgKVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBlbmRfdGltZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlY3VycmluZyB0cmFuc2ZlcnMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBGaWx0ZXIgcmVjdXJyaW5nIHRyYW5zZmVycyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZnVuZGluZ19hY2NvdW50X2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8UmVjdXJyaW5nVHJhbnNmZXI+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlY3VycmluZ190cmFuc2ZlcnM6IEFycmF5PFJlY3VycmluZ1RyYW5zZmVyPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIE5ldHdvcmtzIGVsaWdpYmxlIGZvciByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJSZWN1cnJpbmdOZXR3b3JrIHtcbiAgICBBY2ggPSAnYWNoJyxcbiAgICBTYW1lRGF5QWNoID0gJ3NhbWUtZGF5LWFjaCcsXG4gICAgUnRwID0gJ3J0cCdcbn1cblxuLyoqXG4gKiBUaGUgc2NoZWR1bGUgdGhhdCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIHdpbGwgYmUgZXhlY3V0ZWQgb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIGludGVydmFsX3VuaXQ6IFRyYW5zZmVyU2NoZWR1bGVJbnRlcnZhbFVuaXQ7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZWN1cnJpbmcgYGludGVydmFsX3VuaXRzYCBiZXR3ZWVuIG9yaWdpbmF0aW9ucy4gVGhlIHJlY3VycmluZyBpbnRlcnZhbCAoYmVmb3JlIGhvbGlkYXkgYWRqdXN0bWVudCkgaXMgY2FsY3VsYXRlZCBieSBtdWx0aXBseWluZyBgaW50ZXJ2YWxfdW5pdGAgYW5kIGBpbnRlcnZhbF9jb3VudGAuIEZvciBleGFtcGxlLCB0byBzY2hlZHVsZSBhIHJlY3VycmluZyB0cmFuc2ZlciB3aGljaCBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgdHdvIHdlZWtzLCBzZXQgYGludGVydmFsX3VuaXRgID0gYHdlZWtgIGFuZCBgaW50ZXJ2YWxfY291bnRgID0gMi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgaW50ZXJ2YWxfY291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgZGF5IG9mIHRoZSBpbnRlcnZhbCBvbiB3aGljaCB0byBzY2hlZHVsZSB0aGUgdHJhbnNmZXIuICBJZiB0aGUgYGludGVydmFsX3VuaXRgIGlzIGB3ZWVrYCwgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIHNob3VsZCBiZSBhbiBpbnRlZ2VyIGZyb20gMSAoTW9uZGF5KSB0byA1IChGcmlkYXkpLiAgSWYgdGhlIGBpbnRlcnZhbF91bml0YCBpcyBgbW9udGhgLCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgc2hvdWxkIGJlIGFuIGludGVnZXIgaW5kaWNhdGluZyB3aGljaCBkYXkgb2YgdGhlIG1vbnRoIHRvIG1ha2UgdGhlIHRyYW5zZmVyIG9uLiBJbnRlZ2VycyBmcm9tIDEgdG8gMjggY2FuIGJlIHVzZWQgdG8gbWFrZSBhIHRyYW5zZmVyIG9uIHRoYXQgZGF5IG9mIHRoZSBtb250aC4gTmVnYXRpdmUgaW50ZWdlcnMgZnJvbSAtMSB0byAtNSBjYW4gYmUgdXNlZCB0byBtYWtlIGEgdHJhbnNmZXIgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgbW9udGguIFRvIG1ha2UgYSB0cmFuc2ZlciBvbiB0aGUgbGFzdCBkYXkgb2YgdGhlIG1vbnRoLCB1c2UgLTE7IHRvIG1ha2UgdGhlIHRyYW5zZmVyIG9uIHRoZSBzZWNvbmQtdG8tbGFzdCBkYXksIHVzZSAtMiwgYW5kIHNvIG9uLiAgVGhlIHRyYW5zZmVyIHdpbGwgYmUgb3JpZ2luYXRlZCBvbiB0aGUgbmV4dCBhdmFpbGFibGUgYmFua2luZyBkYXkgaWYgdGhlIGRlc2lnbmF0ZWQgZGF5IGlzIGEgbm9uIGJhbmtpbmcgZGF5LlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVjdXJyaW5nU2NoZWR1bGVcbiAgICAgKi9cbiAgICBpbnRlcnZhbF9leGVjdXRpb25fZGF5OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogQSBkYXRlIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCAoWVlZWS1NTS1ERCkuIFRoZSByZWN1cnJpbmcgdHJhbnNmZXIgd2lsbCBiZWdpbiBvbiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBgc3RhcnRfZGF0ZWAuICBGb3IgYHJ0cGAgcmVjdXJyaW5nIHRyYW5zZmVycywgYHN0YXJ0X2RhdGVgIG11c3QgYmUgaW4gdGhlIGZ1dHVyZS4gT3RoZXJ3aXNlLCBpZiB0aGUgZmlyc3QgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIG9uIG9yIGFmdGVyIHRoZSBzdGFydCBkYXRlIGlzIGFsc28gdGhlIHNhbWUgZGF5IHRoYXQgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCB3YXMgY2FsbGVkLCB0aGUgYmFuayAqbWF5KiBtYWtlIHRoZSBmaXJzdCBwYXltZW50IG9uIHRoYXQgZGF5LCBidXQgaXQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZG8gc28uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWN1cnJpbmdTY2hlZHVsZVxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREKS4gVGhlIHJlY3VycmluZyB0cmFuc2ZlciB3aWxsIGVuZCBvbiB0aGUgbGFzdCBgaW50ZXJ2YWxfZXhlY3V0aW9uX2RheWAgb24gb3IgYmVmb3JlIHRoZSBgZW5kX2RhdGVgLiBJZiB0aGUgYGludGVydmFsX2V4ZWN1dGlvbl9kYXlgIGJldHdlZW4gdGhlIHN0YXJ0IGRhdGUgYW5kIHRoZSBlbmQgZGF0ZSAoaW5jbHVzaXZlKSBpcyBhbHNvIHRoZSBzYW1lIGRheSB0aGF0IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgd2FzIGNhbGxlZCwgdGhlIGJhbmsgKm1heSogbWFrZSBhIHBheW1lbnQgb24gdGhhdCBkYXksIGJ1dCBpdCBpcyBub3QgZ3VhcmFudGVlZCB0byBkbyBzby5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlY3VycmluZ1NjaGVkdWxlXG4gICAgICovXG4gICAgZW5kX2RhdGU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIuICBgYWN0aXZlYDogVGhlIHJlY3VycmluZyB0cmFuc2ZlciBpcyBjdXJyZW50bHkgYWN0aXZlLiBgY2FuY2VsbGVkYDogVGhlIHJlY3VycmluZyB0cmFuc2ZlciB3YXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQgb3IgUGxhaWQuIGBleHBpcmVkYDogVGhlIHJlY3VycmluZyB0cmFuc2ZlciBoYXMgY29tcGxldGVkIGFsbCBvcmlnaW5hdGlvbnMgYWNjb3JkaW5nIHRvIGl0cyByZWN1cnJpbmcgc2NoZWR1bGUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclJlY3VycmluZ1N0YXR1cyB7XG4gICAgQWN0aXZlID0gJ2FjdGl2ZScsXG4gICAgQ2FuY2VsbGVkID0gJ2NhbmNlbGxlZCcsXG4gICAgRXhwaXJlZCA9ICdleHBpcmVkJ1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSByZWZ1bmQgd2l0aGluIHRoZSBUcmFuc2ZlcnMgQVBJLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kIHtcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgcmVmdW5kLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRyYW5zZmVyIHRvIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGFtb3VudCBvZiB0aGUgcmVmdW5kIChkZWNpbWFsIHN0cmluZyB3aXRoIHR3byBkaWdpdHMgb2YgcHJlY2lzaW9uIGUuZy4gXFxcIjEwLjAwXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmRTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kXG4gICAgICovXG4gICAgc3RhdHVzOiBUcmFuc2ZlclJlZnVuZFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmRGYWlsdXJlfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uOiBUcmFuc2ZlclJlZnVuZEZhaWx1cmUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBQbGFpZCBMZWRnZXIgQmFsYW5jZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhpcyByZWZ1bmQgd2FzIGNyZWF0ZWQuIFRoaXMgd2lsbCBiZSBvZiB0aGUgZm9ybSBgMjAwNi0wMS0wMlQxNTowNDowNVpgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBjcmVhdGVkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gRm9yIGBydHBgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgVHJhbnNhY3Rpb24gSWRlbnRpZmljYXRpb24gbnVtYmVyLiBGb3IgYHdpcmVgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgSU1BRCAoSW5wdXQgTWVzc2FnZSBBY2NvdW50YWJpbGl0eSBEYXRhKSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRcbiAgICAgKi9cbiAgICBuZXR3b3JrX3RyYWNlX2lkPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSByZWZ1bmQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0XG4gICAgICovXG4gICAgcmVmdW5kX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENhbmNlbFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIHRyYW5zZmVyIHRvIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmFuc2Zlcl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHJlZnVuZCAoZGVjaW1hbCBzdHJpbmcgd2l0aCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIFxcXCIxMC4wMFxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmFuZG9tIGtleSBwcm92aWRlZCBieSB0aGUgY2xpZW50LCBwZXIgdW5pcXVlIHJlZnVuZC4gTWF4aW11bSBvZiA1MCBjaGFyYWN0ZXJzLiAgVGhlIEFQSSBzdXBwb3J0cyBpZGVtcG90ZW5jeSBmb3Igc2FmZWx5IHJldHJ5aW5nIHJlcXVlc3RzIHdpdGhvdXQgYWNjaWRlbnRhbGx5IHBlcmZvcm1pbmcgdGhlIHNhbWUgb3BlcmF0aW9uIHR3aWNlLiBGb3IgZXhhbXBsZSwgaWYgYSByZXF1ZXN0IHRvIGNyZWF0ZSBhIHJlZnVuZCBmYWlscyBkdWUgdG8gYSBuZXR3b3JrIGNvbm5lY3Rpb24gZXJyb3IsIHlvdSBjYW4gcmV0cnkgdGhlIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBpZGVtcG90ZW5jeSBrZXkgdG8gZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSByZWZ1bmQgaXMgY3JlYXRlZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpZGVtcG90ZW5jeV9rZXk6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmQ6IFRyYW5zZmVyUmVmdW5kO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZmFpbHVyZSByZWFzb24gaWYgdGhlIGV2ZW50IHR5cGUgZm9yIGEgcmVmdW5kIGlzIGBcXFwiZmFpbGVkXFxcImAgb3IgYFxcXCJyZXR1cm5lZFxcXCJgLiBOdWxsIHZhbHVlIG90aGVyd2lzZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZWZ1bmRGYWlsdXJlIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZmFpbHVyZSBjb2RlLCBlLmcuIGBSMDFgLiAgQSBmYWlsdXJlIGNvZGUgd2lsbCBiZSBwcm92aWRlZCBpZiBhbmQgb25seSBpZiB0aGUgcmVmdW5kIHN0YXR1cyBpcyBgcmV0dXJuZWRgLiBTZWUgW0FDSCByZXR1cm4gY29kZXNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zZmVyLyNhY2gtcmV0dXJuLWNvZGVzKSBmb3IgYSBmdWxsIGxpc3Rpbmcgb2YgQUNIIHJldHVybiBjb2RlcyBhbmQgW1JUUCBlcnJvciBjb2Rlc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNmZXIvI3J0cC1lcnJvci1jb2RlcykgZm9yIFJUUCBlcnJvciBjb2Rlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEZhaWx1cmVcbiAgICAgKi9cbiAgICBmYWlsdXJlX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBBQ0ggcmV0dXJuIGNvZGUsIGUuZy4gYFIwMWAuICBBIHJldHVybiBjb2RlIHdpbGwgYmUgcHJvdmlkZWQgaWYgYW5kIG9ubHkgaWYgdGhlIHJlZnVuZCBzdGF0dXMgaXMgYHJldHVybmVkYC4gRm9yIGEgZnVsbCBsaXN0aW5nIG9mIEFDSCByZXR1cm4gY29kZXMsIHNlZSBbVHJhbnNmZXIgZXJyb3JzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2Zlci8jYWNoLXJldHVybi1jb2RlcykuIFRoaXMgZmllbGQgaXMgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB0aGUgbW9yZSB2ZXJzYXRpbGUgYGZhaWx1cmVfY29kZWAsIHdoaWNoIGVuY29tcGFzc2VzIG5vbi1BQ0ggZmFpbHVyZSBjb2RlcyBhcyB3ZWxsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICAgICAqIEBkZXByZWNhdGVkXG4gICAgICovXG4gICAgYWNoX3JldHVybl9jb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByZWFzb24gZm9yIHRoZSBmYWlsdXJlIG9yIHJldmVyc2FsLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kRmFpbHVyZVxuICAgICAqL1xuICAgIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWTigJlzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHJlZnVuZC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICByZWZ1bmRfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJSZWZ1bmR9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWZ1bmQ6IFRyYW5zZmVyUmVmdW5kO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSByZWZ1bmQuICBgcGVuZGluZ2A6IEEgbmV3IHJlZnVuZCB3YXMgY3JlYXRlZDsgaXQgaXMgaW4gdGhlIHBlbmRpbmcgc3RhdGUuIGBwb3N0ZWRgOiBUaGUgcmVmdW5kIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBDcmVkaXRzIGhhdmUgYmVlbiByZWZ1bmRlZCB0byB0aGUgUGxhaWQgbGlua2VkIGFjY291bnQuIGBjYW5jZWxsZWRgOiBUaGUgcmVmdW5kIHdhcyBjYW5jZWxsZWQgYnkgdGhlIGNsaWVudC4gYGZhaWxlZGA6IFRoZSByZWZ1bmQgaGFzIGZhaWxlZC4gYHJldHVybmVkYDogVGhlIHJlZnVuZCB3YXMgcmV0dXJuZWQuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBUcmFuc2ZlclJlZnVuZFN0YXR1cyB7XG4gICAgUGVuZGluZyA9ICdwZW5kaW5nJyxcbiAgICBQb3N0ZWQgPSAncG9zdGVkJyxcbiAgICBDYW5jZWxsZWQgPSAnY2FuY2VsbGVkJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJyxcbiAgICBTZXR0bGVkID0gJ3NldHRsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJ1xufVxuXG4vKipcbiAqIEEgcmVwYXltZW50IGlzIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhZnRlciBvbmUgb3IgbW9yZSBndWFyYW50ZWVkIHRyYW5zYWN0aW9ucyByZWNlaXZlIGEgcmV0dXJuLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgZWxpZ2libGUgcmV0dXJucyBpbiBhIGRheSwgdGhleSBhcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIGEgc2luZ2xlIHJlcGF5bWVudC4gIFJlcGF5bWVudHMgYXJlIHNlbnQgb3ZlciBBQ0gsIHdpdGggZnVuZHMgdHlwaWNhbGx5IGF2YWlsYWJsZSBvbiB0aGUgbmV4dCBiYW5raW5nIGRheS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgcmVwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgcmVwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHJlcGF5bWVudCBvY2N1cnJlZCwgaW4gUkZDIDMzMzkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgY3JlYXRlZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIERlY2ltYWwgYW1vdW50IG9mIHRoZSByZXBheW1lbnQgYXMgaXQgYXBwZWFycyBvbiB5b3VyIGFjY291bnQgbGVkZ2VyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50XG4gICAgICovXG4gICAgYW1vdW50OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGN1cnJlbmN5IG9mIHRoZSByZXBheW1lbnQsIGUuZy4gXFxcIlVTRFxcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhcnQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXJ0X2RhdGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBlbmQgZGF0ZXRpbWUgb2YgcmVwYXltZW50cyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVwYXltZW50cyB0byByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIG9mZnNldD86IG51bWJlcjtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3JlcGF5bWVudHMvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0FycmF5PFRyYW5zZmVyUmVwYXltZW50Pn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXBheW1lbnRzOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudD47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcmV0dXJuIG9uIGEgR3VhcmFudGVlZCBBQ0ggdHJhbnNmZXIgdGhhdCBpcyBpbmNsdWRlZCBpbiB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybiB7XG4gICAgLyoqXG4gICAgICogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBndWFyYW50ZWVkIHRyYW5zZmVyIHRoYXQgd2FzIHJldHVybmVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgdHJhbnNmZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYHJldHVybmVkYCB0cmFuc2ZlciBldmVudC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGV2ZW50X2lkOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSByZXR1cm5lZCB0cmFuc2Zlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVyblxuICAgICAqL1xuICAgIGFtb3VudDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBjdXJyZW5jeSBvZiB0aGUgcmVwYXltZW50LCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvcmVwYXltZW50L3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElkZW50aWZpZXIgb2YgdGhlIHJlcGF5bWVudCB0byBxdWVyeS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgcmVwYXltZW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHJlcGF5bWVudHMgdG8gcmV0dXJuLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiByZXBheW1lbnRzIHRvIHNraXAgYmVmb3JlIHJldHVybmluZyByZXN1bHRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvZmZzZXQ/OiBudW1iZXI7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC90cmFuc2Zlci9yZXBheW1lbnRzL3JldHVybi9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm4+fVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcGF5bWVudF9yZXR1cm5zOiBBcnJheTxUcmFuc2ZlclJlcGF5bWVudFJldHVybj47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgdW5pdCBvZiB0aGUgcmVjdXJyaW5nIGludGVydmFsLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTY2hlZHVsZUludGVydmFsVW5pdCB7XG4gICAgV2VlayA9ICd3ZWVrJyxcbiAgICBNb250aCA9ICdtb250aCdcbn1cblxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSB0cmFuc2Zlci4gIGBwZW5kaW5nYDogQSBuZXcgdHJhbnNmZXIgd2FzIGNyZWF0ZWQ7IGl0IGlzIGluIHRoZSBwZW5kaW5nIHN0YXRlLiBgcG9zdGVkYDogVGhlIHRyYW5zZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdGhlIHBheW1lbnQgbmV0d29yay4gYHNldHRsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQgYnkgdGhlIHBheW1lbnQgbmV0d29yay4gTm90ZSB0aGF0IGZ1bmRzIGZyb20gcmVjZWl2ZWQgZGViaXRzIGFyZSBub3QgYXZhaWxhYmxlIHRvIGJlIG1vdmVkIG91dCBvZiB0aGUgTGVkZ2VyIHVudGlsIHRoZSB0cmFuc2ZlciByZWFjaGVzIGBmdW5kc19hdmFpbGFibGVgIHN0YXR1cy4gRm9yIGNyZWRpdCB0cmFuc2FjdGlvbnMsIGBzZXR0bGVkYCBtZWFucyB0aGUgZnVuZHMgaGF2ZSBiZWVuIGRlbGl2ZXJlZCB0byB0aGUgcmVjZWl2aW5nIGJhbmsgYWNjb3VudC4gYGZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIHRyYW5zZmVyIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIChPbmx5IGFwcGxpY2FibGUgdG8gQUNIIGRlYml0cy4pIGBjYW5jZWxsZWRgOiBUaGUgdHJhbnNmZXIgd2FzIGNhbmNlbGxlZCBieSB0aGUgY2xpZW50LiBgZmFpbGVkYDogVGhlIHRyYW5zZmVyIGZhaWxlZCwgbm8gZnVuZHMgd2VyZSBtb3ZlZC4gYHJldHVybmVkYDogQSBwb3N0ZWQgdHJhbnNmZXIgd2FzIHJldHVybmVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVHJhbnNmZXJTdGF0dXMge1xuICAgIFBlbmRpbmcgPSAncGVuZGluZycsXG4gICAgUG9zdGVkID0gJ3Bvc3RlZCcsXG4gICAgU2V0dGxlZCA9ICdzZXR0bGVkJyxcbiAgICBGdW5kc0F2YWlsYWJsZSA9ICdmdW5kc19hdmFpbGFibGUnLFxuICAgIENhbmNlbGxlZCA9ICdjYW5jZWxsZWQnLFxuICAgIEZhaWxlZCA9ICdmYWlsZWQnLFxuICAgIFJldHVybmVkID0gJ3JldHVybmVkJ1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyBhIHN3ZWVwIG9mIGZ1bmRzIHRvIC8gZnJvbSB0aGUgc3dlZXAgYWNjb3VudC4gIEEgc3dlZXAgaXMgYXNzb2NpYXRlZCB3aXRoIG1hbnkgc3dlZXAgZXZlbnRzIChldmVudHMgb2YgdHlwZSBgc3dlcHRgIG9yIGByZXR1cm5fc3dlcHRgKSB3aGljaCBjYW4gYmUgcmV0cmlldmVkIGJ5IGludm9raW5nIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgYHN3ZWVwX2lkYC4gIGBzd2VwdGAgZXZlbnRzIG9jY3VyIHdoZW4gdGhlIHRyYW5zZmVyIGFtb3VudCBpcyBjcmVkaXRlZCBvciBkZWJpdGVkIGZyb20geW91ciBzd2VlcCBhY2NvdW50LCBkZXBlbmRpbmcgb24gdGhlIGB0eXBlYCBvZiB0aGUgdHJhbnNmZXIuIGByZXR1cm5fc3dlcHRgIGV2ZW50cyBvY2N1ciB3aGVuIGEgdHJhbnNmZXIgaXMgcmV0dXJuZWQgYW5kIFBsYWlkIHVuZG9lcyB0aGUgY3JlZGl0IG9yIGRlYml0LiAgVGhlIHRvdGFsIHN1bSBvZiB0aGUgYHN3ZXB0YCBhbmQgYHJldHVybl9zd2VwdGAgZXZlbnRzIGlzIGVxdWFsIHRvIHRoZSBgYW1vdW50YCBvZiB0aGUgc3dlZXAgUGxhaWQgY3JlYXRlcyBhbmQgbWF0Y2hlcyB0aGUgYW1vdW50IG9mIHRoZSBlbnRyeSBvbiB5b3VyIHN3ZWVwIGFjY291bnQgbGVkZ2VyLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcCB7XG4gICAgLyoqXG4gICAgICogSWRlbnRpZmllciBvZiB0aGUgc3dlZXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkIG9mIHRoZSBmdW5kaW5nIGFjY291bnQgdG8gdXNlLCBhdmFpbGFibGUgaW4gdGhlIFBsYWlkIERhc2hib2FyZC4gVGhpcyBkZXRlcm1pbmVzIHdoaWNoIG9mIHlvdXIgYnVzaW5lc3MgY2hlY2tpbmcgYWNjb3VudHMgd2lsbCBiZSBjcmVkaXRlZCBvciBkZWJpdGVkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBQbGFpZOKAmXMgdW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgUGxhaWQgTGVkZ2VyIEJhbGFuY2UuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGxlZGdlcl9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGV0aW1lIHdoZW4gdGhlIHN3ZWVwIG9jY3VycmVkLCBpbiBSRkMgMzMzOSBmb3JtYXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIGNyZWF0ZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBTaWduZWQgZGVjaW1hbCBhbW91bnQgb2YgdGhlIHN3ZWVwIGFzIGl0IGFwcGVhcnMgb24geW91ciBzd2VlcCBhY2NvdW50IGxlZGdlciAoZS5nLiBcXFwiLTEwLjAwXFxcIikgIElmIGFtb3VudCBpcyBub3QgcHJlc2VudCwgdGhlIHN3ZWVwIHdhcyBuZXQtc2V0dGxlZCB0byB6ZXJvIGFuZCBvdXRzdGFuZGluZyBkZWJpdHMgYW5kIGNyZWRpdHMgYmV0d2VlbiB0aGUgc3dlZXAgYWNjb3VudCBhbmQgUGxhaWQgYXJlIGJhbGFuY2VkLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBhbW91bnQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVuY3kgb2YgdGhlIHN3ZWVwLCBlLmcuIFxcXCJVU0RcXFwiLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIHdoZW4gdGhlIHN3ZWVwIHNldHRsZWQsIGluIHRoZSBZWVlZLU1NLUREIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgc2V0dGxlZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwVHJpZ2dlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIHRyaWdnZXI/OiBTd2VlcFRyaWdnZXIgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZGVwb3NpdCB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZSByZWNlaXZpbmcgYmFuayAodXAgdG8gMTAgY2hhcmFjdGVycykuIE5vdGUgdGhhdCBiYW5rcyB1dGlsaXplIHRoaXMgZmllbGQgZGlmZmVyZW50bHksIGFuZCBtYXkgb3IgbWF5IG5vdCBzaG93IGl0IG9uIHRoZSBiYW5rIHN0YXRlbWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwXG4gICAgICovXG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRyYWNlIGlkZW50aWZpZXIgZm9yIHRoZSB0cmFuc2ZlciBiYXNlZCBvbiBpdHMgbmV0d29yay4gVGhpcyB3aWxsIG9ubHkgYmUgc2V0IGFmdGVyIHRoZSB0cmFuc2ZlciBoYXMgcG9zdGVkLiAgRm9yIGBhY2hgIG9yIGBzYW1lLWRheS1hY2hgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgQUNIIHRyYWNlIG51bWJlci4gRm9yIGBydHBgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgVHJhbnNhY3Rpb24gSWRlbnRpZmljYXRpb24gbnVtYmVyLiBGb3IgYHdpcmVgIHRyYW5zZmVycywgdGhpcyBpcyB0aGUgSU1BRCAoSW5wdXQgTWVzc2FnZSBBY2NvdW50YWJpbGl0eSBEYXRhKSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcFxuICAgICAqL1xuICAgIG5ldHdvcmtfdHJhY2VfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTd2VlcEZhaWx1cmV9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBcbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFN3ZWVwRmFpbHVyZSB8IG51bGw7XG59XG4vKipcbiAqIERlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogUGxhaWRcXCdzIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3dlZXAgKFVVSUQpIG9yIGEgc2hvcnRlbmVkIGZvcm0gY29uc2lzdGluZyBvZiB0aGUgZmlyc3QgOCBjaGFyYWN0ZXJzIG9mIHRoZSBpZGVudGlmaWVyICg4LWRpZ2l0IGhleGFkZWNpbWFsIHN0cmluZykuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzd2VlcF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdHJhbnNmZXIvc3dlZXAvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclN3ZWVwfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcDogVHJhbnNmZXJTd2VlcDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC90cmFuc2Zlci9zd2VlcC9saXN0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHN0YXJ0IGRhdGV0aW1lIG9mIHN3ZWVwcyB0byByZXR1cm4gKFJGQyAzMzM5IGZvcm1hdCkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhcnRfZGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGVuZCBkYXRldGltZSBvZiBzd2VlcHMgdG8gcmV0dXJuIChSRkMgMzMzOSBmb3JtYXQpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9kYXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc3dlZXBzIHRvIHJldHVybi5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWJlciBvZiBzd2VlcHMgdG8gc2tpcCBiZWZvcmUgcmV0dXJuaW5nIHJlc3VsdHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb2Zmc2V0PzogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBzcGVjaWZpZWQgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1N3ZWVwU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBTd2VlcFN0YXR1cyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBvcmlnaW5hdG9yIGNsaWVudC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdG9yX2NsaWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRmlsdGVyIHN3ZWVwcyB0byBvbmx5IHRob3NlIHdpdGggdGhlIHNwZWNpZmllZCBgZnVuZGluZ19hY2NvdW50X2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBmdW5kaW5nX2FjY291bnRfaWQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEZpbHRlciBzd2VlcHMgdG8gb25seSB0aG9zZSB3aXRoIHRoZSBpbmNsdWRlZCBgdHJhbnNmZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zZmVyX2lkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U3dlZXBUcmlnZ2VyfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB0cmlnZ2VyPzogU3dlZXBUcmlnZ2VyIHwgbnVsbDtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3RyYW5zZmVyL3N3ZWVwL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VHJhbnNmZXJTd2VlcD59XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzd2VlcHM6IEFycmF5PFRyYW5zZmVyU3dlZXA+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclN3ZWVwTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgc3RhdHVzIG9mIHRoZSBzd2VlcCBmb3IgdGhlIHRyYW5zZmVyLiAgYHVuc3dlcHRgOiBUaGUgdHJhbnNmZXIgaGFzblxcJ3QgYmVlbiBzd2VwdCB5ZXQuIGBzd2VwdGA6IFRoZSB0cmFuc2ZlciB3YXMgc3dlcHQgdG8gdGhlIHN3ZWVwIGFjY291bnQuIGBzd2VwdF9zZXR0bGVkYDogQ3JlZGl0cyBhcmUgYXZhaWxhYmxlIHRvIGJlIHdpdGhkcmF3biBvciBkZWJpdHMgaGF2ZSBiZWVuIGRlZHVjdGVkIGZyb20gdGhlIGN1c3RvbWVy4oCZcyBidXNpbmVzcyBjaGVja2luZyBhY2NvdW50LiBgcmV0dXJuX3N3ZXB0YDogVGhlIHRyYW5zZmVyIHdhcyByZXR1cm5lZCwgZnVuZHMgd2VyZSBwdWxsZWQgYmFjayBvciBwdXNoZWQgYmFjayB0byB0aGUgc3dlZXAgYWNjb3VudC4gYGZ1bmRzX2F2YWlsYWJsZWA6IEZ1bmRzIGZyb20gdGhlIHRyYW5zZmVyIGhhdmUgYmVlbiByZWxlYXNlZCBmcm9tIGhvbGQgYW5kIGFwcGxpZWQgdG8gdGhlIGxlZGdlclxcJ3MgYXZhaWxhYmxlIGJhbGFuY2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIHRvIGRlYml0cy4gYG51bGxgOiBUaGUgdHJhbnNmZXIgd2lsbCBuZXZlciBiZSBzd2VwdCAoZS5nLiBpZiB0aGUgdHJhbnNmZXIgaXMgY2FuY2VsbGVkIG9yIHJldHVybmVkIGJlZm9yZSBiZWluZyBzd2VwdClcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyU3dlZXBTdGF0dXMge1xuICAgIE51bGwgPSAnbnVsbCcsXG4gICAgVW5zd2VwdCA9ICd1bnN3ZXB0JyxcbiAgICBTd2VwdCA9ICdzd2VwdCcsXG4gICAgU3dlcHRTZXR0bGVkID0gJ3N3ZXB0X3NldHRsZWQnLFxuICAgIFJldHVyblN3ZXB0ID0gJ3JldHVybl9zd2VwdCcsXG4gICAgRnVuZHNBdmFpbGFibGUgPSAnZnVuZHNfYXZhaWxhYmxlJ1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIHRlc3QgY2xvY2sgZm9yIGEgdHJhbnNmZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVGVzdENsb2NrXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJUZXN0Q2xvY2sge1xuICAgIC8qKlxuICAgICAqIFBsYWlk4oCZcyB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSB0ZXN0IGNsb2NrLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVGVzdENsb2NrXG4gICAgICovXG4gICAgdGVzdF9jbG9ja19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB2aXJ0dWFsIHRpbWVzdGFtcCBvbiB0aGUgdGVzdCBjbG9jay4gVGhpcyB3aWxsIGJlIG9mIHRoZSBmb3JtIGAyMDA2LTAxLTAyVDE1OjA0OjA1WmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJUZXN0Q2xvY2tcbiAgICAgKi9cbiAgICB2aXJ0dWFsX3RpbWU6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgdHJhbnNmZXIuIFRoaXMgd2lsbCBiZSBlaXRoZXIgYGRlYml0YCBvciBgY3JlZGl0YC4gIEEgYGRlYml0YCBpbmRpY2F0ZXMgYSB0cmFuc2ZlciBvZiBtb25leSBpbnRvIHRoZSBvcmlnaW5hdGlvbiBhY2NvdW50OyBhIGBjcmVkaXRgIGluZGljYXRlcyBhIHRyYW5zZmVyIG9mIG1vbmV5IG91dCBvZiB0aGUgb3JpZ2luYXRpb24gYWNjb3VudC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFRyYW5zZmVyVHlwZSB7XG4gICAgRGViaXQgPSAnZGViaXQnLFxuICAgIENyZWRpdCA9ICdjcmVkaXQnXG59XG5cbi8qKlxuICogVGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEV4LiBcXFwiU2FuIEZyYW5jaXNjb1xcXCJcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgc3RhdGUgb3IgcHJvdmluY2UgKGUuZy4sIFxcXCJDQVxcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3RcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0XG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB0d28tbGV0dGVyIGNvdW50cnkgY29kZSAoZS5nLiwgXFxcIlVTXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdFxuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSBzdHJlZXQgbnVtYmVyIGFuZCBuYW1lIChpLmUuLCBcXFwiMTAwIE1hcmtldCBTdC5cXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHN0cmVldDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBFeC4gXFxcIlNhbiBGcmFuY2lzY29cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjaXR5OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBzdGF0ZSBvciBwcm92aW5jZSAoZS5nLiwgXFxcIkNBXFxcIikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VyQWRkcmVzc0luUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWdpb246IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIChlLmcuLCBcXFwiOTQxMDNcXFwiKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZVxuICAgICAqL1xuICAgIHBvc3RhbF9jb2RlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdHdvLWxldHRlciBjb3VudHJ5IGNvZGUgKGUuZy4sIFxcXCJVU1xcXCIpLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIGxlZ2FsIG5hbWUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGZvciB0aGUgYWNjb3VudCBob2xkZXIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGxlZ2FsIG5hbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGVtYWlsX2FkZHJlc3M/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1RyYW5zZmVyVXNlckFkZHJlc3NJblJlcXVlc3R9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWQge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVxdWVzdERlcHJlY2F0ZWRcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBwaG9uZSBudW1iZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlclxcJ3MgZW1haWwgYWRkcmVzcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlcXVlc3REZXByZWNhdGVkXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VHJhbnNmZXJVc2VyQWRkcmVzc0luUmVxdWVzdH1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXF1ZXN0RGVwcmVjYXRlZFxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXF1ZXN0O1xufVxuLyoqXG4gKiBUaGUgbGVnYWwgbmFtZSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBhY2NvdW50IGhvbGRlci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zZmVyVXNlckluUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBsZWdhbCBuYW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBsZWdhbF9uYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlclVzZXJJblJlc3BvbnNlXG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFRyYW5zZmVyVXNlckluUmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbWFpbF9hZGRyZXNzOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtUcmFuc2ZlclVzZXJBZGRyZXNzSW5SZXNwb25zZX1cbiAgICAgKiBAbWVtYmVyb2YgVHJhbnNmZXJVc2VySW5SZXNwb25zZVxuICAgICAqL1xuICAgIGFkZHJlc3M6IFRyYW5zZmVyVXNlckFkZHJlc3NJblJlc3BvbnNlIHwgbnVsbDtcbn1cbi8qKlxuICogSW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gd2lyZSB0cmFuc2ZlcnMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRyYW5zZmVyV2lyZURldGFpbHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2ZlcldpcmVEZXRhaWxzIHtcbiAgICAvKipcbiAgICAgKiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZyb20gdGhlIHdpcmUgb3JpZ2luYXRvciB0byB0aGUgYmVuZWZpY2lhcnkuIE1heCAxNDAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBUcmFuc2ZlcldpcmVEZXRhaWxzXG4gICAgICovXG4gICAgbWVzc2FnZV90b19iZW5lZmljaWFyeT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRydXN0ZWQgRGV2aWNlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcmV2aW91cyBMaW5rIHNlc3Npb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFRydXN0ZWREZXZpY2VEYXRhXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHJ1c3RlZERldmljZURhdGEge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFRydXN0ZWREZXZpY2VEYXRhXG4gICAgICovXG4gICAgdHJ1c3RfbGV2ZWw/OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0RldmljZUlkfVxuICAgICAqIEBtZW1iZXJvZiBUcnVzdGVkRGV2aWNlRGF0YVxuICAgICAqL1xuICAgIGRldmljZV9pZD86IERldmljZUlkO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGVkaXRpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3Byb2dyYW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgb3JnYW5pemF0aW9uIGJlaW5nIHNjcmVlbmVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycywgYW5kIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICBkb2N1bWVudF9udW1iZXI/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB2YWxpZCBlbWFpbCBhZGRyZXNzLiBNdXN0IG5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzIGFuZCBhZGRyZXNzIG11c3QgYmUgUkZDIGNvbXBsaWFudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBbUkZDIDM2OTZdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjMzY5NikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZW1haWxfYWRkcmVzcz86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBwaG9uZSBudW1iZXIgaW4gRS4xNjQgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUVudGl0eVNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIHBob25lX251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBcXCdodHRwXFwnIG9yIFxcJ2h0dHBzXFwnIFVSTCAobXVzdCBiZWdpbiB3aXRoIGVpdGhlciBvZiB0aG9zZSkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlRW50aXR5U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgdXJsPzogc3RyaW5nO1xufVxuLyoqXG4gKiBTZWFyY2ggdGVybXMgZm9yIGVkaXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbGVnYWwgbmFtZSBvZiB0aGUgaW5kaXZpZHVhbCBiZWluZyBzY3JlZW5lZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCBoYXZlIGEgbWF4aW11bSBsZW5ndGggb2YgMTAwIGNoYXJhY3RlcnMsIGFuZCBub3QgaW5jbHVkZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZG9jdW1lbnRfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXBkYXRlSW5kaXZpZHVhbFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBpZGVudGl0eSBkYXRhIHBlcm1pc3Npb25lZCBieSB0aGUgZW5kIHVzZXIgZHVyaW5nIHRoZSBhdXRob3JpemF0aW9uIGZsb3cuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7VXNlckFjY291bnRJZGVudGl0eU5hbWV9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBuYW1lPzogVXNlckFjY291bnRJZGVudGl0eU5hbWUgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGFkZHJlc3M/OiBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIHBob25lIG51bWJlciBpbiBbRS4xNjRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0UuMTY0KSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5XG4gICAgICovXG4gICAgcGhvbmVfbnVtYmVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBlbWFpbCBhZGRyZXNzLiAgTm90ZTogZW1haWwgaXMgY3VycmVudGx5IG5vdCByZXR1cm5lZCBmb3IgdXNlcnMsIGFuZCBpcyBhbiB1cGNvbWluZyBhZGRpdGlvbiB0aGF0IHdpbGwgYmUgbGl2ZSBpbiBlYXJseSAyMDI1LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBlbWFpbD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXJcXCdzIGRhdGUgb2YgYmlydGguXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eVxuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyXFwncyBzb2NpYWwgc2VjdXJpdHkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBzc24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBsYXN0IDQgZGlnaXRzIG9mIHRoZSB1c2VyXFwncyBzb2NpYWwgc2VjdXJpdHkgbnVtYmVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlcbiAgICAgKi9cbiAgICBzc25fbGFzdF80Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGFkZHJlc3MuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3Mge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIGNpdHkgbmFtZVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgY2l0eT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHJlZ2lvbiBvciBzdGF0ZS4gRXhhbXBsZTogYFxcXCJOQ1xcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICByZWdpb24/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHN0cmVldCBhZGRyZXNzIEV4YW1wbGU6IGBcXFwiNTY0IE1haW4gU3RyZWV0LCBBUFQgMTVcXFwiYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgc3RyZWV0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgc2Vjb25kIGxpbmUgc3RyZWV0IGFkZHJlc3NcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudElkZW50aXR5QWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldDI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBwb3N0YWwgY29kZS4gSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoaXMgZmllbGQgaXMgY2FsbGVkIGB6aXBgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoZSBJU08gMzE2Ni0xIGFscGhhLTIgY291bnRyeSBjb2RlXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eUFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5Pzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHVzZXJcXCdzIGZpcnN0IG5hbWUgYW5kIGxhc3QgbmFtZS5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRJZGVudGl0eU5hbWVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudElkZW50aXR5TmFtZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJZGVudGl0eU5hbWVcbiAgICAgKi9cbiAgICBmaXJzdF9uYW1lPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50SWRlbnRpdHlOYW1lXG4gICAgICovXG4gICAgbGFzdF9uYW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBJdGVtIGNyZWF0ZWQgZHVyaW5nIGEgTGF5ZXIgYXV0aG9yaXphdGlvbiBzZXNzaW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudEl0ZW1cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudEl0ZW0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBJdGVtIElELiBUaGUgYGl0ZW1faWRgIGlzIGFsd2F5cyB1bmlxdWU7IGxpbmtpbmcgdGhlIHNhbWUgYWNjb3VudCBhdCB0aGUgc2FtZSBpbnN0aXR1dGlvbiB0d2ljZSB3aWxsIHJlc3VsdCBpbiB0d28gSXRlbXMgd2l0aCBkaWZmZXJlbnQgYGl0ZW1faWRgIHZhbHVlcy4gTGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIHRoZSBgaXRlbV9pZGAgaXMgY2FzZS1zZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJdGVtXG4gICAgICovXG4gICAgaXRlbV9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjZXNzIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRJdGVtXG4gICAgICovXG4gICAgYWNjZXNzX3Rva2VuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYCB3ZWJob29rIGlzIGZpcmVkIHdoZW4gYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgYWNjZXNzIHRvIHRoZWlyIGFjY291bnQgb24gdGhlIERhdGEgUHJvdmlkZXJcXCdzIHBvcnRhbC4gVGhpcyB3ZWJob29rIGlzIGN1cnJlbnRseSBzZW50IG9ubHkgZm9yIENoYXNlIGFuZCBQTkMgSXRlbXMsIGJ1dCBtYXkgYmUgc2VudCBpbiB0aGUgZnV0dXJlIGZvciBvdGhlciBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIHRoYXQgYWxsb3cgYWNjb3VudC1sZXZlbCBwZXJtaXNzaW9ucyByZXZvY2F0aW9uIHRocm91Z2ggdGhlaXIgcG9ydGFscy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IFBsYWlkLWRlcml2ZWQgZGF0YSB5b3UgaGF2ZSBzdG9yZWQgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJldm9rZWQgYWNjb3VudC4gIElmIHlvdSBhcmUgdXNpbmcgQXV0aCBhbmQgcmVjZWl2ZSB0aGlzIHdlYmhvb2ssIHRoaXMgd2ViaG9vayBpbmRpY2F0ZXMgdGhhdCB0aGUgVEFOIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmV2b2tlZCBhY2NvdW50IGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIG5ldyB0cmFuc2ZlcnMuIFlvdSBzaG91bGQgbm90IGNyZWF0ZSBuZXcgQUNIIHRyYW5zZmVycyBmb3IgdGhlIGFjY291bnQgdGhhdCB3YXMgcmV2b2tlZCB1bnRpbCBhY2Nlc3MgaGFzIGJlZW4gcmUtZ3JhbnRlZC4gIFlvdSBjYW4gcmVxdWVzdCB0aGUgdXNlciB0byByZS1ncmFudCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBieSBzZW5kaW5nIHRoZW0gdGhyb3VnaCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiBBbHRlcm5hdGl2ZWx5LCB0aGV5IG1heSByZS1ncmFudCBhY2Nlc3MgZGlyZWN0bHkgdGhyb3VnaCB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiAgQWZ0ZXIgdGhlIHVzZXIgaGFzIHJlLWdyYW50ZWQgYWNjZXNzLCBBdXRoIGN1c3RvbWVycyBzaG91bGQgY2FsbCB0aGUgYXV0aCBlbmRwb2ludCBhZ2FpbiB0byBvYnRhaW4gdGhlIG5ldyBUQU4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgSVRFTWBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va190eXBlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogYFVTRVJfQUNDT1VOVF9SRVZPS0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGl0ZW1faWRgIG9mIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHdlYmhvb2ssIHdhcm5pbmcsIG9yIGVycm9yXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXh0ZXJuYWwgYWNjb3VudCBJRCBvZiB0aGUgYWZmZWN0ZWQgYWNjb3VudFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50UmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBhY2NvdW50X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRSZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVudmlyb25tZW50OiBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXM7XG59XG4vKipcbiAqIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlcl9hY2NvdW50L3Nlc3Npb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBwdWJsaWMgdG9rZW4gZ2VuZXJhdGVkIGJ5IHRoZSBlbmQgdXNlciBMYXllciBzZXNzaW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBwdWJsaWNfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXJfYWNjb3VudC9zZXNzaW9uL2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1VzZXJBY2NvdW50SWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWRlbnRpdHk6IFVzZXJBY2NvdW50SWRlbnRpdHkgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxVc2VyQWNjb3VudEl0ZW0+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGl0ZW1zOiBBcnJheTxVc2VyQWNjb3VudEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogSG9tZSBhZGRyZXNzIGZvciB0aGUgdXNlci4gU3VwcG9ydGVkIHZhbHVlcyBhcmU6IG5vdCBwcm92aWRlZCwgYWRkcmVzcyB3aXRoIG9ubHkgY291bnRyeSBjb2RlIG9yIGZ1bGwgYWRkcmVzcy4gIEZvciBtb3JlIGNvbnRleHQgb24gdGhpcyBmaWVsZCwgc2VlIFtJbnB1dCBWYWxpZGF0aW9uIGJ5IENvdW50cnldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHktdmVyaWZpY2F0aW9uL2h5YnJpZC1pbnB1dC12YWxpZGF0aW9uLyNpbnB1dC12YWxpZGF0aW9uLWJ5LWNvdW50cnkpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQWRkcmVzc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJBZGRyZXNzIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSBzdHJlZXQgcG9ydGlvbiBvZiBhbiBhZGRyZXNzLiBJZiBhbiBhZGRyZXNzIGlzIHByb3ZpZGVkLCB0aGlzIGZpZWxkIHdpbGwgYWx3YXlzIGJlIGZpbGxlZC4gQSBzdHJpbmcgd2l0aCBhdCBsZWFzdCBvbmUgbm9uLXdoaXRlc3BhY2UgYWxwaGFiZXRpY2FsIGNoYXJhY3Rlciwgd2l0aCBhIG1heCBsZW5ndGggb2YgODAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHN0cmVldD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRXh0cmEgc3RyZWV0IGluZm9ybWF0aW9uLCBsaWtlIGFuIGFwYXJ0bWVudCBvciBzdWl0ZSBudW1iZXIuIElmIHByb3ZpZGVkLCBhIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIHdpdGggYSBtYXggbGVuZ3RoIG9mIDUwIGNoYXJhY3RlcnMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBzdHJlZXQyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDaXR5IGZyb20gdGhlIGVuZCB1c2VyXFwncyBhZGRyZXNzLiBBIHN0cmluZyB3aXRoIGF0IGxlYXN0IG9uZSBub24td2hpdGVzcGFjZSBhbHBoYWJldGljYWwgY2hhcmFjdGVyLCB3aXRoIGEgbWF4IGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycy5cXFwiXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjaXR5Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU08gMzE2Ni0yIHN1YmRpdmlzaW9uIGNvZGUuIFJlbGF0ZWQgdGVybXMgd291bGQgYmUgXFxcInN0YXRlXFxcIiwgXFxcInByb3ZpbmNlXFxcIiwgXFxcInByZWZlY3R1cmVcXFwiLCBcXFwiem9uZVxcXCIsIFxcXCJzdWJkaXZpc2lvblxcXCIsIGV0Yy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQWRkcmVzc1xuICAgICAqL1xuICAgIHJlZ2lvbj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIHBvc3RhbCBjb2RlIGZvciB0aGUgYXNzb2NpYXRlZCBhZGRyZXNzLiBCZXR3ZWVuIDIgYW5kIDEwIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzLiBGb3IgVVMtYmFzZWQgYWRkcmVzc2VzIHRoaXMgbXVzdCBiZSA1IG51bWVyaWMgZGlnaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJBZGRyZXNzXG4gICAgICovXG4gICAgcG9zdGFsX2NvZGU/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFZhbGlkLCBjYXBpdGFsaXplZCwgdHdvLWxldHRlciBJU08gY29kZSByZXByZXNlbnRpbmcgdGhlIGNvdW50cnkgb2YgdGhpcyBvYmplY3QuIE11c3QgYmUgaW4gSVNPIDMxNjYtMSBhbHBoYS0yIGZvcm0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckFkZHJlc3NcbiAgICAgKi9cbiAgICBjb3VudHJ5OiBzdHJpbmc7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgdGhlIGVuZCB1c2VyLiBNYXhpbXVtIG9mIDEyOCBjaGFyYWN0ZXJzLiBUeXBpY2FsbHkgdGhpcyB3aWxsIGJlIGEgdXNlciBJRCBudW1iZXIgZnJvbSB5b3VyIGFwcGxpY2F0aW9uLiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCByZXByZXNlbnRpbmcgYSBDUkEgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci4gTWF4aW11bSBvZiAxMjggY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVuZF9jdXN0b21lcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7Q29uc3VtZXJSZXBvcnRVc2VySWRlbnRpdHl9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHk/OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIFBsYWlkIGB1c2VyX2lkYCBvZiB0aGUgVXNlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB1c2VyX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogQ3VzdG9tIHRlc3QgYWNjb3VudHMgYXJlIGNvbmZpZ3VyZWQgd2l0aCBhIEpTT04gY29uZmlndXJhdGlvbiBvYmplY3QgZm9ybXVsYXRlZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSBiZWxvdy4gQWxsIHRvcCBsZXZlbCBmaWVsZHMgYXJlIG9wdGlvbmFsLiBTZW5kaW5nIGFuIGVtcHR5IG9iamVjdCBhcyBhIGNvbmZpZ3VyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4gYWNjb3VudCBjb25maWd1cmVkIHdpdGggcmFuZG9tIGJhbGFuY2VzIGFuZCB0cmFuc2FjdGlvbiBoaXN0b3J5LlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyQ3VzdG9tUGFzc3dvcmQge1xuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBzY2hlbWEgdG8gdXNlLCBwb3NzaWJsZSB2YWx1ZXMgYXJlIDEgb3IgMi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMi4gWW91IHNob3VsZCBvbmx5IHNwZWNpZnkgMSBpZiB5b3Uga25vdyBpdCBpcyBuZWNlc3NhcnkgZm9yIHlvdXIgdGVzdCBzdWl0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICB2ZXJzaW9uPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHNlZWQsIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5nLCB0aGF0IHdpbGwgYmUgdXNlZCB0byByYW5kb21seSBnZW5lcmF0ZSBhY2NvdW50IGFuZCB0cmFuc2FjdGlvbiBkYXRhLCBpZiB0aGlzIGRhdGEgaXMgbm90IHNwZWNpZmllZCB1c2luZyB0aGUgYG92ZXJyaWRlX2FjY291bnRzYCBhcmd1bWVudC4gSWYgbm8gc2VlZCBpcyBzcGVjaWZpZWQsIHRoZSByYW5kb21seSBnZW5lcmF0ZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBlYWNoIHRpbWUuICBOb3RlIHRoYXQgdHJhbnNhY3Rpb25zIGRhdGEgaXMgZ2VuZXJhdGVkIHJlbGF0aXZlIHRvIHRoZSBJdGVtXFwncyBjcmVhdGlvbiBkYXRlLiBEaWZmZXJlbnQgSXRlbXMgY3JlYXRlZCBvbiBkaWZmZXJlbnQgZGF0ZXMgd2l0aCB0aGUgc2FtZSBzZWVkIGZvciB0cmFuc2FjdGlvbnMgZGF0YSB3aWxsIGhhdmUgZGlmZmVyZW50IGRhdGVzIGZvciB0aGUgdHJhbnNhY3Rpb25zLiBUaGUgbnVtYmVyIG9mIGRheXMgYmV0d2VlbiBlYWNoIHRyYW5zYWN0aW9uIGFuZCB0aGUgSXRlbSBjcmVhdGlvbiB3aWxsIHJlbWFpbiBjb25zdGFudC4gRm9yIGV4YW1wbGUsIGFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAxNSBtaWdodCBzaG93IGEgdHJhbnNhY3Rpb24gb24gRGVjZW1iZXIgMTQuIEFuIEl0ZW0gY3JlYXRlZCBvbiBEZWNlbWJlciAyMCwgdXNpbmcgdGhlIHNhbWUgc2VlZCwgd291bGQgc2hvdyB0aGF0IHNhbWUgdHJhbnNhY3Rpb24gb2NjdXJyaW5nIG9uIERlY2VtYmVyIDE5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHNlZWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBhcnJheSBvZiBhY2NvdW50IG92ZXJyaWRlcyB0byBjb25maWd1cmUgdGhlIGFjY291bnRzIGZvciB0aGUgSXRlbS4gQnkgZGVmYXVsdCwgaWYgbm8gb3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0cmFuc2FjdGlvbnMgYW5kIGFjY291bnQgZGF0YSB3aWxsIGJlIHJhbmRvbWx5IGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgYWNjb3VudCB0eXBlIGFuZCBzdWJ0eXBlLCBhbmQgb3RoZXIgcHJvZHVjdHMgd2lsbCBoYXZlIGZpeGVkIG9yIGVtcHR5IGRhdGEuXG4gICAgICogQHR5cGUge0FycmF5PE92ZXJyaWRlQWNjb3VudHM+fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyQ3VzdG9tUGFzc3dvcmRcbiAgICAgKi9cbiAgICBvdmVycmlkZV9hY2NvdW50czogQXJyYXk8T3ZlcnJpZGVBY2NvdW50cz47XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge01GQX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgbWZhOiBNRkE7XG4gICAgLyoqXG4gICAgICogWW91IG1heSB0cmlnZ2VyIGEgcmVDQVBUQ0hBIGluIFBsYWlkIExpbmsgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQgYnkgdXNpbmcgdGhlIHJlY2FwdGNoYSBmaWVsZC4gUG9zc2libGUgdmFsdWVzIGFyZSBgZ29vZGAgb3IgYGJhZGAuIEEgdmFsdWUgb2YgYGdvb2RgIHdpbGwgcmVzdWx0IGluIHN1Y2Nlc3NmdWwgSXRlbSBjcmVhdGlvbiBhbmQgYGJhZGAgd2lsbCByZXN1bHQgaW4gYSBgUkVDQVBUQ0hBX0JBRGAgZXJyb3IgdG8gc2ltdWxhdGUgYSBmYWlsZWQgcmVDQVBUQ0hBLiBCb3RoIHZhbHVlcyByZXF1aXJlIHRoZSByZUNBUFRDSEEgdG8gYmUgbWFudWFsbHkgc29sdmVkIHdpdGhpbiBQbGFpZCBMaW5rLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJDdXN0b21QYXNzd29yZFxuICAgICAqL1xuICAgIHJlY2FwdGNoYTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIGNvZGUgdG8gZm9yY2Ugb24gSXRlbSBjcmVhdGlvbi4gUG9zc2libGUgdmFsdWVzIGFyZTogIGBcXFwiSU5TVElUVVRJT05fTk9UX1JFU1BPTkRJTkdcXFwiYCBgXFxcIklOU1RJVFVUSU9OX05PX0xPTkdFUl9TVVBQT1JURURcXFwiYCBgXFxcIklOVkFMSURfQ1JFREVOVElBTFNcXFwiYCBgXFxcIklOVkFMSURfTUZBXFxcImAgYFxcXCJJVEVNX0xPQ0tFRFxcXCJgIGBcXFwiSVRFTV9MT0dJTl9SRVFVSVJFRFxcXCJgIGBcXFwiSVRFTV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJJTlZBTElEX0xJTktfVE9LRU5cXFwiYCBgXFxcIk1GQV9OT1RfU1VQUE9SVEVEXFxcImAgYFxcXCJOT19BQ0NPVU5UU1xcXCJgIGBcXFwiUExBSURfRVJST1JcXFwiYCBgXFxcIlVTRVJfSU5QVVRfVElNRU9VVFxcXCJgIGBcXFwiVVNFUl9TRVRVUF9SRVFVSVJFRFxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckN1c3RvbVBhc3N3b3JkXG4gICAgICovXG4gICAgZm9yY2VfZXJyb3I6IHN0cmluZztcbn1cbi8qKlxuICogbWV0YWRhdGEgZm9yIHRoZSBzZXQgb2YgaW5zaWdodHMgcHJvdmlkZWQgaW4gYFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyRGF0YU92ZXJ2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckRhdGFPdmVydmlldyB7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiB0cmFuc2FjdGlvbnMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2NvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIGRhdGUgb2YgdGhlIG9sZGVzdCB0cmFuc2FjdGlvbiBwcm9jZXNzZWQgdG8gZ2VuZXJhdGUgaW5zaWdodHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIG9sZGVzdF90cmFuc2FjdGlvbl9kYXRlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIG9mIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb24gcHJvY2Vzc2VkIHRvIGdlbmVyYXRlIGluc2lnaHRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBuZXdlc3RfdHJhbnNhY3Rpb25fZGF0ZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcmFuZ2Ugb2YgZGF5cyBvZiB0cmFuc2FjdGlvbnMgYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICBkYXlzX2F2YWlsYWJsZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFN1bSBvZiBvdXRmbG93IGFtb3VudHMuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgVXNlckRhdGFPdmVydmlld1xuICAgICAqL1xuICAgIHRvdGFsX291dGZsb3dzOiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogU3VtIG9mIGluZmxvdyBhbW91bnRzLlxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFVzZXJEYXRhT3ZlcnZpZXdcbiAgICAgKi9cbiAgICB0b3RhbF9pbmZsb3dzOiBudW1iZXI7XG59XG4vKipcbiAqIElEIG51bWJlciBzdWJtaXR0ZWQgYnkgdGhlIHVzZXIsIGN1cnJlbnRseSB1c2VkIG9ubHkgZm9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdC4gSWYgdGhlIHVzZXIgaGFzIG5vdCBzdWJtaXR0ZWQgdGhpcyBkYXRhIHlldCwgdGhpcyBmaWVsZCB3aWxsIGJlIGBudWxsYC4gT3RoZXJ3aXNlLCBib3RoIGZpZWxkcyBhcmUgZ3VhcmFudGVlZCB0byBiZSBmaWxsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJJRE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJRE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVmFsdWUgb2YgaWRlbnRpdHkgZG9jdW1lbnQgdmFsdWUgdHlwZWQgaW4gYnkgdXNlci4gQWxwaGEtbnVtZXJpYywgd2l0aCBhbGwgZm9ybWF0dGluZyBjaGFyYWN0ZXJzIHN0cmlwcGVkLiBGb3Igc3BlY2lmaWMgZm9ybWF0IHJlcXVpcmVtZW50cyBieSBJRCB0eXBlLCBzZWUgW0h5YnJpZCBJbnB1dCBWYWxpZGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5LXZlcmlmaWNhdGlvbi9oeWJyaWQtaW5wdXQtdmFsaWRhdGlvbi8pLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJJRE51bWJlclxuICAgICAqL1xuICAgIHZhbHVlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0lETnVtYmVyVHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgVXNlcklETnVtYmVyXG4gICAgICovXG4gICAgdHlwZTogSUROdW1iZXJUeXBlO1xufVxuLyoqXG4gKiBVc2VySXRlbXNHZXRSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvaXRlbXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlckl0ZW1zR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlckl0ZW1zR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlckl0ZW1zR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvaXRlbXMvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VySXRlbXNHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJJdGVtc0dldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8SXRlbT59XG4gICAgICogQG1lbWJlcm9mIFVzZXJJdGVtc0dldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXRlbXM6IEFycmF5PEl0ZW0+O1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VySXRlbXNHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGAgd2ViaG9vayBtYXkgYmUgZmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBJZiB0aGUgZW5kIHVzZXIgcmV2b2tlZCB0aGVpciBwZXJtaXNzaW9ucyB0aHJvdWdoIFBsYWlkIChzdWNoIGFzIHZpYSB0aGUgUGxhaWQgUG9ydGFsIG9yIGJ5IGNvbnRhY3RpbmcgUGxhaWQgU3VwcG9ydCksIHRoZSB3ZWJob29rIHdpbGwgZmlyZS4gSWYgdGhlIGVuZCB1c2VyIHJldm9rZWQgdGhlaXIgcGVybWlzc2lvbnMgZGlyZWN0bHkgdGhyb3VnaCB0aGUgaW5zdGl0dXRpb24sIHRoaXMgd2ViaG9vayBtYXkgbm90IGFsd2F5cyBmaXJlLCBzaW5jZSBzb21lIGluc3RpdHV0aW9uc+KAmSBjb25zZW50IHBvcnRhbHMgZG8gbm90IHRyaWdnZXIgdGhpcyB3ZWJob29rLiBVcG9uIHJlY2VpdmluZyB0aGlzIHdlYmhvb2ssIGl0IGlzIHJlY29tbWVuZGVkIHRvIGRlbGV0ZSBhbnkgc3RvcmVkIGRhdGEgZnJvbSBQbGFpZCBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uIFRvIHJlc3RvcmUgdGhlIEl0ZW0sIGl0IGNhbiBiZSBzZW50IHRocm91Z2ggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgIE5vdGUgdGhhdCB3aGVuIHdvcmtpbmcgd2l0aCB0b2tlbml6ZWQgYWNjb3VudCBudW1iZXJzIHdpdGggQXV0aCBvciBUcmFuc2ZlciwgdGhlIGFjY291bnQgbnVtYmVyIHByb3ZpZGVkIGJ5IFBsYWlkIHdpbGwgbm8gbG9uZ2VyIHdvcmsgZm9yIGNyZWF0aW5nIHRyYW5zZmVycyBvbmNlIHVzZXIgcGVybWlzc2lvbiBoYXMgYmVlbiByZXZva2VkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclBlcm1pc3Npb25SZXZva2VkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUGVybWlzc2lvblJldm9rZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBpdGVtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BsYWlkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFVzZXJQZXJtaXNzaW9uUmV2b2tlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBVc2VyUmVtb3ZlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIGRhdGEgaXMgYmVpbmcgcmVxdWVzdGVkIGZvci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyUmVtb3ZlUmVxdWVzdFxuICAgICAqL1xuICAgIHVzZXJfdG9rZW46IHN0cmluZztcbn1cbi8qKlxuICogVXNlclJlbW92ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC91c2VyL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclJlbW92ZVJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclJlbW92ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclJlbW92ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgaW5jb21lIGNhdGVnb3J5IGZvciBhIHNwZWNpZmllZCBpbmNvbWUgc291cmNlXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBVc2VyU3RhdGVkSW5jb21lU291cmNlQ2F0ZWdvcnkge1xuICAgIE90aGVyID0gJ09USEVSJyxcbiAgICBTYWxhcnkgPSAnU0FMQVJZJyxcbiAgICBVbmVtcGxveW1lbnQgPSAnVU5FTVBMT1lNRU5UJyxcbiAgICBDYXNoID0gJ0NBU0gnLFxuICAgIEdpZ0Vjb25vbXkgPSAnR0lHX0VDT05PTVknLFxuICAgIFJlbnRhbCA9ICdSRU5UQUwnLFxuICAgIENoaWxkU3VwcG9ydCA9ICdDSElMRF9TVVBQT1JUJyxcbiAgICBNaWxpdGFyeSA9ICdNSUxJVEFSWScsXG4gICAgUmV0aXJlbWVudCA9ICdSRVRJUkVNRU5UJyxcbiAgICBMb25nVGVybURpc2FiaWxpdHkgPSAnTE9OR19URVJNX0RJU0FCSUxJVFknLFxuICAgIEJhbmtJbnRlcmVzdCA9ICdCQU5LX0lOVEVSRVNUJ1xufVxuXG4vKipcbiAqIFRoZSBwYXkgZnJlcXVlbmN5IG9mIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VGcmVxdWVuY3kge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgV2Vla2x5ID0gJ1dFRUtMWScsXG4gICAgQml3ZWVrbHkgPSAnQklXRUVLTFknLFxuICAgIFNlbWlNb250aGx5ID0gJ1NFTUlfTU9OVEhMWScsXG4gICAgTW9udGhseSA9ICdNT05USExZJ1xufVxuXG4vKipcbiAqIFRoZSBwYXkgdHlwZSAtIGBHUk9TU2AsIGBORVRgLCBvciBgVU5LTk9XTmAgZm9yIGEgc3BlY2lmaWVkIGluY29tZSBzb3VyY2VcbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFVzZXJTdGF0ZWRJbmNvbWVTb3VyY2VQYXlUeXBlIHtcbiAgICBVbmtub3duID0gJ1VOS05PV04nLFxuICAgIEdyb3NzID0gJ0dST1NTJyxcbiAgICBOZXQgPSAnTkVUJ1xufVxuXG4vKipcbiAqIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IGRlZmluZXMgdGhlIHJlcXVlc3Qgc2NoZW1hIGZvciBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgZGF0YSBpcyBiZWluZyByZXF1ZXN0ZWQgZm9yLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgdXNlcl90b2tlbjogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBQbGFpZCBBUEkgYGNsaWVudF9pZGAgb2YgdGhlIHRoaXJkLXBhcnR5IGNsaWVudCB0aGUgdG9rZW4gd2lsbCBiZSBzaGFyZWQgd2l0aC4gVGhlIHRva2VuIHdpbGwgb25seSBiZSB2YWxpZCBmb3IgdGhlIHNwZWNpZmllZCBjbGllbnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9jbGllbnRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZXhwaXJhdGlvbiBkYXRlIGFuZCB0aW1lIGZvciB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKGBZWVlZLU1NLUREVGhoOm1tOnNzWmApLiBUaGUgZXhwaXJhdGlvbiBpcyByZXN0cmljdGVkIHRvIGEgbWF4aW11bSBvZiAyNCBob3VycyBmcm9tIHRoZSB0b2tlblxcJ3MgY3JlYXRpb24gdGltZS4gSWYgbm90IHByb3ZpZGVkLCB0aGUgdG9rZW4gd2lsbCBhdXRvbWF0aWNhbGx5IGV4cGlyZSBhZnRlciAyNCBob3Vycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGV4cGlyYXRpb25fdGltZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci90aGlyZF9wYXJ0eV90b2tlbi9jcmVhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBhc3NvY2lhdGVkIHdpdGggdGhlIHJlcXVlc3RlZCBVc2VyIGRhdGEuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC91c2VyL3RoaXJkX3BhcnR5X3Rva2VuL3JlbW92ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0ZWQgVXNlciBkYXRhLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0XG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfdXNlcl90b2tlbjogc3RyaW5nO1xufVxuLyoqXG4gKiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vcmVtb3ZlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIGB0cnVlYCBpZiB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlbW92ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVXNlclVwZGF0ZVJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlclVwZGF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIHRva2VuIGFzc29jaWF0ZWQgd2l0aCB0aGUgVXNlciBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmb3IuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVXNlclVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB1c2VyX3Rva2VuOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NvbnN1bWVyUmVwb3J0VXNlcklkZW50aXR5fVxuICAgICAqIEBtZW1iZXJvZiBVc2VyVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5OiBDb25zdW1lclJlcG9ydFVzZXJJZGVudGl0eSB8IG51bGw7XG59XG4vKipcbiAqIFVzZXJVcGRhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvdXNlci91cGRhdGVgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZXJVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFVzZXJVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWYWxpZGF0aW9uU291cmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZSB7XG4gICAgLyoqXG4gICAgICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VcbiAgICAgKi9cbiAgICBWYWxpZGF0aW9uU291cmNlTmFtZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVmFsaWRhdGlvblNvdXJjZVxuICAgICAqL1xuICAgIFZhbGlkYXRpb25Tb3VyY2VSZWZlcmVuY2VJZGVudGlmaWVyOiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZhbGlkYXRpb25Tb3VyY2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblNvdXJjZXMge1xuICAgIC8qKlxuICAgICAqIERvY3VtZW50YXRpb24gbm90IGZvdW5kIGluIHRoZSBNSVNNTyBtb2RlbCB2aWV3ZXIgYW5kIG5vdCBwcm92aWRlZCBieSBGcmVkZGllIE1hYy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8VmFsaWRhdGlvblNvdXJjZT59XG4gICAgICogQG1lbWJlcm9mIFZhbGlkYXRpb25Tb3VyY2VzXG4gICAgICovXG4gICAgVkFMSURBVElPTl9TT1VSQ0U6IEFycmF5PFZhbGlkYXRpb25Tb3VyY2U+O1xufVxuLyoqXG4gKiBGaXJlZCB3aGVuIGFuIEl0ZW0gd2FzIG5vdCB2ZXJpZmllZCB2aWEgYXV0b21hdGVkIG1pY3JvLWRlcG9zaXRzIGFmdGVyIHNldmVuIGRheXMgc2luY2UgdGhlIGF1dG9tYXRlZCBtaWNyby1kZXBvc2l0IHdhcyBtYWRlLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rIHtcbiAgICAvKipcbiAgICAgKiBgQVVUSGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIGBWRVJJRklDQVRJT05fRVhQSVJFRGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIHdlYmhvb2tfY29kZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBgaXRlbV9pZGAgb2YgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoaXMgd2ViaG9vaywgd2FybmluZywgb3IgZXJyb3JcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25FeHBpcmVkV2ViaG9va1xuICAgICAqL1xuICAgIGl0ZW1faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgYGFjY291bnRfaWRgIG9mIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2ViaG9va1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgYWNjb3VudF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXZWJob29rRW52aXJvbm1lbnRWYWx1ZXN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbkV4cGlyZWRXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UGxhaWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZpY2F0aW9uRXhwaXJlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlcnJvcj86IFBsYWlkRXJyb3IgfCBudWxsO1xufVxuLyoqXG4gKiBEb2N1bWVudGF0aW9uIG5vdCBmb3VuZCBpbiB0aGUgTUlTTU8gbW9kZWwgdmlld2VyIGFuZCBub3QgcHJvdmlkZWQgYnkgRnJlZGRpZSBNYWMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7UmVwb3J0aW5nSW5mb3JtYXRpb259XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBSRVBPUlRJTkdfSU5GT1JNQVRJT046IFJlcG9ydGluZ0luZm9ybWF0aW9uO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50fVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZmljYXRpb25PZkFzc2V0XG4gICAgICovXG4gICAgU0VSVklDRV9QUk9EVUNUX0ZVTEZJTExNRU5UOiBTZXJ2aWNlUHJvZHVjdEZ1bGZpbGxtZW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2V9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRcbiAgICAgKi9cbiAgICBWRVJJRklDQVRJT05fT0ZfQVNTRVRfUkVTUE9OU0U6IFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZTtcbn1cbi8qKlxuICogRG9jdW1lbnRhdGlvbiBub3QgZm91bmQgaW4gdGhlIE1JU01PIG1vZGVsIHZpZXdlciBhbmQgbm90IHByb3ZpZGVkIGJ5IEZyZWRkaWUgTWFjLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWZXJpZmljYXRpb25PZkFzc2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBc3NldHN9XG4gICAgICogQG1lbWJlcm9mIFZlcmlmaWNhdGlvbk9mQXNzZXRSZXNwb25zZVxuICAgICAqL1xuICAgIEFTU0VUUzogQXNzZXRzO1xufVxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHJlZnJlc2ggc3RhdHVzLiBPbmUgb2YgdGhlIGZvbGxvd2luZzogIGBcXFwiVkVSSUZJQ0FUSU9OX1JFRlJFU0hfU1RBVFVTX1VTRVJfUFJFU0VOQ0VfUkVRVUlSRURcXFwiYCBVc2VyIHByZXNlbmNlIGlzIHJlcXVpcmVkIHRvIHJlZnJlc2ggYW4gaW5jb21lIHZlcmlmaWNhdGlvbi4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9TVUNDRVNTRlVMXFxcImAgVGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaCB3YXMgc3VjY2Vzc2Z1bC4gYFxcXCJWRVJJRklDQVRJT05fUkVGUkVTSF9OT1RfRk9VTkRcXFwiYCBObyBuZXcgZGF0YSB3YXMgZm91bmQgYWZ0ZXIgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcmVmcmVzaC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFZlcmlmaWNhdGlvblJlZnJlc2hTdGF0dXMge1xuICAgIFN0YXR1c1VzZXJQcmVzZW5jZVJlcXVpcmVkID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NUQVRVU19VU0VSX1BSRVNFTkNFX1JFUVVJUkVEJyxcbiAgICBTdWNjZXNzZnVsID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX1NVQ0NFU1NGVUwnLFxuICAgIE5vdEZvdW5kID0gJ1ZFUklGSUNBVElPTl9SRUZSRVNIX05PVF9GT1VORCdcbn1cblxuLyoqXG4gKiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cy4gT25lIG9mIHRoZSBmb2xsb3dpbmc6ICBgXFxcIlZFUklGSUVEXFxcImA6IFRoZSBpbmZvcm1hdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHZlcmlmaWVkLiAgYFxcXCJVTlZFUklGSUVEXFxcImA6IFRoZSB2ZXJpZmljYXRpb24gaGFzIG5vdCB5ZXQgYmVlbiBwZXJmb3JtZWQuICBgXFxcIk5FRURTX0lORk9cXFwiYDogVGhlIHZlcmlmaWNhdGlvbiB3YXMgYXR0ZW1wdGVkIGJ1dCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBtaXNzaW5nIGluZm9ybWF0aW9uLiAgXFxcImBVTkFCTEVfVE9fVkVSSUZZYFxcXCI6IFRoZSB2ZXJpZmljYXRpb24gd2FzIHBlcmZvcm1lZCBhbmQgdGhlIGluZm9ybWF0aW9uIGNvdWxkIG5vdCBiZSB2ZXJpZmllZC4gIGBcXFwiVU5LTk9XTlxcXCJgOiBUaGUgdmVyaWZpY2F0aW9uIHN0YXR1cyBpcyB1bmtub3duLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZpY2F0aW9uU3RhdHVzIHtcbiAgICBWZXJpZmllZCA9ICdWRVJJRklFRCcsXG4gICAgVW52ZXJpZmllZCA9ICdVTlZFUklGSUVEJyxcbiAgICBOZWVkc0luZm8gPSAnTkVFRFNfSU5GTycsXG4gICAgVW5hYmxlVG9WZXJpZnkgPSAnVU5BQkxFX1RPX1ZFUklGWScsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIEFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIHRoZSBgdmVyaWZ5X3Ntc2Agc3RlcC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVmVyaWZ5U01TRGV0YWlsc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFZlcmlmeVNNU0RldGFpbHMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZnlTTVNEZXRhaWxzU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBWZXJpZnlTTVNEZXRhaWxzXG4gICAgICovXG4gICAgc3RhdHVzOiBWZXJpZnlTTVNEZXRhaWxzU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IHdoZXJlIGVhY2ggZW50cnkgcmVwcmVzZW50cyBhIHZlcmlmaWNhdGlvbiBhdHRlbXB0IGZvciB0aGUgYHZlcmlmeV9zbXNgIHN0ZXAuIEVhY2ggZW50cnkgcmVwcmVzZW50cyBvbmUgdXNlci1zdWJtaXR0ZWQgcGhvbmUgbnVtYmVyLiBQaG9uZSBudW1iZXIgZWRpdHMsIGFuZCBpbiBzb21lIGNhc2VzIGVycm9yIGhhbmRsaW5nIGR1ZSB0byBlZGdlIGNhc2VzIGxpa2UgcmF0ZSBsaW1pdGluZywgbWF5IGdlbmVyYXRlIGFkZGl0aW9uYWwgdmVyaWZpY2F0aW9ucy5cbiAgICAgKiBAdHlwZSB7QXJyYXk8U01TVmVyaWZpY2F0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgVmVyaWZ5U01TRGV0YWlsc1xuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbnM6IEFycmF5PFNNU1ZlcmlmaWNhdGlvbj47XG59XG4vKipcbiAqIFRoZSBvdXRjb21lIHN0YXR1cyBmb3IgdGhlIGFzc29jaWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGF0dGVtcHRcXCdzIGB2ZXJpZnlfc21zYCBzdGVwLiBUaGlzIGZpZWxkIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUgYXMgYHN0ZXBzLnZlcmlmeV9zbXNgLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gVmVyaWZ5U01TRGV0YWlsc1N0YXR1cyB7XG4gICAgU3VjY2VzcyA9ICdzdWNjZXNzJyxcbiAgICBGYWlsZWQgPSAnZmFpbGVkJ1xufVxuXG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXMiB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcj86IFBheXN0dWJFbXBsb3llcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW1wbG95ZWV9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGF4X3llYXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIGVtcGxveWVlIGlkZW50aWZpY2F0aW9uIG51bWJlciBvciBFSU4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBlbXBsb3llcl9pZF9udW1iZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGZyb20gdGlwcyBhbmQgb3RoZXIgY29tcGVuc2F0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIGZlZGVyYWxfaW5jb21lX3RheF93aXRoaGVsZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogV2FnZXMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfd2FnZXM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFNvY2lhbCBzZWN1cml0eSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV93YWdlc19hbmRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTWVkaWNhcmUgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBtZWRpY2FyZV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRpcHMgZnJvbSBzb2NpYWwgc2VjdXJpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBhbGxvY2F0ZWRfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQ29udGVudHMgZnJvbSBib3ggOSBvbiB0aGUgVzIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBib3hfOT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogRGVwZW5kZW50IGNhcmUgYmVuZWZpdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgbm9ucXVhbGlmaWVkX3BsYW5zPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJCb3gxMj59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMj47XG4gICAgLyoqXG4gICAgICogU3RhdHV0b3J5IGVtcGxveWVlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdHV0b3J5X2VtcGxveWVlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBSZXRpcmVtZW50IHBsYW4uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgdGhpcmRfcGFydHlfc2lja19wYXk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE90aGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgb3RoZXI/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlcz59XG4gICAgICogQG1lbWJlcm9mIFcyXG4gICAgICovXG4gICAgc3RhdGVfYW5kX2xvY2FsX3dhZ2VzPzogQXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXM+O1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyQm94MTIge1xuICAgIC8qKlxuICAgICAqIFcyIEJveCAxMiBjb2RlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJcbiAgICAgKi9cbiAgICBhbW91bnQ/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBEYXRhIG9uIHRoZSBXMiBCb3ggMTJcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJCb3gxMk92ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJCb3gxMk92ZXJyaWRlIHtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgY29kZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMkJveDEyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBjb2RlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXMiBCb3ggMTIgYW1vdW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyQm94MTJPdmVycmlkZVxuICAgICAqL1xuICAgIGFtb3VudD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIGlzIGFuIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgaW5jb21lIGRhdGEgdGFrZW4gZnJvbSBhIFcyIHRheCBkb2N1bWVudC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgVzJPdmVycmlkZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFcyT3ZlcnJpZGUge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXlzdHViT3ZlcnJpZGVFbXBsb3llcn1cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIGVtcGxveWVyPzogUGF5c3R1Yk92ZXJyaWRlRW1wbG95ZXI7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1BheXN0dWJPdmVycmlkZUVtcGxveWVlfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZWU/OiBQYXlzdHViT3ZlcnJpZGVFbXBsb3llZTtcbiAgICAvKipcbiAgICAgKiBUaGUgdGF4IHllYXIgb2YgdGhlIFcyIGRvY3VtZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0YXhfeWVhcj86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQW4gZW1wbG95ZXIgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9yIEVJTi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXJfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHRpcHMgYW5kIG90aGVyIGNvbXBlbnNhdGlvbi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgd2FnZXNfdGlwc19vdGhlcl9jb21wPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBGZWRlcmFsIGluY29tZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgZmVkZXJhbF9pbmNvbWVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBmcm9tIHNvY2lhbCBzZWN1cml0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgc29jaWFsX3NlY3VyaXR5X3dhZ2VzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTb2NpYWwgc2VjdXJpdHkgdGF4IHdpdGhoZWxkIGZvciB0aGUgdGF4IHllYXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIHNvY2lhbF9zZWN1cml0eV90YXhfd2l0aGhlbGQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gbWVkaWNhcmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIG1lZGljYXJlX3dhZ2VzX2FuZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBNZWRpY2FyZSB0YXggd2l0aGhlbGQgZm9yIHRoZSB0YXggeWVhci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgbWVkaWNhcmVfdGF4X3dpdGhoZWxkPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaXBzIGZyb20gc29jaWFsIHNlY3VyaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzb2NpYWxfc2VjdXJpdHlfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQWxsb2NhdGVkIHRpcHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIGFsbG9jYXRlZF90aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBDb250ZW50cyBmcm9tIGJveCA5IG9uIHRoZSBXMi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgYm94Xzk/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIERlcGVuZGVudCBjYXJlIGJlbmVmaXRzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBkZXBlbmRlbnRfY2FyZV9iZW5lZml0cz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTm9ucXVhbGlmaWVkIHBsYW5zLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBub25xdWFsaWZpZWRfcGxhbnM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtBcnJheTxXMkJveDEyT3ZlcnJpZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXMk92ZXJyaWRlXG4gICAgICovXG4gICAgYm94XzEyPzogQXJyYXk8VzJCb3gxMk92ZXJyaWRlPjtcbiAgICAvKipcbiAgICAgKiBTdGF0dXRvcnkgZW1wbG95ZWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIHN0YXR1dG9yeV9lbXBsb3llZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogUmV0aXJlbWVudCBwbGFuLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICByZXRpcmVtZW50X3BsYW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFRoaXJkIHBhcnR5IHNpY2sgcGF5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICB0aGlyZF9wYXJ0eV9zaWNrX3BheT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogT3RoZXIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJPdmVycmlkZVxuICAgICAqL1xuICAgIG90aGVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7QXJyYXk8VzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZT59XG4gICAgICogQG1lbWJlcm9mIFcyT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZV9hbmRfbG9jYWxfd2FnZXM/OiBBcnJheTxXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlPjtcbn1cbi8qKlxuICogVzIgc3RhdGUgYW5kIGxvY2FsIHdhZ2VzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXMge1xuICAgIC8qKlxuICAgICAqIFN0YXRlIGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FnZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBTdGF0ZSBpZGVudGlmaWNhdGlvbiBudW1iZXIgb2YgdGhlIGVtcGxveWVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNcbiAgICAgKi9cbiAgICBzdGF0ZV93YWdlc190aXBzPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBJbmNvbWUgdGF4IGZyb20gdGhlIHNwZWNpZmllZCBzdGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIHN0YXRlX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFdhZ2VzIGFuZCB0aXBzIGZyb20gdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc1xuICAgICAqL1xuICAgIGxvY2FsX2luY29tZV90YXg/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIE5hbWUgb2YgdGhlIGxvY2FsaXR5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzXG4gICAgICovXG4gICAgbG9jYWxpdHlfbmFtZT86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFcyIHN0YXRlIGFuZCBsb2NhbCB3YWdlc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZSB7XG4gICAgLyoqXG4gICAgICogU3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSB3YWdlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZT86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogU3RhdGUgaWRlbnRpZmljYXRpb24gbnVtYmVyIG9mIHRoZSBlbXBsb3llci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgZW1wbG95ZXJfc3RhdGVfaWRfbnVtYmVyPzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBzcGVjaWZpZWQgc3RhdGUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZVxuICAgICAqL1xuICAgIHN0YXRlX3dhZ2VzX3RpcHM/OiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEluY29tZSB0YXggZnJvbSB0aGUgc3BlY2lmaWVkIHN0YXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFcyU3RhdGVBbmRMb2NhbFdhZ2VzT3ZlcnJpZGVcbiAgICAgKi9cbiAgICBzdGF0ZV9pbmNvbWVfdGF4Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBXYWdlcyBhbmQgdGlwcyBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgbG9jYWxfd2FnZXNfdGlwcz86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogSW5jb21lIHRheCBmcm9tIHRoZSBsb2NhbGl0eS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXMlN0YXRlQW5kTG9jYWxXYWdlc092ZXJyaWRlXG4gICAgICovXG4gICAgbG9jYWxfaW5jb21lX3RheD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogTmFtZSBvZiB0aGUgbG9jYWxpdHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgVzJTdGF0ZUFuZExvY2FsV2FnZXNPdmVycmlkZVxuICAgICAqL1xuICAgIGxvY2FsaXR5X25hbWU/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXQge1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIGlkZW50aWZ5aW5nIHRoZSBlLXdhbGxldFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRCYWxhbmNlfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBudW1iZXJzOiBXYWxsZXROdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgcmVjaXBpZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGUtd2FsbGV0IGFjY291bnQgbnVtYmVyc1xuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFxuICAgICAqL1xuICAgIHJlY2lwaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbn1cbi8qKlxuICogQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZS13YWxsZXQgYmFsYW5jZVxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRCYWxhbmNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0QmFsYW5jZSB7XG4gICAgLyoqXG4gICAgICogVGhlIElTTy00MjE3IGN1cnJlbmN5IGNvZGUgb2YgdGhlIGJhbGFuY2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRCYWxhbmNlXG4gICAgICovXG4gICAgaXNvX2N1cnJlbmN5X2NvZGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50XG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0QmFsYW5jZVxuICAgICAqL1xuICAgIGN1cnJlbnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50IGFmdGVyIHN1YnRyYWN0aW5nIHBlbmRpbmcgZGViaXQgdHJhbnNhY3Rpb24gYW1vdW50c1xuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEJhbGFuY2VcbiAgICAgKi9cbiAgICBhdmFpbGFibGU6IG51bWJlcjtcbn1cbi8qKlxuICogV2FsbGV0Q3JlYXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvY3JlYXRlYFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRJU09DdXJyZW5jeUNvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xufVxuLyoqXG4gKiBXYWxsZXRDcmVhdGVSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2NyZWF0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdhbGxldEdldFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldEdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgSUQgb2YgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0R2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIGUtd2FsbGV0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0QmFsYW5jZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBiYWxhbmNlOiBXYWxsZXRCYWxhbmNlO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXROdW1iZXJzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIG51bWJlcnM6IFdhbGxldE51bWJlcnM7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWNpcGllbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZS13YWxsZXQgYWNjb3VudCBudW1iZXJzXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZWNpcGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFN0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIElTTy00MjE3IGN1cnJlbmN5IGNvZGUsIHVzZWQgd2l0aCBlLXdhbGxldHMgYW5kIHRyYW5zYWN0aW9ucy5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhbGxldElTT0N1cnJlbmN5Q29kZSB7XG4gICAgR2JwID0gJ0dCUCcsXG4gICAgRXVyID0gJ0VVUidcbn1cblxuLyoqXG4gKiBXYWxsZXRMaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZT86IFdhbGxldElTT0N1cnJlbmN5Q29kZTtcbiAgICAvKipcbiAgICAgKiBBIGJhc2U2NCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhdGVzdCBlLXdhbGxldCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkLiBTZXQgdGhpcyB0byBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvd2FsbGV0L2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gZS13YWxsZXRzIGNyZWF0ZWQgYmVmb3JlIHRoYXQgZS13YWxsZXQuIElmIG9taXR0ZWQsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gZS13YWxsZXRzIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIGUtd2FsbGV0cyB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY291bnQ/OiBudW1iZXI7XG59XG4vKipcbiAqIFdhbGxldExpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQW4gYXJyYXkgb2YgZS13YWxsZXRzXG4gICAgICogQHR5cGUge0FycmF5PFdhbGxldD59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhbGxldHM6IEFycmF5PFdhbGxldD47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIGUtd2FsbGV0cyBjcmVhdGVkIGJlZm9yZSB0aGUgbGF0ZXN0IGUtd2FsbGV0IHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBlLXdhbGxldCBhY2NvdW50IG51bWJlcnNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldE51bWJlcnMge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtSZWNpcGllbnRCQUNTfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXROdW1iZXJzXG4gICAgICovXG4gICAgYmFjcz86IFJlY2lwaWVudEJBQ1MgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtOdW1iZXJzSW50ZXJuYXRpb25hbElCQU59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldE51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogTnVtYmVyc0ludGVybmF0aW9uYWxJQkFOIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHBheW1lbnQgc2NoZW1lIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIHRyYW5zYWN0aW9uLiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBBWU9VVGAgYW5kIGBSRUZVTkRgLiAgYEZBU1RFUl9QQVlNRU5UU2A6IFRoZSBzdGFuZGFyZCBwYXltZW50IHNjaGVtZSB3aXRoaW4gdGhlIFVLLiAgYFNFUEFfQ1JFRElUX1RSQU5TRkVSYDogVGhlIHN0YW5kYXJkIHBheW1lbnQgdG8gYSBiZW5lZmljaWFyeSB3aXRoaW4gdGhlIFNFUEEgYXJlYS4gIGBTRVBBX0NSRURJVF9UUkFOU0ZFUl9JTlNUQU5UYDogSW5zdGFudCBwYXltZW50IHRvIGEgYmVuZWZpY2lhcnkgd2l0aGluIHRoZSBTRVBBIGFyZWEuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRQYXltZW50U2NoZW1lIHtcbiAgICBOdWxsID0gJ251bGwnLFxuICAgIEZhc3RlclBheW1lbnRzID0gJ0ZBU1RFUl9QQVlNRU5UUycsXG4gICAgU2VwYUNyZWRpdFRyYW5zZmVyID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSJyxcbiAgICBTZXBhQ3JlZGl0VHJhbnNmZXJJbnN0YW50ID0gJ1NFUEFfQ1JFRElUX1RSQU5TRkVSX0lOU1RBTlQnXG59XG5cbi8qKlxuICogVGhlIHN0YXR1cyBvZiB0aGUgd2FsbGV0LiAgYFVOS05PV05gOiBUaGUgd2FsbGV0IHN0YXR1cyBpcyB1bmtub3duLiAgYEFDVElWRWA6IFRoZSB3YWxsZXQgaXMgYWN0aXZlIGFuZCByZWFkeSB0byBzZW5kIG1vbmV5IHRvIGFuZCByZWNlaXZlIG1vbmV5IGZyb20uICBgQ0xPU0VEYDogVGhlIHdhbGxldCBpcyBjbG9zZWQuIEFueSB0cmFuc2FjdGlvbnMgbWFkZSB0byBvciBmcm9tIHRoaXMgd2FsbGV0IHdpbGwgZXJyb3IuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRTdGF0dXMge1xuICAgIFVua25vd24gPSAnVU5LTk9XTicsXG4gICAgQWN0aXZlID0gJ0FDVElWRScsXG4gICAgQ2xvc2VkID0gJ0NMT1NFRCdcbn1cblxuLyoqXG4gKiBUaGUgdHJhbnNhY3Rpb24gZGV0YWlsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIHdhbGxldCBpcyB1c2VkIGFzIGFuIGludGVybWVkaWFyeSBhY2NvdW50IHRvIGVuYWJsZSBQbGFpZCB0byByZWNvbmNpbGUgdGhlIHNldHRsZW1lbnQgb2YgZnVuZHMgZm9yIFBheW1lbnQgSW5pdGlhdGlvbiByZXF1ZXN0cy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHdhbGxldF9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlcyB0aGF0IGFyZSByZXR1cm5lZCBhcmU6IGBCQU5LX1RSQU5TRkVSOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggYW4gZXh0ZXJuYWwgYmFuayB0cmFuc2Zlci4gIGBQQVlPVVQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSBkaXNidXJzaW5nIGZ1bmRzIHRvIGEgY291bnRlcnBhcnR5LiAgYFBJU19QQVlfSU46YCBhIHBheW1lbnQgd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIFBsYWlkXFwncyBQYXltZW50IEluaXRpYXRpb24gU2VydmljZXMgKFBJUykgQVBJcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbUGF5bWVudCBJbml0aWF0aW9uIGVuZHBvaW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgUkVGVU5EOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgcmVmdW5kaW5nIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudCBtYWRlIHRocm91Z2ggUGxhaWRcXCdzIFtQSVMgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgRlVORFNfU1dFRVBgOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGZ1bmRzIGZyb20gYW4gZS13YWxsZXQgdG8gYSBkZXNpZ25hdGVkIGNsaWVudC1vd25lZCBhY2NvdW50LiAgYFJFVFVSTmA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGVyZSBhIGRlYml0IHRyYW5zYWN0aW9uIHdhcyByZXZlcnNlZCBhbmQgbW9uZXkgbW92ZWQgYmFjayB0byBvcmlnaW5hdGluZyBhY2NvdW50LiAgYFJFQ0FMTGA6IGEgdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHNlbmRpbmcgYmFuayBoYXMgcmVxdWVzdGVkIHRoZSByZXR1cm4gb2YgZnVuZHMgZHVlIHRvIGEgZnJhdWQgY2xhaW0sIHRlY2huaWNhbCBlcnJvciwgb3Igb3RoZXIgaXNzdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgdHlwZTogV2FsbGV0VHJhbnNhY3Rpb25UeXBlRW51bTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0UGF5bWVudFNjaGVtZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBzY2hlbWU/OiBXYWxsZXRQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgYW1vdW50OiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHl9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgY291bnRlcnBhcnR5OiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblxuICAgICAqL1xuICAgIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUgbGFzdCB0aW1lIHRoZSBgc3RhdHVzYCB3YXMgdXBkYXRlZCwgaW4gSVMwIDg2MDEgZm9ybWF0XG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBsYXN0X3N0YXR1c191cGRhdGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgcGF5bWVudCBpZCB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgaXMgcHJlc2VudCBvbmx5IGZvciB0cmFuc2FjdGlvbiB0eXBlcyBgUElTX1BBWV9JTmAgYW5kIGBSRUZVTkRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICBmYWlsdXJlX3JlYXNvbj86IFdhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbiB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIHdhbGxldCB0cmFuc2FjdGlvbnMgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LlxuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uPn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25cbiAgICAgKi9cbiAgICByZWxhdGVkX3RyYW5zYWN0aW9ucz86IEFycmF5PFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb24+O1xufVxuXG4vKipcbiAgICAqIEBleHBvcnRcbiAgICAqIEBlbnVtIHtzdHJpbmd9XG4gICAgKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJyxcbiAgICBSZWNhbGwgPSAnUkVDQUxMJ1xufVxuXG4vKipcbiAqIFRoZSBhbW91bnQgYW5kIGN1cnJlbmN5IG9mIGEgdHJhbnNhY3Rpb25cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldElTT0N1cnJlbmN5Q29kZX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25BbW91bnRcbiAgICAgKi9cbiAgICBpc29fY3VycmVuY3lfY29kZTogV2FsbGV0SVNPQ3VycmVuY3lDb2RlO1xuICAgIC8qKlxuICAgICAqIFRoZSBhbW91bnQgb2YgdGhlIHRyYW5zYWN0aW9uLiBNdXN0IGNvbnRhaW4gYXQgbW9zdCB0d28gZGlnaXRzIG9mIHByZWNpc2lvbiBlLmcuIGAxLjIzYC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkFtb3VudFxuICAgICAqL1xuICAgIHZhbHVlOiBudW1iZXI7XG59XG4vKipcbiAqIEFuIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGUtd2FsbGV0IHRyYW5zYWN0aW9uXFwncyBjb3VudGVycGFydHlcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eSB7XG4gICAgLyoqXG4gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvdW50ZXJwYXJ0eVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgbnVtYmVyczogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQYXltZW50SW5pdGlhdGlvbkFkZHJlc3N9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgYWRkcmVzcz86IFBheW1lbnRJbml0aWF0aW9uQWRkcmVzcyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIGNvdW50ZXJwYXJ0eVxcJ3MgYmlydGhkYXRlLCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSAoWVlZWS1NTS1ERCkgZm9ybWF0LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5XG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBhY2NvdW50IG51bWJlciBhbmQgc29ydCBjb2RlIG9mIHRoZSBjb3VudGVycGFydHlcXCdzIGFjY291bnRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYWNjb3VudCBudW1iZXIgb2YgdGhlIGFjY291bnQuIE1heGltdW0gb2YgMTAgY2hhcmFjdGVycy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUJBQ1NcbiAgICAgKi9cbiAgICBhY2NvdW50Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSA2LWNoYXJhY3RlciBzb3J0IGNvZGUgb2YgdGhlIGFjY291bnQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlCQUNTXG4gICAgICovXG4gICAgc29ydF9jb2RlPzogc3RyaW5nO1xufVxuLyoqXG4gKiBJbnRlcm5hdGlvbmFsIEJhbmsgQWNjb3VudCBOdW1iZXIgZm9yIGEgV2FsbGV0IFRyYW5zYWN0aW9uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5SW50ZXJuYXRpb25hbCB7XG4gICAgLyoqXG4gICAgICogSW50ZXJuYXRpb25hbCBCYW5rIEFjY291bnQgTnVtYmVyIChJQkFOKS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eUludGVybmF0aW9uYWxcbiAgICAgKi9cbiAgICBpYmFuPzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgY291bnRlcnBhcnR5XFwncyBiYW5rIGFjY291bnQgbnVtYmVycy4gRXhhY3RseSBvbmUgb2YgSUJBTiBvciBCQUNTIGRhdGEgaXMgcmVxdWlyZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVyc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5TnVtYmVycyB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDU31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlOdW1iZXJzXG4gICAgICovXG4gICAgYmFjcz86IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5QkFDUztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eU51bWJlcnNcbiAgICAgKi9cbiAgICBpbnRlcm5hdGlvbmFsPzogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHlJbnRlcm5hdGlvbmFsIHwgbnVsbDtcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJhbmRvbSBrZXkgcHJvdmlkZWQgYnkgdGhlIGNsaWVudCwgcGVyIHVuaXF1ZSB3YWxsZXQgdHJhbnNhY3Rpb24uIE1heGltdW0gb2YgMTI4IGNoYXJhY3RlcnMuICBUaGUgQVBJIHN1cHBvcnRzIGlkZW1wb3RlbmN5IGZvciBzYWZlbHkgcmV0cnlpbmcgcmVxdWVzdHMgd2l0aG91dCBhY2NpZGVudGFsbHkgcGVyZm9ybWluZyB0aGUgc2FtZSBvcGVyYXRpb24gdHdpY2UuIElmIGEgcmVxdWVzdCB0byBleGVjdXRlIGEgd2FsbGV0IHRyYW5zYWN0aW9uIGZhaWxzIGR1ZSB0byBhIG5ldHdvcmsgY29ubmVjdGlvbiBlcnJvciwgdGhlbiBhZnRlciBhIG1pbmltdW0gZGVsYXkgb2Ygb25lIG1pbnV0ZSwgeW91IGNhbiByZXRyeSB0aGUgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIGlkZW1wb3RlbmN5IGtleSB0byBndWFyYW50ZWUgdGhhdCBvbmx5IGEgc2luZ2xlIHdhbGxldCB0cmFuc2FjdGlvbiBpcyBjcmVhdGVkLiBJZiB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCwgaXQgd2lsbCBwcmV2ZW50IGFueSB0cmFuc2FjdGlvbiB0aGF0IHVzZXMgdGhlIHNhbWUgaWRlbXBvdGVuY3kga2V5LCBhbmQgd2FzIHJlY2VpdmVkIHdpdGhpbiAyNCBob3VycyBvZiB0aGUgZmlyc3QgcmVxdWVzdCwgZnJvbSBiZWluZyBwcm9jZXNzZWQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGlkZW1wb3RlbmN5X2tleTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBJRCBvZiB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHl9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudGVycGFydHk6IFdhbGxldFRyYW5zYWN0aW9uQ291bnRlcnBhcnR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkFtb3VudH1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFtb3VudDogV2FsbGV0VHJhbnNhY3Rpb25BbW91bnQ7XG4gICAgLyoqXG4gICAgICogQSByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVGhpcyBtdXN0IGJlIGFuIGFscGhhbnVtZXJpYyBzdHJpbmcgd2l0aCA2IHRvIDE4IGNoYXJhY3RlcnMgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW55IHNwZWNpYWwgY2hhcmFjdGVycyBvciBzcGFjZXMuIEVuc3VyZSB0aGF0IHRoZSBgcmVmZXJlbmNlYCBmaWVsZCBpcyB1bmlxdWUgZm9yIGVhY2ggdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtPcmlnaW5hdGluZ0Z1bmRTb3VyY2V9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBvcmlnaW5hdGluZ19mdW5kX3NvdXJjZT86IE9yaWdpbmF0aW5nRnVuZFNvdXJjZSB8IG51bGw7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlIGRlZmluZXMgdGhlIHJlc3BvbnNlIHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZXhlY3V0ZWBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgaWRlbnRpZnlpbmcgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICB0cmFuc2FjdGlvbl9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGVycm9yIGNvZGUgb2YgYSBmYWlsZWQgdHJhbnNhY3Rpb24uIEVycm9yIGNvZGVzIGluY2x1ZGU6IGBFWFRFUk5BTF9TWVNURU1gOiBUaGUgdHJhbnNhY3Rpb24gd2FzIGRlY2xpbmVkIGJ5IGFuIGV4dGVybmFsIHN5c3RlbS4gYEVYUElSRURgOiBUaGUgdHJhbnNhY3Rpb24gcmVxdWVzdCBoYXMgZXhwaXJlZC4gYENBTkNFTExFRGA6IFRoZSB0cmFuc2FjdGlvbiByZXF1ZXN0IHdhcyByZXNjaW5kZWQuIGBJTlZBTElEYDogVGhlIHRyYW5zYWN0aW9uIGRpZCBub3QgbWVldCBjZXJ0YWluIGNyaXRlcmlhLCBzdWNoIGFzIGFuIGluYWN0aXZlIGFjY291bnQgb3Igbm8gdmFsaWQgY291bnRlcnBhcnR5LCBldGMuIGBVTktOT1dOYDogVGhlIHRyYW5zYWN0aW9uIHdhcyB1bnN1Y2Nlc3NmdWwsIGJ1dCB0aGUgZXhhY3QgY2F1c2UgaXMgdW5rbm93bi5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbiB7XG4gICAgRXh0ZXJuYWxTeXN0ZW0gPSAnRVhURVJOQUxfU1lTVEVNJyxcbiAgICBFeHBpcmVkID0gJ0VYUElSRUQnLFxuICAgIENhbmNlbGxlZCA9ICdDQU5DRUxMRUQnLFxuICAgIEludmFsaWQgPSAnSU5WQUxJRCcsXG4gICAgVW5rbm93biA9ICdVTktOT1dOJ1xufVxuXG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSB0cmFuc2FjdGlvbiB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2UgZGVmaW5lcyB0aGUgcmVzcG9uc2Ugc2NoZW1hIGZvciBgL3dhbGxldC90cmFuc2FjdGlvbi9nZXRgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCBpZGVudGlmeWluZyB0aGUgdHJhbnNhY3Rpb25cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25faWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgRU1JIChFLU1vbmV5IEluc3RpdHV0aW9uKSB3YWxsZXQgdGhhdCB0aGlzIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuIFRoaXMgd2FsbGV0IGlzIHVzZWQgYXMgYW4gaW50ZXJtZWRpYXJ5IGFjY291bnQgdG8gZW5hYmxlIFBsYWlkIHRvIHJlY29uY2lsZSB0aGUgc2V0dGxlbWVudCBvZiBmdW5kcyBmb3IgUGF5bWVudCBJbml0aWF0aW9uIHJlcXVlc3RzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIHJlZmVyZW5jZSBmb3IgdGhlIHRyYW5zYWN0aW9uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlZmVyZW5jZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB0eXBlIG9mIHRoZSB0cmFuc2FjdGlvbi4gVGhlIHN1cHBvcnRlZCB0cmFuc2FjdGlvbiB0eXBlcyB0aGF0IGFyZSByZXR1cm5lZCBhcmU6IGBCQU5LX1RSQU5TRkVSOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBjcmVkaXRzIGFuIGUtd2FsbGV0IHRocm91Z2ggYW4gZXh0ZXJuYWwgYmFuayB0cmFuc2Zlci4gIGBQQVlPVVQ6YCBhIHRyYW5zYWN0aW9uIHdoaWNoIGRlYml0cyBhbiBlLXdhbGxldCBieSBkaXNidXJzaW5nIGZ1bmRzIHRvIGEgY291bnRlcnBhcnR5LiAgYFBJU19QQVlfSU46YCBhIHBheW1lbnQgd2hpY2ggY3JlZGl0cyBhbiBlLXdhbGxldCB0aHJvdWdoIFBsYWlkXFwncyBQYXltZW50IEluaXRpYXRpb24gU2VydmljZXMgKFBJUykgQVBJcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIHRoZSBbUGF5bWVudCBJbml0aWF0aW9uIGVuZHBvaW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgUkVGVU5EOmAgYSB0cmFuc2FjdGlvbiB3aGljaCBkZWJpdHMgYW4gZS13YWxsZXQgYnkgcmVmdW5kaW5nIGEgcHJldmlvdXNseSBpbml0aWF0ZWQgcGF5bWVudCBtYWRlIHRocm91Z2ggUGxhaWRcXCdzIFtQSVMgQVBJc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLykuICBgRlVORFNfU1dFRVBgOiBhbiBhdXRvbWF0ZWQgdHJhbnNhY3Rpb24gd2hpY2ggZGViaXRzIGZ1bmRzIGZyb20gYW4gZS13YWxsZXQgdG8gYSBkZXNpZ25hdGVkIGNsaWVudC1vd25lZCBhY2NvdW50LiAgYFJFVFVSTmA6IGFuIGF1dG9tYXRlZCB0cmFuc2FjdGlvbiB3aGVyZSBhIGRlYml0IHRyYW5zYWN0aW9uIHdhcyByZXZlcnNlZCBhbmQgbW9uZXkgbW92ZWQgYmFjayB0byBvcmlnaW5hdGluZyBhY2NvdW50LiAgYFJFQ0FMTGA6IGEgdHJhbnNhY3Rpb24gd2hlcmUgdGhlIHNlbmRpbmcgYmFuayBoYXMgcmVxdWVzdGVkIHRoZSByZXR1cm4gb2YgZnVuZHMgZHVlIHRvIGEgZnJhdWQgY2xhaW0sIHRlY2huaWNhbCBlcnJvciwgb3Igb3RoZXIgaXNzdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwYXltZW50LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB0eXBlOiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFBheW1lbnRTY2hlbWV9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzY2hlbWU/OiBXYWxsZXRQYXltZW50U2NoZW1lIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25BbW91bnR9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhbW91bnQ6IFdhbGxldFRyYW5zYWN0aW9uQW1vdW50O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvbkNvdW50ZXJwYXJ0eX1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGNvdW50ZXJwYXJ0eTogV2FsbGV0VHJhbnNhY3Rpb25Db3VudGVycGFydHk7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgd2hlbiB0aGUgdHJhbnNhY3Rpb24gd2FzIGNyZWF0ZWQsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBkYXRlIGFuZCB0aW1lIG9mIHRoZSBsYXN0IHRpbWUgdGhlIGBzdGF0dXNgIHdhcyB1cGRhdGVkLCBpbiBJUzAgODYwMSBmb3JtYXRcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbGFzdF9zdGF0dXNfdXBkYXRlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHBheW1lbnQgaWQgdGhhdCB0aGlzIHRyYW5zYWN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCwgaWYgYW55LiBUaGlzIGlzIHByZXNlbnQgb25seSBmb3IgdHJhbnNhY3Rpb24gdHlwZXMgYFBJU19QQVlfSU5gIGFuZCBgUkVGVU5EYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uRmFpbHVyZVJlYXNvbn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGZhaWx1cmVfcmVhc29uPzogV2FsbGV0VHJhbnNhY3Rpb25GYWlsdXJlUmVhc29uIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIGxpc3Qgb2Ygd2FsbGV0IHRyYW5zYWN0aW9ucyB0aGF0IHRoaXMgdHJhbnNhY3Rpb24gaXMgYXNzb2NpYXRlZCB3aXRoLCBpZiBhbnkuXG4gICAgICogQHR5cGUge0FycmF5PFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb24+fVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVsYXRlZF90cmFuc2FjdGlvbnM/OiBBcnJheTxXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uPjtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvbkdldFJlc3BvbnNlVHlwZUVudW0ge1xuICAgIEJhbmtUcmFuc2ZlciA9ICdCQU5LX1RSQU5TRkVSJyxcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBQaXNQYXlJbiA9ICdQSVNfUEFZX0lOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJyxcbiAgICBSZWNhbGwgPSAnUkVDQUxMJ1xufVxuXG4vKipcbiAqIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgZGVmaW5lcyB0aGUgcmVxdWVzdCBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBlLXdhbGxldCB0byBmZXRjaCB0cmFuc2FjdGlvbnMgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YWxsZXRfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGJhc2U2NCB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGxhdGVzdCB0cmFuc2FjdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkLiBTZXQgdGhpcyB0byBgbmV4dF9jdXJzb3JgIHJlY2VpdmVkIGZyb20gdGhlIHByZXZpb3VzIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgIHJlcXVlc3QuIElmIHByb3ZpZGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBvbmx5IGNvbnRhaW4gdHJhbnNhY3Rpb25zIGNyZWF0ZWQgYmVmb3JlIHRoYXQgdHJhbnNhY3Rpb24uIElmIG9taXR0ZWQsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gdHJhbnNhY3Rpb25zIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3QgcmVjZW50LCBhbmQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyB0byBmZXRjaFxuICAgICAqIEB0eXBlIHtudW1iZXJ9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBvcHRpb25zPzogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnMgfCBudWxsO1xufVxuLyoqXG4gKiBBZGRpdGlvbmFsIHdhbGxldCB0cmFuc2FjdGlvbiBvcHRpb25zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIFRpbWVzdGFtcCBpbiBbSVNPIDg2MDFdKGh0dHBzOi8vd2lraXBlZGlhLm9yZy93aWtpL0lTT184NjAxKSBmb3JtYXQgKFlZWVktTU0tRERUaGg6bW06c3NaKSBmb3IgZmlsdGVyaW5nIHRyYW5zYWN0aW9ucywgaW5jbHVzaXZlIG9mIHRoZSBwcm92aWRlZCBkYXRlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zXG4gICAgICovXG4gICAgc3RhcnRfdGltZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaW1lc3RhbXAgaW4gW0lTTyA4NjAxXShodHRwczovL3dpa2lwZWRpYS5vcmcvd2lraS9JU09fODYwMSkgZm9ybWF0IChZWVlZLU1NLUREVGhoOm1tOnNzWikgZm9yIGZpbHRlcmluZyB0cmFuc2FjdGlvbnMsIGluY2x1c2l2ZSBvZiB0aGUgcHJvdmlkZWQgZGF0ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0T3B0aW9uc1xuICAgICAqL1xuICAgIGVuZF90aW1lPzogc3RyaW5nO1xufVxuLyoqXG4gKiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIEFuIGFycmF5IG9mIHRyYW5zYWN0aW9ucyBvZiBhbiBlLXdhbGxldCwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBgd2FsbGV0X2lkYFxuICAgICAqIEB0eXBlIHtBcnJheTxXYWxsZXRUcmFuc2FjdGlvbj59XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgdHJhbnNhY3Rpb25zOiBBcnJheTxXYWxsZXRUcmFuc2FjdGlvbj47XG4gICAgLyoqXG4gICAgICogQ3Vyc29yIHVzZWQgZm9yIGZldGNoaW5nIHRyYW5zYWN0aW9ucyBjcmVhdGVkIGJlZm9yZSB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9uIHByb3ZpZGVkIGluIHRoaXMgcmVzcG9uc2VcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogVHJhbnNhY3Rpb25zIGFyZSByZWxhdGVkIHdoZW4gdGhleSBoYXZlIGEgbG9naWNhbCBjb25uZWN0aW9uLiAgRm9yIGV4YW1wbGUsIGEgYFBBWU9VVGAgdHJhbnNhY3Rpb24gY2FuIGJlIHJldHVybmVkIGJ5IHRoZSBzZW5kZXIsIGNyZWF0aW5nIGEgYFJFVFVSTmAgdHJhbnNhY3Rpb24uIEVhY2ggYFBBWU9VVGAgdHJhbnNhY3Rpb24gY2FuIGhhdmUgYXQgbW9zdCBvbmUgY29ycmVzcG9uZGluZyBgUkVUVVJOYCB0cmFuc2FjdGlvbiBpbiBjYXNlIG9mIHJldmVyc2FsLiAgVGhlc2UgcmVsYXRpb25zaGlwcyBhcmUgYmktZGlyZWN0aW9uYWwsIG1lYW5pbmcgdGhhdCBib3RoIGVudGl0aWVzIGhhdmUgcmVmZXJlbmNlcyB0byBlYWNoIG90aGVyLiBGb3IgaW5zdGFuY2UsIHdoZW4gYSB0cmFuc2FjdGlvbiBvZiB0eXBlIFJFVFVSTiBvY2N1cnMsIGl0IGlzIGxpbmtlZCB0byB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24gYmVpbmcgcmV0dXJuZWQuIExpa2V3aXNlLCB0aGUgb3JpZ2luYWwgdHJhbnNhY3Rpb24gaGFzIGEgcmVmZXJlbmNlIGJhY2sgdG8gdGhlIFJFVFVSTiB0cmFuc2FjdGlvbiB0aGF0IHJlcHJlc2VudHMgdGhlIHJldHVybi4gICBUaGlzIGZpZWxkIGlzIG9ubHkgcG9wdWxhdGVkIGZvciB0cmFuc2FjdGlvbnMgb2YgdHlwZSBgUkVUVVJOYCwgYEZVTkRTX1NXRUVQYCwgYFJFRlVORGAgYW5kIGBQQVlPVVRgLiAgVGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgYFBJU19QQVlfSU5gIHBheW1lbnQgYW5kIGl0cyBjb3JyZXNwb25kaW5nIGBSRUZVTkRgIHRyYW5zYWN0aW9ucyBpcyBvbmx5IGF2YWlsYWJsZSB0aHJvdWdoIGByZWZ1bmRfaWRzYCBwcm9wZXJ0eSBpbiB0aGUgcGF5bWVudCBvYmplY3QuIFNlZVtgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtZ2V0LXJlc3BvbnNlLXJlZnVuZC1pZHMpLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvbiB7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSByZWxhdGVkIHRyYW5zYWN0aW9uLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uUmVsYXRpb25cbiAgICAgKi9cbiAgICBpZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgdHlwZSBvZiB0aGUgdHJhbnNhY3Rpb24uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvblxuICAgICAqL1xuICAgIHR5cGU/OiBXYWxsZXRUcmFuc2FjdGlvblJlbGF0aW9uVHlwZUVudW07XG59XG5cbi8qKlxuICAgICogQGV4cG9ydFxuICAgICogQGVudW0ge3N0cmluZ31cbiAgICAqL1xuZXhwb3J0IGVudW0gV2FsbGV0VHJhbnNhY3Rpb25SZWxhdGlvblR5cGVFbnVtIHtcbiAgICBQYXlvdXQgPSAnUEFZT1VUJyxcbiAgICBSZXR1cm4gPSAnUkVUVVJOJyxcbiAgICBSZWZ1bmQgPSAnUkVGVU5EJyxcbiAgICBGdW5kc1N3ZWVwID0gJ0ZVTkRTX1NXRUVQJ1xufVxuXG4vKipcbiAqIFRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zYWN0aW9uLiAgYEFVVEhPUklTSU5HYDogVGhlIHRyYW5zYWN0aW9uIGlzIGJlaW5nIHByb2Nlc3NlZCBmb3IgdmFsaWRhdGlvbiBhbmQgY29tcGxpYW5jZS4gIGBJTklUSUFURURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gaW5pdGlhdGVkIGFuZCBpcyBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLiAgYEVYRUNVVEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBleGVjdXRlZCBhbmQgaXMgY29uc2lkZXJlZCBjb21wbGV0ZS4gVGhpcyBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIGRlYml0IHRyYW5zYWN0aW9ucy4gIGBTRVRUTEVEYDogVGhlIHRyYW5zYWN0aW9uIGhhcyBzZXR0bGVkIGFuZCBmdW5kcyBhcmUgYXZhaWxhYmxlIGZvciB1c2UuIFRoaXMgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjcmVkaXQgdHJhbnNhY3Rpb25zLiBBIHRyYW5zYWN0aW9uIHdpbGwgdHlwaWNhbGx5IHNldHRsZSB3aXRoaW4gc2Vjb25kcyB0byBzZXZlcmFsIGRheXMsIGRlcGVuZGluZyBvbiB3aGljaCBwYXltZW50IHJhaWwgaXMgdXNlZC4gIGBGQUlMRURgOiBUaGUgdHJhbnNhY3Rpb24gZmFpbGVkIHRvIHByb2Nlc3Mgc3VjY2Vzc2Z1bGx5LiBUaGlzIGlzIGEgdGVybWluYWwgc3RhdHVzLiAgYEJMT0NLRURgOiBUaGUgdHJhbnNhY3Rpb24gaGFzIGJlZW4gYmxvY2tlZCBmb3IgdmlvbGF0aW5nIGNvbXBsaWFuY2UgcnVsZXMuIFRoaXMgaXMgYSB0ZXJtaW5hbCBzdGF0dXMuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cyB7XG4gICAgQXV0aG9yaXNpbmcgPSAnQVVUSE9SSVNJTkcnLFxuICAgIEluaXRpYXRlZCA9ICdJTklUSUFURUQnLFxuICAgIEV4ZWN1dGVkID0gJ0VYRUNVVEVEJyxcbiAgICBTZXR0bGVkID0gJ1NFVFRMRUQnLFxuICAgIEJsb2NrZWQgPSAnQkxPQ0tFRCcsXG4gICAgRmFpbGVkID0gJ0ZBSUxFRCdcbn1cblxuLyoqXG4gKiBGaXJlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSB3YWxsZXQgdHJhbnNhY3Rpb24gaGFzIGNoYW5nZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYFdBTExFVGBcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0FMTEVUX1RSQU5TQUNUSU9OX1NUQVRVU19VUERBVEVgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGB0cmFuc2FjdGlvbl9pZGAgZm9yIHRoZSB3YWxsZXQgdHJhbnNhY3Rpb24gYmVpbmcgdXBkYXRlZFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uU3RhdHVzVXBkYXRlV2ViaG9va1xuICAgICAqL1xuICAgIHRyYW5zYWN0aW9uX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBwYXltZW50X2lkYCBhc3NvY2lhdGVkIHdpdGggdGhlIHRyYW5zYWN0aW9uLiBUaGlzIHdpbGwgYmUgcHJlc2VudCBpbiBjYXNlIG9mIGBSRUZVTkRgIGFuZCBgUElTX1BBWV9JTmAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgcGF5bWVudF9pZD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIEVNSSAoRS1Nb25leSBJbnN0aXR1dGlvbikgd2FsbGV0IHRoYXQgdGhpcyBwYXltZW50IGlzIGFzc29jaWF0ZWQgd2l0aC4gVGhpcyB3YWxsZXQgaXMgdXNlZCBhcyBhbiBpbnRlcm1lZGlhcnkgYWNjb3VudCB0byBlbmFibGUgUGxhaWQgdG8gcmVjb25jaWxlIHRoZSBzZXR0bGVtZW50IG9mIGZ1bmRzIGZvciBQYXltZW50IEluaXRpYXRpb24gcmVxdWVzdHMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgd2FsbGV0X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYWxsZXRUcmFuc2FjdGlvblN0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgbmV3X3N0YXR1czogV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXM7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhbGxldFRyYW5zYWN0aW9uU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1c1VwZGF0ZVdlYmhvb2tcbiAgICAgKi9cbiAgICBvbGRfc3RhdHVzOiBXYWxsZXRUcmFuc2FjdGlvblN0YXR1cztcbiAgICAvKipcbiAgICAgKiBUaGUgdGltZXN0YW1wIG9mIHRoZSB1cGRhdGUsIGluIFtJU08gODYwMV0oaHR0cHM6Ly93aWtpcGVkaWEub3JnL3dpa2kvSVNPXzg2MDEpIGZvcm1hdCwgZS5nLiBgXFxcIjIwMTctMDktMTRUMTQ6NDI6MTkuMzUwWlxcXCJgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25TdGF0dXNVcGRhdGVXZWJob29rXG4gICAgICovXG4gICAgZW52aXJvbm1lbnQ6IFdlYmhvb2tFbnZpcm9ubWVudFZhbHVlcztcbn1cbi8qKlxuICogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93YWxsZXQvdHJhbnNhY3Rpb24vbGlzdGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWxsZXRUcmFuc2FjdGlvbnNMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIElEIG9mIHRoZSBlLXdhbGxldCB0byBmZXRjaCB0cmFuc2FjdGlvbnMgZnJvbVxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2FsbGV0X2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBiYXNlNjQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb24gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlcXVlc3RlZC4gU2V0IHRoaXMgdG8gYG5leHRfY3Vyc29yYCByZWNlaXZlZCBmcm9tIHRoZSBwcmV2aW91cyBgL3dhbGxldC90cmFuc2FjdGlvbi9saXN0YCByZXF1ZXN0LiBJZiBwcm92aWRlZCwgdGhlIHJlc3BvbnNlIHdpbGwgb25seSBjb250YWluIHRyYW5zYWN0aW9ucyBjcmVhdGVkIGJlZm9yZSB0aGF0IHRyYW5zYWN0aW9uLiBJZiBvbWl0dGVkLCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIHRyYW5zYWN0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBtb3N0IHJlY2VudCwgYW5kIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIHRvIGZldGNoXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2FsbGV0VHJhbnNhY3Rpb25zTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjb3VudD86IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdE9wdGlvbnN9XG4gICAgICogQG1lbWJlcm9mIFdhbGxldFRyYW5zYWN0aW9uc0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgb3B0aW9ucz86IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3RPcHRpb25zIHwgbnVsbDtcbn1cbi8qKlxuICogSXQgaXMgcG9zc2libGUgZm9yIGFuIEFzc2V0IFJlcG9ydCB0byBiZSByZXR1cm5lZCB3aXRoIG1pc3NpbmcgYWNjb3VudCBvd25lciBpbmZvcm1hdGlvbi4gSW4gc3VjaCBjYXNlcywgdGhlIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gd2FybmluZyBkYXRhIGluIHRoZSByZXNwb25zZSwgaW5kaWNhdGluZyB3aHkgb2J0YWluaW5nIHRoZSBvd25lciBpbmZvcm1hdGlvbiBmYWlsZWQuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhcm5pbmdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXJuaW5nIHtcbiAgICAvKipcbiAgICAgKiBUaGUgd2FybmluZyB0eXBlLCB3aGljaCB3aWxsIGFsd2F5cyBiZSBgQVNTRVRfUkVQT1JUX1dBUk5JTkdgXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2FybmluZ1xuICAgICAqL1xuICAgIHdhcm5pbmdfdHlwZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSB3YXJuaW5nIGNvZGUgaWRlbnRpZmllcyBhIHNwZWNpZmljIGtpbmQgb2Ygd2FybmluZy4gYE9XTkVSU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgYWNjb3VudC1vd25lciBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLmBJTlZFU1RNRU5UU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgSW52ZXN0bWVudHMgc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gYFRSQU5TQUNUSU9OU19VTkFWQUlMQUJMRWAgaW5kaWNhdGVzIHRoYXQgdHJhbnNhY3Rpb25zIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBDcmVkaXQgYW5kIERlcG9zaXRvcnkgYWNjb3VudHMgYXJlIHVuYXZhaWxhYmxlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhcm5pbmdcbiAgICAgKi9cbiAgICB3YXJuaW5nX2NvZGU6IFdhcm5pbmdXYXJuaW5nQ29kZUVudW07XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0NhdXNlfVxuICAgICAqIEBtZW1iZXJvZiBXYXJuaW5nXG4gICAgICovXG4gICAgY2F1c2U6IENhdXNlIHwgbnVsbDtcbn1cblxuLyoqXG4gICAgKiBAZXhwb3J0XG4gICAgKiBAZW51bSB7c3RyaW5nfVxuICAgICovXG5leHBvcnQgZW51bSBXYXJuaW5nV2FybmluZ0NvZGVFbnVtIHtcbiAgICBPd25lcnNVbmF2YWlsYWJsZSA9ICdPV05FUlNfVU5BVkFJTEFCTEUnLFxuICAgIEludmVzdG1lbnRzVW5hdmFpbGFibGUgPSAnSU5WRVNUTUVOVFNfVU5BVkFJTEFCTEUnLFxuICAgIFRyYW5zYWN0aW9uc1VuYXZhaWxhYmxlID0gJ1RSQU5TQUNUSU9OU19VTkFWQUlMQUJMRSdcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbGFzdCBjaGFuZ2UgbWFkZSB0byB0aGUgcGFyZW50IG9iamVjdCBzcGVjaWZ5aW5nIHdoYXQgY2F1c2VkIHRoZSBjaGFuZ2UgYXMgd2VsbCBhcyB3aGVuIGl0IG9jY3VycmVkLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1NvdXJjZX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIHNvdXJjZTogU291cmNlO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbFxuICAgICAqL1xuICAgIGRhc2hib2FyZF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsXG4gICAgICovXG4gICAgdGltZXN0YW1wOiBzdHJpbmc7XG59XG4vKipcbiAqIEFuIG9mZmljaWFsIGRvY3VtZW50LCB1c3VhbGx5IGlzc3VlZCBieSBhIGdvdmVybmluZyBib2R5IG9yIGluc3RpdHV0aW9uLCB3aXRoIGFuIGFzc29jaWF0ZWQgaWRlbnRpZmllci5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudCB7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0RvY3VtZW50VHlwZX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRcbiAgICAgKi9cbiAgICB0eXBlOiBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFR5cGU7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdEb2N1bWVudFxuICAgICAqL1xuICAgIG51bWJlcjogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUga2luZCBvZiBvZmZpY2lhbCBkb2N1bWVudCByZXByZXNlbnRlZCBieSB0aGlzIG9iamVjdC4gIGBiaXJ0aF9jZXJ0aWZpY2F0ZWAgLSBBIGNlcnRpZmljYXRlIG9mIGJpcnRoICBgZHJpdmVyc19saWNlbnNlYCAtIEEgbGljZW5zZSB0byBvcGVyYXRlIGEgbW90b3IgdmVoaWNsZSAgYGltbWlncmF0aW9uX251bWJlcmAgLSBJbW1pZ3JhdGlvbiBvciByZXNpZGVuY2UgZG9jdW1lbnRzICBgbWlsaXRhcnlfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGJ5IGEgbWlsaXRhcnkgZ3JvdXAgIGBvdGhlcmAgLSBBbnkgZG9jdW1lbnQgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHBhc3Nwb3J0YCAtIEFuIG9mZmljaWFsIHBhc3Nwb3J0IGlzc3VlIGJ5IGEgZ292ZXJubWVudCAgYHBlcnNvbmFsX2lkZW50aWZpY2F0aW9uYCAtIEFueSBnZW5lcmljIHBlcnNvbmFsIGlkZW50aWZpY2F0aW9uIHRoYXQgaXMgbm90IGNvdmVyZWQgYnkgb3RoZXIgY2F0ZWdvcmllcyAgYHJhdGlvbl9jYXJkYCAtIElkZW50aWZpY2F0aW9uIHRoYXQgZW50aXRsZXMgdGhlIGhvbGRlciB0byByYXRpb25zICBgc3NuYCAtIFVuaXRlZCBTdGF0ZXMgU29jaWFsIFNlY3VyaXR5IE51bWJlciAgYHN0dWRlbnRfaWRgIC0gSWRlbnRpZmljYXRpb24gaXNzdWVkIGJ5IGFuIGVkdWNhdGlvbmFsIGluc3RpdHV0aW9uICBgdGF4X2lkYCAtIElkZW50aWZpY2F0aW9uIGlzc3VlZCBmb3IgdGhlIHB1cnBvc2Ugb2YgY29sbGVjdGluZyB0YXhlcyAgYHRyYXZlbF9kb2N1bWVudGAgLSBWaXNhcywgZW50cnkgcGVybWl0cywgcmVmdWdlZSBkb2N1bWVudHMsIGV0Yy4gIGB2b3Rlcl9pZGAgLSBJZGVudGlmaWNhdGlvbiBpc3N1ZWQgZm9yIHRoZSBwdXJwb3NlIG9mIHZvdGluZ1xuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nRG9jdW1lbnRUeXBlIHtcbiAgICBCaXJ0aENlcnRpZmljYXRlID0gJ2JpcnRoX2NlcnRpZmljYXRlJyxcbiAgICBEcml2ZXJzTGljZW5zZSA9ICdkcml2ZXJzX2xpY2Vuc2UnLFxuICAgIEltbWlncmF0aW9uTnVtYmVyID0gJ2ltbWlncmF0aW9uX251bWJlcicsXG4gICAgTWlsaXRhcnlJZCA9ICdtaWxpdGFyeV9pZCcsXG4gICAgT3RoZXIgPSAnb3RoZXInLFxuICAgIFBhc3Nwb3J0ID0gJ3Bhc3Nwb3J0JyxcbiAgICBQZXJzb25hbElkZW50aWZpY2F0aW9uID0gJ3BlcnNvbmFsX2lkZW50aWZpY2F0aW9uJyxcbiAgICBSYXRpb25DYXJkID0gJ3JhdGlvbl9jYXJkJyxcbiAgICBTc24gPSAnc3NuJyxcbiAgICBTdHVkZW50SWQgPSAnc3R1ZGVudF9pZCcsXG4gICAgVGF4SWQgPSAndGF4X2lkJyxcbiAgICBUcmF2ZWxEb2N1bWVudCA9ICd0cmF2ZWxfZG9jdW1lbnQnLFxuICAgIFZvdGVySWQgPSAndm90ZXJfaWQnXG59XG5cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYW4gZW50aXR5IHNjcmVlbmluZyByZXZpZXdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xufVxuLyoqXG4gKiBUaGUgZW50aXR5IHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYW4gZW50aXR5IGluIHlvdXIgc3lzdGVtLCB1cGRhdGUgaXRzIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIGl0IG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgZW50aXR5IHNjcmVlbmluZ3Mgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBlbnRpdHkgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc2VhcmNoX3Rlcm1zOiBFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtcztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCB1c2VyLiBUbyByZXRyaWV2ZSB0aGUgZW1haWwgYWRkcmVzcyBvciBvdGhlciBkZXRhaWxzIG9mIHRoZSBwZXJzb24gY29ycmVzcG9uZGluZyB0byB0aGlzIGlkLCB1c2UgYC9kYXNoYm9hcmRfdXNlci9nZXRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzdGF0dXM6IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWx9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIFRoZSBlbnRpdHkgc2NyZWVuaW5nIG9iamVjdCBhbGxvd3MgeW91IHRvIHJlcHJlc2VudCBhbiBlbnRpdHkgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSBpdHMgcHJvZmlsZSwgYW5kIHNlYXJjaCBmb3IgaXQgb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBlbnRpdHkgc2NyZWVuaW5ncyB3aWxsIG5vdCByZWNlaXZlIG5ldyBoaXRzLCByZWdhcmRsZXNzIG9mIGVudGl0eSBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhc3NpZ25lZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgY2hhbmdlcyB0byBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ3M6IEFycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBoaXRzIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBoaXRzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBoaXRzXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdD59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2hpdHM6IEFycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZ0hpdD47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc3RhdHVzPzogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFNjcmVlbmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0XG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgZW50aXRpZXMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlzX3Jlc2Nhbm5pbmdfZW5hYmxlZDogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXYXRjaGxpc3RzIGVuYWJsZWQgZm9yIHRoZSBhc3NvY2lhdGVkIHByb2dyYW1cbiAgICAgKiBAdHlwZSB7U2V0PEVudGl0eVdhdGNobGlzdENvZGU+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8RW50aXR5V2F0Y2hsaXN0Q29kZT47XG4gICAgLyoqXG4gICAgICogQSBuYW1lIGZvciB0aGUgZW50aXR5IHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBPcmdhbml6YXRpb25zXFxcIiBvciBcXFwiQXBwbGljYW50c1xcXCIuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuYW1lX3NlbnNpdGl2aXR5OiBQcm9ncmFtTmFtZVNlbnNpdGl2aXR5O1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBcmNoaXZlZCBwcm9ncmFtcyBhcmUgcmVhZC1vbmx5IGFuZCBjYW5ub3Qgc2NyZWVuIG5ldyBjdXN0b21lcnMgbm9yIHBhcnRpY2lwYXRlIGluIG9uZ29pbmcgbW9uaXRvcmluZy5cbiAgICAgKiBAdHlwZSB7Ym9vbGVhbn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHR5cGUge0FycmF5PEVudGl0eVdhdGNobGlzdFByb2dyYW0+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgZW50aXR5X3dhdGNobGlzdF9wcm9ncmFtczogQXJyYXk8RW50aXR5V2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgY3JlYXRpbmcgYSByZXZpZXcgZm9yIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIHRydWUgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuIEluIG1vc3QgY2FzZXMsIGNvbmZpcm1lZCBoaXRzIGluZGljYXRlIHRoYXQgdGhlIGN1c3RvbWVyIHNob3VsZCBiZSByZWplY3RlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgZGlzbWlzc2VkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogQSBjb21tZW50IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGFzIHBhcnQgb2YgcmV2aWV3aW5nIGEgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY29tbWVudD86IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIGVudGl0eSBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gQSByZXZpZXcgY2FuIGJlIGVpdGhlciBhIGNvbW1lbnQgb24gdGhlIGN1cnJlbnQgc2NyZWVuaW5nIHN0YXRlLCBhY3Rpb25zIHRha2VuIGFnYWluc3QgaGl0cyBhdHRhY2hlZCB0byB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZywgb3IgYm90aC5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHJldmlldy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29uZmlybWVkX2hpdHM6IEFycmF5PHN0cmluZz47XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSBmYWxzZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC5cbiAgICAgKiBAdHlwZSB7QXJyYXk8c3RyaW5nPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBkaXNtaXNzZWRfaGl0czogQXJyYXk8c3RyaW5nPjtcbiAgICAvKipcbiAgICAgKiBBIGNvbW1lbnQgc3VibWl0dGVkIGJ5IGEgdGVhbSBtZW1iZXIgYXMgcGFydCBvZiByZXZpZXdpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBhdWRpdF90cmFpbDogV2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgcmV2aWV3cyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGVudGl0eV93YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcmV2aWV3c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcmV2aWV3c1xuICAgICAqIEB0eXBlIHtBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19yZXZpZXdzOiBBcnJheTxFbnRpdHlXYXRjaGxpc3RTY3JlZW5pbmdSZXZpZXc+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBlZGl0aW5nIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBlbnRpdHlfd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM/OiBVcGRhdGVFbnRpdHlTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGFzc2lnbmVlPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgbGlzdCBvZiBmaWVsZHMgdG8gcmVzZXQgYmFjayB0byBudWxsXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgcmVzZXRfZmllbGRzPzogQXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZD4gfCBudWxsO1xufVxuLyoqXG4gKiBUaGUgbmFtZSBvZiBhIGZpZWxkIHRoYXQgY2FuIGJlIHJlc2V0IGJhY2sgdG8gbnVsbFxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZCB7XG4gICAgQXNzaWduZWUgPSAnYXNzaWduZWUnXG59XG5cbi8qKlxuICogVGhlIGVudGl0eSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGFuIGVudGl0eSBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIGl0cyBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciBpdCBvbiB2YXJpb3VzIHdhdGNobGlzdHMuIE5vdGU6IFJlamVjdGVkIGVudGl0eSBzY3JlZW5pbmdzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgZW50aXR5IHByb2dyYW0gY29uZmlndXJhdGlvbi5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgZW50aXR5IHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge0VudGl0eVdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogRW50aXR5V2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGFzc2lnbmVlOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogRGF0YSBmcm9tIGEgZ292ZXJubWVudCB3YXRjaGxpc3Qgb3IgUEVQIGxpc3QgdGhhdCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGUgc2NyZWVuaW5nLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdIaXQge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZyBoaXQuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICByZXZpZXdfc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQW4gSVNPODYwMSBmb3JtYXR0ZWQgdGltZXN0YW1wLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGZpcnN0X2FjdGl2ZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBpbmFjdGl2ZV9zaW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBbiBJU084NjAxIGZvcm1hdHRlZCB0aW1lc3RhbXAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgaGlzdG9yaWNhbF9zaW5jZTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SW5kaXZpZHVhbFdhdGNobGlzdENvZGV9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdFxuICAgICAqL1xuICAgIGxpc3RfY29kZTogSW5kaXZpZHVhbFdhdGNobGlzdENvZGU7XG4gICAgLyoqXG4gICAgICogQSB1bml2ZXJzYWwgaWRlbnRpZmllciBmb3IgYSB3YXRjaGxpc3QgaW5kaXZpZHVhbCB0aGF0IGlzIHN0YWJsZSBhY3Jvc3Mgc2VhcmNoZXMgYW5kIHVwZGF0ZXMuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgcGxhaWRfdWlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGlkZW50aWZpZXIgcHJvdmlkZWQgYnkgdGhlIHNvdXJjZSBzYW5jdGlvbiBvciB3YXRjaGxpc3QuIFdoZW4gb25lIGlzIG5vdCBwcm92aWRlZCBieSB0aGUgc291cmNlLCB0aGlzIGlzIGBudWxsYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdIaXRcbiAgICAgKi9cbiAgICBzb3VyY2VfdWlkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtTY3JlZW5pbmdIaXRBbmFseXNpc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgYW5hbHlzaXM/OiBTY3JlZW5pbmdIaXRBbmFseXNpcztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7U2NyZWVuaW5nSGl0RGF0YX1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0XG4gICAgICovXG4gICAgZGF0YT86IFNjcmVlbmluZ0hpdERhdGE7XG59XG4vKipcbiAqIExvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgYXNzb2NpYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBoaXRcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSGl0TG9jYXRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCBsb2NhdGlvbiBzdHJpbmcsIHBvdGVudGlhbGx5IGluY2x1ZGluZyBlbGVtZW50cyBsaWtlIHN0cmVldCwgY2l0eSwgcG9zdGFsIGNvZGVzIGFuZCBjb3VudHJ5IGNvZGVzLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgYSBjb21wbGV0ZSBvciB3ZWxsLWZvcm1hdHRlZCBhZGRyZXNzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICAgICAqL1xuICAgIGZ1bGw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0hpdExvY2F0aW9uc1xuICAgICAqL1xuICAgIGNvdW50cnk6IHN0cmluZztcbn1cbi8qKlxuICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgcmV2aWV3LiBBbGwgd2F0Y2hsaXN0IHNjcmVlbmluZyBoaXRzIGJlZ2luIGluIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0ZSBidXQgY2FuIGJlIGNoYW5nZWQgYnkgY3JlYXRpbmcgYSByZXZpZXcuIFdoZW4gYSBoaXQgaXMgaW4gdGhlIGBwZW5kaW5nX3Jldmlld2Agc3RhdGUsIGl0IHdpbGwgYWx3YXlzIHNob3cgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSB3YXRjaGxpc3QgZGF0YSBQbGFpZCBoYXMgYXZhaWxhYmxlIGFuZCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBsYXRlc3QgY3VzdG9tZXIgaW5mb3JtYXRpb24gc2F2ZWQgaW4gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcuIE9uY2UgYSBoaXQgaGFzIGJlZW4gbWFya2VkIGFzIGBjb25maXJtZWRgIG9yIGBkaXNtaXNzZWRgIGl0IHdpbGwgbm8gbG9uZ2VyIGJlIHVwZGF0ZWQgc28gdGhhdCB0aGUgc3RhdGUgaXMgYXMgaXQgd2FzIHdoZW4gdGhlIHJldmlldyB3YXMgZmlyc3QgY29uZHVjdGVkLlxuICogQGV4cG9ydFxuICogQGVudW0ge3N0cmluZ31cbiAqL1xuZXhwb3J0IGVudW0gV2F0Y2hsaXN0U2NyZWVuaW5nSGl0U3RhdHVzIHtcbiAgICBDb25maXJtZWQgPSAnY29uZmlybWVkJyxcbiAgICBQZW5kaW5nUmV2aWV3ID0gJ3BlbmRpbmdfcmV2aWV3JyxcbiAgICBEaXNtaXNzZWQgPSAnZGlzbWlzc2VkJ1xufVxuXG4vKipcbiAqIFRoZSBzY3JlZW5pbmcgb2JqZWN0IGFsbG93cyB5b3UgdG8gcmVwcmVzZW50IGEgY3VzdG9tZXIgaW4geW91ciBzeXN0ZW0sIHVwZGF0ZSB0aGVpciBwcm9maWxlLCBhbmQgc2VhcmNoIGZvciB0aGVtIG9uIHZhcmlvdXMgd2F0Y2hsaXN0cy4gTm90ZTogUmVqZWN0ZWQgY3VzdG9tZXJzIHdpbGwgbm90IHJlY2VpdmUgbmV3IGhpdHMsIHJlZ2FyZGxlc3Mgb2YgcHJvZ3JhbSBjb25maWd1cmF0aW9uLlxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIHN0YXR1czogV2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFxuICAgICAqL1xuICAgIGNsaWVudF91c2VyX2lkOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGNyZWF0aW5nIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtczogV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIElEIHRoYXQgaWRlbnRpZmllcyB0aGUgZW5kIHVzZXIgaW4geW91ciBzeXN0ZW0uIFRoaXMgSUQgY2FuIGFsc28gYmUgdXNlZCB0byBhc3NvY2lhdGUgdXNlci1zcGVjaWZpYyBkYXRhIGZyb20gb3RoZXIgUGxhaWQgcHJvZHVjdHMuIEZpbmFuY2lhbCBBY2NvdW50IE1hdGNoaW5nIHJlcXVpcmVzIHRoaXMgZmllbGQgYW5kIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBgY2xpZW50X3VzZXJfaWRgIHRvIGJlIGNvbnNpc3RlbnQuIFBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uLCBzdWNoIGFzIGFuIGVtYWlsIGFkZHJlc3Mgb3IgcGhvbmUgbnVtYmVyLCBzaG91bGQgbm90IGJlIHVzZWQgaW4gdGhlIGBjbGllbnRfdXNlcl9pZGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZmV0Y2hpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdfaWQ6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbn1cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyBjaGFuZ2VzIHRvIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWw+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3RpbmcgaGl0cyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjdXJzb3I/OiBzdHJpbmcgfCBudWxsO1xufVxuLyoqXG4gKiBQYWdpbmF0ZWQgbGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaGl0c1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19oaXRzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdIaXQ+O1xuICAgIC8qKlxuICAgICAqIEFuIGlkZW50aWZpZXIgdGhhdCBkZXRlcm1pbmVzIHdoaWNoIHBhZ2Ugb2YgcmVzdWx0cyB5b3UgcmVjZWl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3Rpbmdpbmcgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgc2VjcmV0Pzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBjbGllbnRfaWRgLiBUaGUgYGNsaWVudF9pZGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIHdhdGNobGlzdF9wcm9ncmFtX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzdGF0dXM/OiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgdXNlci4gVG8gcmV0cmlldmUgdGhlIGVtYWlsIGFkZHJlc3Mgb3Igb3RoZXIgZGV0YWlscyBvZiB0aGUgcGVyc29uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpZCwgdXNlIGAvZGFzaGJvYXJkX3VzZXIvZ2V0YC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY3Vyc29yPzogc3RyaW5nIHwgbnVsbDtcbn1cbi8qKlxuICogUGFnaW5hdGVkIGxpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5ncy5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2Uge1xuICAgIC8qKlxuICAgICAqIExpc3Qgb2YgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEB0eXBlIHtBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHdhdGNobGlzdF9zY3JlZW5pbmdzOiBBcnJheTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsPjtcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIG5leHRfY3Vyc29yOiBzdHJpbmcgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSByZXF1ZXN0LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdHJvdWJsZXNob290aW5nLiBUaGlzIGlkZW50aWZpZXIsIGxpa2UgYWxsIFBsYWlkIGlkZW50aWZpZXJzLCBpcyBjYXNlIHNlbnNpdGl2ZS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBmZXRjaGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBwcm9ncmFtXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcHJvZ3JhbSB0aGF0IGNvbmZpZ3VyZXMgdGhlIGFjdGl2ZSBsaXN0cywgc2VhcmNoIHBhcmFtZXRlcnMsIGFuZCBvdGhlciBiZWhhdmlvciBmb3IgaW5pdGlhbCBhbmQgb25nb2luZyBzY3JlZW5pbmcgb2YgaW5kaXZpZHVhbHMuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEFuIElTTzg2MDEgZm9ybWF0dGVkIHRpbWVzdGFtcC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEluZGljYXRvciBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHByb2dyYW0gaXMgZW5hYmxlZCBhbmQgd2lsbCBwZXJmb3JtIGRhaWx5IHJlc2NhbnMuXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBpc19yZXNjYW5uaW5nX2VuYWJsZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2F0Y2hsaXN0cyBlbmFibGVkIGZvciB0aGUgYXNzb2NpYXRlZCBwcm9ncmFtXG4gICAgICogQHR5cGUge1NldDxJbmRpdmlkdWFsV2F0Y2hsaXN0Q29kZT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBsaXN0c19lbmFibGVkOiBTZXQ8SW5kaXZpZHVhbFdhdGNobGlzdENvZGU+O1xuICAgIC8qKlxuICAgICAqIEEgbmFtZSBmb3IgdGhlIHByb2dyYW0gdG8gZGVmaW5lIGl0cyBwdXJwb3NlLiBGb3IgZXhhbXBsZSwgXFxcIkhpZ2ggUmlzayBJbmRpdmlkdWFsc1xcXCIsIFxcXCJVUyBDYXJkaG9sZGVyc1xcXCIsIG9yIFxcXCJBcHBsaWNhbnRzXFxcIi5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQcm9ncmFtTmFtZVNlbnNpdGl2aXR5fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgbmFtZV9zZW5zaXRpdml0eTogUHJvZ3JhbU5hbWVTZW5zaXRpdml0eTtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZVxuICAgICAqL1xuICAgIGF1ZGl0X3RyYWlsOiBXYXRjaGxpc3RTY3JlZW5pbmdBdWRpdFRyYWlsO1xuICAgIC8qKlxuICAgICAqIEFyY2hpdmVkIHByb2dyYW1zIGFyZSByZWFkLW9ubHkgYW5kIGNhbm5vdCBzY3JlZW4gbmV3IGN1c3RvbWVycyBub3IgcGFydGljaXBhdGUgaW4gb25nb2luZyBtb25pdG9yaW5nLlxuICAgICAqIEB0eXBlIHtib29sZWFufVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgaXNfYXJjaGl2ZWQ6IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICByZXF1ZXN0X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFJlcXVlc3QgaW5wdXQgZm9yIGxpc3Rpbmcgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtcyBmb3IgaW5kaXZpZHVhbHNcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Qge1xuICAgIC8qKlxuICAgICAqIFlvdXIgUGxhaWQgQVBJIGBzZWNyZXRgLiBUaGUgYHNlY3JldGAgaXMgcmVxdWlyZWQgYW5kIG1heSBiZSBwcm92aWRlZCBlaXRoZXIgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlciBvciBhcyBwYXJ0IG9mIGEgcmVxdWVzdCBib2R5LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBbiBpZGVudGlmaWVyIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBwYWdlIG9mIHJlc3VsdHMgeW91IHJlY2VpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEB0eXBlIHtBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3Byb2dyYW1zOiBBcnJheTxJbmRpdmlkdWFsV2F0Y2hsaXN0UHJvZ3JhbT47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgbmV4dF9jdXJzb3I6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBSZXF1ZXN0IGlucHV0IGZvciBjcmVhdGluZyBhIHNjcmVlbmluZyByZXZpZXdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSGl0cyB0byBtYXJrIGFzIGEgdHJ1ZSBwb3NpdGl2ZSBhZnRlciB0aG9yb3VnaCBtYW51YWwgcmV2aWV3LiBUaGVzZSBoaXRzIHdpbGwgbmV2ZXIgcmVjdXIgb3IgYmUgdXBkYXRlZCBvbmNlIGRpc21pc3NlZC4gSW4gbW9zdCBjYXNlcywgY29uZmlybWVkIGhpdHMgaW5kaWNhdGUgdGhhdCB0aGUgY3VzdG9tZXIgc2hvdWxkIGJlIHJlamVjdGVkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgdG8gbWFyayBhcyBhIGZhbHNlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLlxuICAgICAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjb21tZW50Pzogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBJRCBvZiB0aGUgYXNzb2NpYXRlZCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgbGlzdGluZyByZXZpZXdzIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X2lkPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHNjcmVlbmluZy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3RcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX2lkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdFxuICAgICAqL1xuICAgIGN1cnNvcj86IHN0cmluZyB8IG51bGw7XG59XG4vKipcbiAqIFBhZ2luYXRlZCBsaXN0IG9mIHNjcmVlbmluZyByZXZpZXdzXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBMaXN0IG9mIHNjcmVlbmluZyByZXZpZXdzXG4gICAgICogQHR5cGUge0FycmF5PFdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICB3YXRjaGxpc3Rfc2NyZWVuaW5nX3Jldmlld3M6IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ1Jldmlldz47XG4gICAgLyoqXG4gICAgICogQW4gaWRlbnRpZmllciB0aGF0IGRldGVybWluZXMgd2hpY2ggcGFnZSBvZiByZXN1bHRzIHlvdSByZWNlaXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBuZXh0X2N1cnNvcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogUmVxdWVzdCBpbnB1dCBmb3IgZWRpdGluZyBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgd2F0Y2hsaXN0X3NjcmVlbmluZ19pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtVcGRhdGVJbmRpdmlkdWFsU2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHNlYXJjaF90ZXJtcz86IFVwZGF0ZUluZGl2aWR1YWxTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXMgfCBudWxsO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBhc3NpZ25lZT86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nU3RhdHVzfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHN0YXR1cz86IFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cztcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBJRCB0aGF0IGlkZW50aWZpZXMgdGhlIGVuZCB1c2VyIGluIHlvdXIgc3lzdGVtLiBUaGlzIElEIGNhbiBhbHNvIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHVzZXItc3BlY2lmaWMgZGF0YSBmcm9tIG90aGVyIFBsYWlkIHByb2R1Y3RzLiBGaW5hbmNpYWwgQWNjb3VudCBNYXRjaGluZyByZXF1aXJlcyB0aGlzIGZpZWxkIGFuZCB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYGNsaWVudF91c2VyX2lkYCB0byBiZSBjb25zaXN0ZW50LiBQZXJzb25hbGx5IGlkZW50aWZpYWJsZSBpbmZvcm1hdGlvbiwgc3VjaCBhcyBhbiBlbWFpbCBhZGRyZXNzIG9yIHBob25lIG51bWJlciwgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHRoZSBgY2xpZW50X3VzZXJfaWRgLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0XG4gICAgICovXG4gICAgY2xpZW50X3VzZXJfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYGNsaWVudF9pZGAuIFRoZSBgY2xpZW50X2lkYCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBjbGllbnRfaWQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogWW91ciBQbGFpZCBBUEkgYHNlY3JldGAuIFRoZSBgc2VjcmV0YCBpcyByZXF1aXJlZCBhbmQgbWF5IGJlIHByb3ZpZGVkIGVpdGhlciBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyIG9yIGFzIHBhcnQgb2YgYSByZXF1ZXN0IGJvZHkuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RcbiAgICAgKi9cbiAgICBzZWNyZXQ/OiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogQSBsaXN0IG9mIGZpZWxkcyB0byByZXNldCBiYWNrIHRvIG51bGxcbiAgICAgKiBAdHlwZSB7QXJyYXk8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3RSZXNldHRhYmxlRmllbGQ+fVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFxuICAgICAqL1xuICAgIHJlc2V0X2ZpZWxkcz86IEFycmF5PFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0UmVzZXR0YWJsZUZpZWxkPiB8IG51bGw7XG59XG4vKipcbiAqIFRoZSBuYW1lIG9mIGEgZmllbGQgdGhhdCBjYW4gYmUgcmVzZXQgYmFjayB0byBudWxsXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdFJlc2V0dGFibGVGaWVsZCB7XG4gICAgQXNzaWduZWUgPSAnYXNzaWduZWUnXG59XG5cbi8qKlxuICogVGhlIHNjcmVlbmluZyBvYmplY3QgYWxsb3dzIHlvdSB0byByZXByZXNlbnQgYSBjdXN0b21lciBpbiB5b3VyIHN5c3RlbSwgdXBkYXRlIHRoZWlyIHByb2ZpbGUsIGFuZCBzZWFyY2ggZm9yIHRoZW0gb24gdmFyaW91cyB3YXRjaGxpc3RzLiBOb3RlOiBSZWplY3RlZCBjdXN0b21lcnMgd2lsbCBub3QgcmVjZWl2ZSBuZXcgaGl0cywgcmVnYXJkbGVzcyBvZiBwcm9ncmFtIGNvbmZpZ3VyYXRpb24uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZSB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgc2NyZWVuaW5nLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBzZWFyY2hfdGVybXM6IFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zO1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHVzZXIuIFRvIHJldHJpZXZlIHRoZSBlbWFpbCBhZGRyZXNzIG9yIG90aGVyIGRldGFpbHMgb2YgdGhlIHBlcnNvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgaWQsIHVzZSBgL2Rhc2hib2FyZF91c2VyL2dldGAuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXNzaWduZWU6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dhdGNobGlzdFNjcmVlbmluZ1N0YXR1c31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgc3RhdHVzOiBXYXRjaGxpc3RTY3JlZW5pbmdTdGF0dXM7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgSUQgdGhhdCBpZGVudGlmaWVzIHRoZSBlbmQgdXNlciBpbiB5b3VyIHN5c3RlbS4gVGhpcyBJRCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyLXNwZWNpZmljIGRhdGEgZnJvbSBvdGhlciBQbGFpZCBwcm9kdWN0cy4gRmluYW5jaWFsIEFjY291bnQgTWF0Y2hpbmcgcmVxdWlyZXMgdGhpcyBmaWVsZCBhbmQgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGBjbGllbnRfdXNlcl9pZGAgdG8gYmUgY29uc2lzdGVudC4gUGVyc29uYWxseSBpZGVudGlmaWFibGUgaW5mb3JtYXRpb24sIHN1Y2ggYXMgYW4gZW1haWwgYWRkcmVzcyBvciBwaG9uZSBudW1iZXIsIHNob3VsZCBub3QgYmUgdXNlZCBpbiB0aGUgYGNsaWVudF91c2VyX2lkYC5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVzcG9uc2VcbiAgICAgKi9cbiAgICBjbGllbnRfdXNlcl9pZDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlXG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG4gICAgLyoqXG4gICAgICogQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHJlcXVlc3QsIHdoaWNoIGNhbiBiZSB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcuIFRoaXMgaWRlbnRpZmllciwgbGlrZSBhbGwgUGxhaWQgaWRlbnRpZmllcnMsIGlzIGNhc2Ugc2Vuc2l0aXZlLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXNwb25zZVxuICAgICAqL1xuICAgIHJlcXVlc3RfaWQ6IHN0cmluZztcbn1cbi8qKlxuICogU2VhcmNoIGlucHV0cyBmb3IgY3JlYXRpbmcgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtcyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcHJvZ3JhbS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdSZXF1ZXN0U2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycywgYW5kIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGxlZ2FsX25hbWU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBIGRhdGUgaW4gdGhlIGZvcm1hdCBZWVlZLU1NLUREIChSRkMgMzMzOSBTZWN0aW9uIDUuNikuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmVxdWVzdFNlYXJjaFRlcm1zXG4gICAgICovXG4gICAgZGF0ZV9vZl9iaXJ0aD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUgbnVtZXJpYyBvciBhbHBoYW51bWVyaWMgaWRlbnRpZmllciBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC4gTXVzdCBiZSBiZXR3ZWVuIDQgYW5kIDMyIGNoYXJhY3RlcnMgbG9uZywgYW5kIGNhbm5vdCBoYXZlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcj86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1JlcXVlc3RTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGNvdW50cnk/OiBzdHJpbmc7XG59XG4vKipcbiAqIEEgcmV2aWV3IHN1Ym1pdHRlZCBieSBhIHRlYW0gbWVtYmVyIGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIEEgcmV2aWV3IGNhbiBiZSBlaXRoZXIgYSBjb21tZW50IG9uIHRoZSBjdXJyZW50IHNjcmVlbmluZyBzdGF0ZSwgYWN0aW9ucyB0YWtlbiBhZ2FpbnN0IGhpdHMgYXR0YWNoZWQgdG8gdGhlIHdhdGNobGlzdCBzY3JlZW5pbmcsIG9yIGJvdGguXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1JldmlldyB7XG4gICAgLyoqXG4gICAgICogSUQgb2YgdGhlIGFzc29jaWF0ZWQgcmV2aWV3LlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGlkOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogSGl0cyBtYXJrZWQgYXMgYSB0cnVlIHBvc2l0aXZlIGFmdGVyIHRob3JvdWdoIG1hbnVhbCByZXZpZXcuIFRoZXNlIGhpdHMgd2lsbCBuZXZlciByZWN1ciBvciBiZSB1cGRhdGVkIG9uY2UgZGlzbWlzc2VkLiBJbiBtb3N0IGNhc2VzLCBjb25maXJtZWQgaGl0cyBpbmRpY2F0ZSB0aGF0IHRoZSBjdXN0b21lciBzaG91bGQgYmUgcmVqZWN0ZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGNvbmZpcm1lZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEhpdHMgbWFya2VkIGFzIGEgZmFsc2UgcG9zaXRpdmUgYWZ0ZXIgdGhvcm91Z2ggbWFudWFsIHJldmlldy4gVGhlc2UgaGl0cyB3aWxsIG5ldmVyIHJlY3VyIG9yIGJlIHVwZGF0ZWQgb25jZSBkaXNtaXNzZWQuXG4gICAgICogQHR5cGUge0FycmF5PHN0cmluZz59XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1Jldmlld1xuICAgICAqL1xuICAgIGRpc21pc3NlZF9oaXRzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEEgY29tbWVudCBzdWJtaXR0ZWQgYnkgYSB0ZWFtIG1lbWJlciBhcyBwYXJ0IG9mIHJldmlld2luZyBhIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgY29tbWVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7V2F0Y2hsaXN0U2NyZWVuaW5nQXVkaXRUcmFpbH1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nUmV2aWV3XG4gICAgICovXG4gICAgYXVkaXRfdHJhaWw6IFdhdGNobGlzdFNjcmVlbmluZ0F1ZGl0VHJhaWw7XG59XG4vKipcbiAqIFNlYXJjaCB0ZXJtcyBmb3IgY3JlYXRpbmcgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXMge1xuICAgIC8qKlxuICAgICAqIElEIG9mIHRoZSBhc3NvY2lhdGVkIHByb2dyYW0uXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB3YXRjaGxpc3RfcHJvZ3JhbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBsZWdhbCBuYW1lIG9mIHRoZSBpbmRpdmlkdWFsIGJlaW5nIHNjcmVlbmVkLiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGFscGhhYmV0aWNhbCBjaGFyYWN0ZXIsIGhhdmUgYSBtYXhpbXVtIGxlbmd0aCBvZiAxMDAgY2hhcmFjdGVycywgYW5kIG5vdCBpbmNsdWRlIGxlYWRpbmcgb3IgdHJhaWxpbmcgc3BhY2VzLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgbGVnYWxfbmFtZTogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIEEgZGF0ZSBpbiB0aGUgZm9ybWF0IFlZWVktTU0tREQgKFJGQyAzMzM5IFNlY3Rpb24gNS42KS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRhdGVfb2ZfYmlydGg6IHN0cmluZyB8IG51bGw7XG4gICAgLyoqXG4gICAgICogVGhlIG51bWVyaWMgb3IgYWxwaGFudW1lcmljIGlkZW50aWZpZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZG9jdW1lbnQuIE11c3QgYmUgYmV0d2VlbiA0IGFuZCAzMiBjaGFyYWN0ZXJzIGxvbmcsIGFuZCBjYW5ub3QgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcy5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXYXRjaGxpc3RTY3JlZW5pbmdTZWFyY2hUZXJtc1xuICAgICAqL1xuICAgIGRvY3VtZW50X251bWJlcjogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBWYWxpZCwgY2FwaXRhbGl6ZWQsIHR3by1sZXR0ZXIgSVNPIGNvZGUgcmVwcmVzZW50aW5nIHRoZSBjb3VudHJ5IG9mIHRoaXMgb2JqZWN0LiBNdXN0IGJlIGluIElTTyAzMTY2LTEgYWxwaGEtMiBmb3JtLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdhdGNobGlzdFNjcmVlbmluZ1NlYXJjaFRlcm1zXG4gICAgICovXG4gICAgY291bnRyeTogc3RyaW5nIHwgbnVsbDtcbiAgICAvKipcbiAgICAgKiBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZSBzZWFyY2ggdGVybXMuIFN0YXJ0cyBhdCBgMWAgYW5kIGluY3JlbWVudHMgd2l0aCBlYWNoIGVkaXQgdG8gYHNlYXJjaF90ZXJtc2AuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgV2F0Y2hsaXN0U2NyZWVuaW5nU2VhcmNoVGVybXNcbiAgICAgKi9cbiAgICB2ZXJzaW9uOiBudW1iZXI7XG59XG4vKipcbiAqIEEgc3RhdHVzIGVudW0gaW5kaWNhdGluZyB3aGV0aGVyIGEgc2NyZWVuaW5nIGlzIHN0aWxsIHBlbmRpbmcgcmV2aWV3LCBoYXMgYmVlbiByZWplY3RlZCwgb3IgaGFzIGJlZW4gY2xlYXJlZC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdhdGNobGlzdFNjcmVlbmluZ1N0YXR1cyB7XG4gICAgUmVqZWN0ZWQgPSAncmVqZWN0ZWQnLFxuICAgIFBlbmRpbmdSZXZpZXcgPSAncGVuZGluZ19yZXZpZXcnLFxuICAgIENsZWFyZWQgPSAnY2xlYXJlZCdcbn1cblxuLyoqXG4gKiBOYW1lcyB0aGF0IGFyZSBleHBsaWNpdGx5IG1hcmtlZCBhcyBsb3cgcXVhbGl0eSBlaXRoZXIgYnkgdGhlaXIgYHNvdXJjZWAgbGlzdCwgb3IgYnkgYHBsYWlkYCBieSBhIHNlcmllcyBvZiBhZGRpdGlvbmFsIGNoZWNrcyBkb25lIGJ5IFBsYWlkLiBQbGFpZCBkb2VzIG5vdCBldmVyIHN1cmZhY2UgYSBoaXQgYXMgYSByZXN1bHQgb2YgYSB3ZWFrIG5hbWUgYWxvbmUuIElmIGEgbmFtZSBoYXMgbm8gcXVhbGl0eSBpc3N1ZXMsIHRoaXMgdmFsdWUgd2lsbCBiZSBgbm9uZWAuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXZWFrQWxpYXNEZXRlcm1pbmF0aW9uIHtcbiAgICBOb25lID0gJ25vbmUnLFxuICAgIFNvdXJjZSA9ICdzb3VyY2UnLFxuICAgIFBsYWlkID0gJ3BsYWlkJ1xufVxuXG4vKipcbiAqIFRoZSBQbGFpZCBlbnZpcm9ubWVudCB0aGUgd2ViaG9vayB3YXMgc2VudCBmcm9tXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBXZWJob29rRW52aXJvbm1lbnRWYWx1ZXMge1xuICAgIFNhbmRib3ggPSAnc2FuZGJveCcsXG4gICAgUHJvZHVjdGlvbiA9ICdwcm9kdWN0aW9uJ1xufVxuXG4vKipcbiAqIFRoZSB3ZWJob29rIHR5cGVzIHRoYXQgY2FuIGJlIGZpcmVkIGJ5IHRoaXMgdGVzdCBlbmRwb2ludC5cbiAqIEBleHBvcnRcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKi9cbmV4cG9ydCBlbnVtIFdlYmhvb2tUeXBlIHtcbiAgICBBdXRoID0gJ0FVVEgnLFxuICAgIEhvbGRpbmdzID0gJ0hPTERJTkdTJyxcbiAgICBJbnZlc3RtZW50c1RyYW5zYWN0aW9ucyA9ICdJTlZFU1RNRU5UU19UUkFOU0FDVElPTlMnLFxuICAgIEl0ZW0gPSAnSVRFTScsXG4gICAgTGlhYmlsaXRpZXMgPSAnTElBQklMSVRJRVMnLFxuICAgIFRyYW5zYWN0aW9ucyA9ICdUUkFOU0FDVElPTlMnLFxuICAgIEFzc2V0cyA9ICdBU1NFVFMnXG59XG5cbi8qKlxuICogRmlyZWQgd2hlbiBhbiBJdGVtXFwncyB3ZWJob29rIGlzIHVwZGF0ZWQuIFRoaXMgd2lsbCBiZSBzZW50IHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vay5cbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9vayB7XG4gICAgLyoqXG4gICAgICogYElURU1gXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICB3ZWJob29rX3R5cGU6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYFxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgd2ViaG9va19jb2RlOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIGBpdGVtX2lkYCBvZiB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB3ZWJob29rLCB3YXJuaW5nLCBvciBlcnJvclxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tVcGRhdGVBY2tub3dsZWRnZWRXZWJob29rXG4gICAgICovXG4gICAgaXRlbV9pZDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSBuZXcgd2ViaG9vayBVUkxcbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIG5ld193ZWJob29rX3VybDogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtQbGFpZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVXBkYXRlQWNrbm93bGVkZ2VkV2ViaG9va1xuICAgICAqL1xuICAgIGVycm9yPzogUGxhaWRFcnJvciB8IG51bGw7XG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHR5cGUge1dlYmhvb2tFbnZpcm9ubWVudFZhbHVlc31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1VwZGF0ZUFja25vd2xlZGdlZFdlYmhvb2tcbiAgICAgKi9cbiAgICBlbnZpcm9ubWVudDogV2ViaG9va0Vudmlyb25tZW50VmFsdWVzO1xufVxuLyoqXG4gKiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBkZWZpbmVzIHRoZSByZXF1ZXN0IHNjaGVtYSBmb3IgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YFxuICogQGV4cG9ydFxuICogQGludGVyZmFjZSBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0IHtcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgY2xpZW50X2lkYC4gVGhlIGBjbGllbnRfaWRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIGNsaWVudF9pZD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBZb3VyIFBsYWlkIEFQSSBgc2VjcmV0YC4gVGhlIGBzZWNyZXRgIGlzIHJlcXVpcmVkIGFuZCBtYXkgYmUgcHJvdmlkZWQgZWl0aGVyIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIgb3IgYXMgcGFydCBvZiBhIHJlcXVlc3QgYm9keS5cbiAgICAgKiBAdHlwZSB7c3RyaW5nfVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdFxuICAgICAqL1xuICAgIHNlY3JldD86IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBUaGUga2V5IElEICggYGtpZGAgKSBmcm9tIHRoZSBKV1QgaGVhZGVyLlxuICAgICAqIEB0eXBlIHtzdHJpbmd9XG4gICAgICogQG1lbWJlcm9mIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0XG4gICAgICovXG4gICAga2V5X2lkOiBzdHJpbmc7XG59XG4vKipcbiAqIFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZSBkZWZpbmVzIHRoZSByZXNwb25zZSBzY2hlbWEgZm9yIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGBcbiAqIEBleHBvcnRcbiAqIEBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlIHtcbiAgICAvKipcbiAgICAgKiBcbiAgICAgKiBAdHlwZSB7SldLUHVibGljS2V5fVxuICAgICAqIEBtZW1iZXJvZiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2VcbiAgICAgKi9cbiAgICBrZXk6IEpXS1B1YmxpY0tleTtcbiAgICAvKipcbiAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgcmVxdWVzdCwgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIHRyb3VibGVzaG9vdGluZy4gVGhpcyBpZGVudGlmaWVyLCBsaWtlIGFsbCBQbGFpZCBpZGVudGlmaWVycywgaXMgY2FzZSBzZW5zaXRpdmUuXG4gICAgICogQHR5cGUge3N0cmluZ31cbiAgICAgKiBAbWVtYmVyb2YgV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlc3BvbnNlXG4gICAgICovXG4gICAgcmVxdWVzdF9pZDogc3RyaW5nO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgcHJlLXRheCBlYXJuaW5ncywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXIge1xuICAgIC8qKlxuICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWVRER3Jvc3NJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlUREdyb3NzSW5jb21lU3VtbWFyeUZpZWxkTnVtYmVyXG4gICAgICovXG4gICAgdmVyaWZpY2F0aW9uX3N0YXR1czogVmVyaWZpY2F0aW9uU3RhdHVzO1xufVxuLyoqXG4gKiBZZWFyLXRvLWRhdGUgZWFybmluZ3MgYWZ0ZXIgYW55IHRheCB3aXRoaG9sZGluZ3MsIGJlbmVmaXQgcGF5bWVudHMgb3IgZGVkdWN0aW9ucywgYXMgcmVwb3J0ZWQgb24gdGhlIHBheXN0dWIuXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlciB7XG4gICAgLyoqXG4gICAgICogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZC5cbiAgICAgKiBAdHlwZSB7bnVtYmVyfVxuICAgICAqIEBtZW1iZXJvZiBZVEROZXRJbmNvbWVTdW1tYXJ5RmllbGROdW1iZXJcbiAgICAgKi9cbiAgICB2YWx1ZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtWZXJpZmljYXRpb25TdGF0dXN9XG4gICAgICogQG1lbWJlcm9mIFlURE5ldEluY29tZVN1bW1hcnlGaWVsZE51bWJlclxuICAgICAqL1xuICAgIHZlcmlmaWNhdGlvbl9zdGF0dXM6IFZlcmlmaWNhdGlvblN0YXR1cztcbn1cbi8qKlxuICogRGV0YWlscyBhYm91dCBhIGZpeGVkIGluY29tZSBzZWN1cml0eVxcJ3MgZXhwZWN0ZWQgcmF0ZSBvZiByZXR1cm4uXG4gKiBAZXhwb3J0XG4gKiBAaW50ZXJmYWNlIFlpZWxkUmF0ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFlpZWxkUmF0ZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZpeGVkIGluY29tZSBzZWN1cml0eVxcJ3MgZXhwZWN0ZWQgcmF0ZSBvZiByZXR1cm4uXG4gICAgICogQHR5cGUge251bWJlcn1cbiAgICAgKiBAbWVtYmVyb2YgWWllbGRSYXRlXG4gICAgICovXG4gICAgcGVyY2VudGFnZTogbnVtYmVyO1xuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEB0eXBlIHtZaWVsZFJhdGVUeXBlfVxuICAgICAqIEBtZW1iZXJvZiBZaWVsZFJhdGVcbiAgICAgKi9cbiAgICB0eXBlOiBZaWVsZFJhdGVUeXBlIHwgbnVsbDtcbn1cbi8qKlxuICogVGhlIHR5cGUgb2YgcmF0ZSB3aGljaCBpbmRpY2F0ZXMgaG93IHRoZSBwcmVkaWN0ZWQgeWllbGQgd2FzIGNhbGN1bGF0ZWQuIEl0IGlzIG9uZSBvZjogIGBjb3Vwb25gOiB0aGUgYW5udWFsaXplZCBpbnRlcmVzdCByYXRlIGZvciBzZWN1cml0aWVzIHdpdGggYSBvbmUteWVhciB0ZXJtIG9yIGxvbmdlciwgc3VjaCBhcyB0cmVhc3VyeSBub3RlcyBhbmQgYm9uZHMuICBgY291cG9uX2VxdWl2YWxlbnRgOiB0aGUgY2FsY3VsYXRlZCBlcXVpdmFsZW50IGZvciB0aGUgYW5udWFsaXplZCBpbnRlcmVzdCByYXRlIGZhY3RvcmluZyBpbiB0aGUgZGlzY291bnQgcmF0ZSBhbmQgdGltZSB0byBtYXR1cml0eSwgZm9yIHNob3J0ZXIgdGVybSwgbm9uLWludGVyZXN0LWJlYXJpbmcgc2VjdXJpdGllcyBzdWNoIGFzIHRyZWFzdXJ5IGJpbGxzLiAgYGRpc2NvdW50YDogdGhlIHJhdGUgYXQgd2hpY2ggdGhlIHByZXNlbnQgdmFsdWUgb3IgY29zdCBpcyBkaXNjb3VudGVkIGZyb20gdGhlIGZ1dHVyZSB2YWx1ZSB1cG9uIG1hdHVyaXR5LCBhbHNvIGtub3duIGFzIHRoZSBmYWNlIHZhbHVlLiAgYHlpZWxkYDogdGhlIHRvdGFsIHByZWRpY3RlZCByYXRlIG9mIHJldHVybiBmYWN0b3JpbmcgaW4gYm90aCB0aGUgZGlzY291bnQgcmF0ZSBhbmQgdGhlIGNvdXBvbiByYXRlLCBhcHBsaWNhYmxlIHRvIHNlY3VyaXRpZXMgc3VjaCBhcyBleGNoYW5nZS10cmFkZWQgYm9uZHMgd2hpY2ggY2FuIGJvdGggYmUgaW50ZXJlc3QtYmVhcmluZyBhcyB3ZWxsIGFzIHNvbGQgYXQgYSBkaXNjb3VudCBvZmYgaXRzIGZhY2UgdmFsdWUuXG4gKiBAZXhwb3J0XG4gKiBAZW51bSB7c3RyaW5nfVxuICovXG5leHBvcnQgZW51bSBZaWVsZFJhdGVUeXBlIHtcbiAgICBDb3Vwb24gPSAnY291cG9uJyxcbiAgICBDb3Vwb25FcXVpdmFsZW50ID0gJ2NvdXBvbl9lcXVpdmFsZW50JyxcbiAgICBEaXNjb3VudCA9ICdkaXNjb3VudCcsXG4gICAgWWllbGQgPSAneWllbGQnLFxuICAgIE51bGwgPSAnbnVsbCdcbn1cblxuXG4vKipcbiAqIFBsYWlkQXBpIC0gYXhpb3MgcGFyYW1ldGVyIGNyZWF0b3JcbiAqIEBleHBvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IFBsYWlkQXBpQXhpb3NQYXJhbUNyZWF0b3IgPSBmdW5jdGlvbiAoY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0JhbGFuY2VHZXQ6IGFzeW5jIChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FjY291bnRzQmFsYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2FjY291bnRzQmFsYW5jZUdldCcsICdhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0JywgYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIHBhaWQgZW5kcG9pbnQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFjY291bnRzR2V0OiBhc3luYyAoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYWNjb3VudHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhY2NvdW50c0dldCcsICdhY2NvdW50c0dldFJlcXVlc3QnLCBhY2NvdW50c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2FjY291bnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhY2NvdW50c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBsaWNhdGlvbkdldDogYXN5bmMgKGFwcGxpY2F0aW9uR2V0UmVxdWVzdDogQXBwbGljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2FwcGxpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXBwbGljYXRpb25HZXQnLCAnYXBwbGljYXRpb25HZXRSZXF1ZXN0JywgYXBwbGljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hcHBsaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXBwbGljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZTogYXN5bmMgKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUnLCAnYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0JywgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0OiBhc3luYyAoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEF1ZGl0Q29weUdldCcsICdhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QnLCBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmU6IGFzeW5jIChhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlJywgJ2Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCcsIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBUaGUgZXhhY3QgYW1vdW50IG9mIHRpbWUgdG8gY3JlYXRlIHRoZSByZXBvcnQgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkYXlzIG9mIGhpc3RvcnkgYXJlIHJlcXVlc3RlZCBhbmQgd2lsbCB0eXBpY2FsbHkgcmFuZ2UgZnJvbSBhIGZldyBzZWNvbmRzIHRvIGFib3V0IG9uZSBtaW51dGUuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyN3ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRDcmVhdGU6IGFzeW5jIChhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0Q3JlYXRlJywgJ2Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCcsIGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiBhbGwgb2YgdGhlIGFjY291bnRzIG9uIGEgZ2l2ZW4gSXRlbS4gSW4gc29tZSBjYXNlcywgeW91IG1heSBub3Qgd2FudCB0aGUgQXNzZXQgUmVwb3J0IHRvIGNvbnRhaW4gYWxsIGFjY291bnRzLiBGb3IgZXhhbXBsZSwgeW91IG1pZ2h0IGhhdmUgdGhlIGVuZCB1c2VyIGNob29zZSB3aGljaCBhY2NvdW50cyBhcmUgcmVsZXZhbnQgaW4gTGluayB1c2luZyB0aGUgQWNjb3VudCBTZWxlY3Qgdmlldywgd2hpY2ggeW91IGNhbiBlbmFibGUgaW4gdGhlIGRhc2hib2FyZC4gT3IsIHlvdSBtaWdodCBhbHdheXMgZXhjbHVkZSBjZXJ0YWluIGFjY291bnQgdHlwZXMgb3Igc3VidHlwZXMsIHdoaWNoIHlvdSBjYW4gaWRlbnRpZnkgYnkgdXNpbmcgdGhlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludC4gVG8gbmFycm93IGFuIEFzc2V0IFJlcG9ydCB0byBvbmx5IGEgc3Vic2V0IG9mIGFjY291bnRzLCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQuICBUbyBleGNsdWRlIGNlcnRhaW4gQWNjb3VudHMgZnJvbSBhbiBBc3NldCBSZXBvcnQsIGZpcnN0IHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgdGhlIHJlcG9ydCwgdGhlbiBzZW5kIHRoZSBgYXNzZXRfcmVwb3J0X3Rva2VuYCBhbG9uZyB3aXRoIGEgbGlzdCBvZiBgYWNjb3VudF9pZHNgIHRvIGV4Y2x1ZGUgdG8gdGhlIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZW5kcG9pbnQsIHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgd2hpY2ggY29udGFpbnMgb25seSBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0XFwncyBkYXRhLiAgQmVjYXVzZSBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUsIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkb2VzIG5vdCBhbHRlciB0aGUgb3JpZ2luYWwgQXNzZXQgUmVwb3J0IGluIGFueSB3YXk7IHJhdGhlciwgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBjcmVhdGVzIGEgbmV3IEFzc2V0IFJlcG9ydCB3aXRoIGEgbmV3IHRva2VuIGFuZCBpZC4gQXNzZXQgUmVwb3J0cyBjcmVhdGVkIHZpYSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvIG5vdCBjb250YWluIG5ldyBBc3NldCBkYXRhLCBhbmQgYXJlIG5vdCBiaWxsZWQuICBQbGFpZCB3aWxsIGZpcmUgYSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgb25jZSBnZW5lcmF0aW9uIG9mIHRoZSBmaWx0ZXJlZCBBc3NldCBSZXBvcnQgaGFzIGNvbXBsZXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRmlsdGVyIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRGaWx0ZXI6IGFzeW5jIChhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0RmlsdGVyJywgJ2Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCcsIGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gSlNPTiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgaW5jbHVkZXMgdHJhbnNhY3Rpb24gZGVzY3JpcHRpb25zIGFzIHJldHVybmVkIGJ5IHRoZSBiYW5rLCBhcyBvcHBvc2VkIHRvIHBhcnNlZCBhbmQgY2F0ZWdvcml6ZWQgYnkgUGxhaWQuIFlvdSBjYW4gYWxzbyByZWNlaXZlIGNsZWFuZWQgYW5kIGNhdGVnb3JpemVkIHRyYW5zYWN0aW9ucywgYXMgd2VsbCBhcyBhZGRpdGlvbmFsIGluc2lnaHRzIGxpa2UgbWVyY2hhbnQgbmFtZSBvciBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gV2UgY2FsbCB0aGlzIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLiBBbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cyBwcm92aWRlcyB0cmFuc2FjdGlvbiBjYXRlZ29yeSwgbG9jYXRpb24sIGFuZCBtZXJjaGFudCBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbiB0byB0aGUgdHJhbnNhY3Rpb24gc3RyaW5ncyBwcm92aWRlZCBpbiBhIHN0YW5kYXJkIEFzc2V0IFJlcG9ydC4gVG8gcmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMsIGNhbGwgYC9hc3NldF9yZXBvcnQvZ2V0YCBlbmRwb2ludCB3aXRoIGBpbmNsdWRlX2luc2lnaHRzYCBzZXQgdG8gYHRydWVgLiAgRm9yIGxhdGVuY3ktc2Vuc2l0aXZlIGFwcGxpY2F0aW9ucywgeW91IGNhbiBvcHRpb25hbGx5IGNhbGwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCB3aXRoIGBvcHRpb25zLmFkZF9vbnNgIHNldCB0byBgW1xcXCJmYXN0X2Fzc2V0c1xcXCJdYC4gVGhpcyB3aWxsIGNhdXNlIFBsYWlkIHRvIGNyZWF0ZSB0d28gdmVyc2lvbnMgb2YgdGhlIEFzc2V0IFJlcG9ydDogb25lIHdpdGggb25seSBjdXJyZW50IGFuZCBhdmFpbGFibGUgYmFsYW5jZSBhbmQgaWRlbnRpdHkgaW5mb3JtYXRpb24sIGFuZCB0aGVuIGxhdGVyIG9uIHRoZSBjb21wbGV0ZSBBc3NldCBSZXBvcnQuIFlvdSB3aWxsIHJlY2VpdmUgc2VwYXJhdGUgd2ViaG9va3MgZm9yIGVhY2ggdmVyc2lvbiBvZiB0aGUgQXNzZXQgUmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEdldFJlcXVlc3R9IGFzc2V0UmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0R2V0OiBhc3luYyAoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydEdldCcsICdhc3NldFJlcG9ydEdldFJlcXVlc3QnLCBhc3NldFJlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRQZGZHZXQ6IGFzeW5jIChhc3NldFJlcG9ydFBERkdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhc3NldFJlcG9ydFBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UGRmR2V0JywgJ2Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCcsIGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydFJlZnJlc2g6IGFzeW5jIChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2Fzc2V0UmVwb3J0UmVmcmVzaCcsICdhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0JywgYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGFuIGBhY2Nlc3NfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGNyZWF0ZSBuZXcgQXNzZXQgUmVwb3J0cyB3aXRoIGl0LiBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgdGhlbSBzcGVjaWZpY2FsbHkuICBUaGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LiBSZW1vdmluZyBhbiBBc3NldCBSZXBvcnQgaW52YWxpZGF0ZXMgaXRzIGBhc3NldF9yZXBvcnRfdG9rZW5gLCBtZWFuaW5nIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEgb3IgY3JlYXRlIG5ldyBBdWRpdCBDb3BpZXMuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBkb2VzIG5vdCBhZmZlY3QgdGhlIHVuZGVybHlpbmcgSXRlbXMsIGJ1dCBkb2VzIGludmFsaWRhdGUgYW55IGBhdWRpdF9jb3B5X3Rva2Vuc2AgYXNzb2NpYXRlZCB3aXRoIHRoZSBBc3NldCBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlbGV0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVtb3ZlOiBhc3luYyAoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdhc3NldFJlcG9ydFJlbW92ZScsICdhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QnLCBhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVycyAoc3VjaCBhcyByb3V0aW5nIG51bWJlcnMsIGZvciBVUyBhY2NvdW50cykgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW1cXCdzIGNoZWNraW5nLCBzYXZpbmdzLCBhbmQgY2FzaCBtYW5hZ2VtZW50IGFjY291bnRzLCBhbG9uZyB3aXRoIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogSW4gQVBJIHZlcnNpb24gMjAxNy0wMy0wOCwgdGhlIHNjaGVtYSBvZiB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGlzIHN1YnN0YW50aWFsbHkgZGlmZmVyZW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDE4LTA1LTIyKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QXV0aEdldFJlcXVlc3R9IGF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXV0aEdldDogYXN5bmMgKGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdhdXRoR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYXV0aEdldCcsICdhdXRoR2V0UmVxdWVzdCcsIGF1dGhHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9hdXRoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChhdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGJhbGFuY2Ugb2YgeW91ciBCYW5rIFRyYW5zZmVyIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0OiBhc3luYyAoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJCYWxhbmNlR2V0JywgJ2JhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSBiYW5rIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC9iYW5rX3RyYW5zZmVyL2dldGAgaXMgYHRydWVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdH0gYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNhbmNlbDogYXN5bmMgKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyQ2FuY2VsJywgJ2JhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJDcmVhdGU6IGFzeW5jIChiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2ZlckNyZWF0ZScsICdiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JywgYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRMaXN0OiBhc3luYyAoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJFdmVudExpc3QnLCAnYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcsIGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyRXZlbnRTeW5jOiBhc3luYyAoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJFdmVudFN5bmMnLCAnYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcsIGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckdldDogYXN5bmMgKGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyR2V0JywgJ2JhbmtUcmFuc2ZlckdldFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgYmFuayB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBiYW5rIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJMaXN0OiBhc3luYyAoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiYW5rVHJhbnNmZXJMaXN0JywgJ2JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0JywgYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JhbmtfdHJhbnNmZXIvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQ6IGFzeW5jIChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50JywgJ2JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCcsIGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcEdldDogYXN5bmMgKGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyU3dlZXBHZXQnLCAnYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0JywgYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlclN3ZWVwTGlzdDogYXN5bmMgKGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmFua1RyYW5zZmVyU3dlZXBMaXN0JywgJ2JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QnLCBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYCB0byBnZXQgcmlzayBpbnNpZ2h0cyBmb3IgYSBsaW5rZWQgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgcmlzayBvZiBhIGJhbmsgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0fSBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGU6IGFzeW5jIChiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdDogQmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUnLCAnYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QnLCBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL2FjY291bnRfcmlzay92MS9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIER1cGxpY2F0ZSBmb3IgYSBnaXZlbiBCZWFjb24gRHVwbGljYXRlIGlkLiAgQSBCZWFjb24gRHVwbGljYXRlIHJlcHJlc2VudHMgYSBwYWlyIG9mIHNpbWlsYXIgQmVhY29uIFVzZXJzIHdpdGhpbiB5b3VyIG9yZ2FuaXphdGlvbi4gIFR3byBCZWFjb24gVXNlciByZXZpc2lvbnMgYXJlIHJldHVybmVkIGZvciBlYWNoIER1cGxpY2F0ZSByZWNvcmQgaW4gZWl0aGVyIHRoZSBgYmVhY29uX3VzZXIxYCBvciBgYmVhY29uX3VzZXIyYCByZXNwb25zZSBmaWVsZHMuICBUaGUgYGFuYWx5c2lzYCBmaWVsZCBpbiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHdoaWNoIGZpZWxkcyBtYXRjaGVkIGJldHdlZW4gYGJlYWNvbl91c2VyMWAgYW5kIGBiZWFjb25fdXNlcjJgLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIER1cGxpY2F0ZVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25EdXBsaWNhdGVHZXQ6IGFzeW5jIChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0OiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvbkR1cGxpY2F0ZUdldCcsICdiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0JywgYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL2R1cGxpY2F0ZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0fSBiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0Q3JlYXRlOiBhc3luYyAoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25SZXBvcnRDcmVhdGUnLCAnYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCcsIGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi9yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIHJlcG9ydCBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydEdldFJlcXVlc3R9IGJlYWNvblJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRHZXQ6IGFzeW5jIChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydEdldCcsICdiZWFjb25SZXBvcnRHZXRSZXF1ZXN0JywgYmVhY29uUmVwb3J0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydC9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhlIHJlcG9ydHMgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBhcmUgZXhjbHVzaXZlbHkgcmVwb3J0cyB5b3UgY3JlYXRlZCBmb3IgYSBzcGVjaWZpYyB1c2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBvbmx5IGhhdmUgb25lIGFjdGl2ZSByZXBvcnQgYXQgYSB0aW1lLCBidXQgYSBuZXcgcmVwb3J0IGNhbiBiZSBjcmVhdGVkIGlmIGEgcHJldmlvdXMgcmVwb3J0IGhhcyBiZWVuIGRlbGV0ZWQuIFRoZSByZXN1bHRzIGZyb20gdGhpcyBlbmRwb2ludCBhcmUgcGFnaW5hdGVkOyB0aGUgYG5leHRfY3Vyc29yYCBmaWVsZCB3aWxsIGJlIHBvcHVsYXRlZCBpZiB0aGVyZSBpcyBhbm90aGVyIHBhZ2Ugb2YgcmVzdWx0cyB0aGF0IGNhbiBiZSByZXRyaWV2ZWQuIFRvIGZldGNoIHRoZSBuZXh0IHBhZ2UsIHBhc3MgdGhlIGBuZXh0X2N1cnNvcmAgdmFsdWUgYXMgdGhlIGBjdXJzb3JgIHBhcmFtZXRlciBpbiB0aGUgbmV4dCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0TGlzdDogYXN5bmMgKGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uUmVwb3J0TGlzdCcsICdiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCcsIGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vcmVwb3J0L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQ6IGFzeW5jIChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0JywgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCcsIGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3Q6IGFzeW5jIChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdCcsICdiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0JywgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGFsbCBBY2NvdW50cyBsaW5rZWQgdG8gdGhpcyBCZWFjb24gVXNlci4gVGhlIGluc2lnaHRzIGZvciBlYWNoIGFjY291bnQgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3R9IGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldDogYXN5bmMgKGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldCcsICdiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCcsIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZWFjb24vdXNlci9hY2NvdW50X2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW5kIHNjYW4gYSBCZWFjb24gVXNlciBhZ2FpbnN0IHlvdXIgQmVhY29uIFByb2dyYW0sIGFjY29yZGluZyB0byB5b3VyIHByb2dyYW1cXCdzIHNldHRpbmdzLiAgV2hlbiB5b3Ugc3VibWl0IGEgbmV3IHVzZXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5OiAgICAtIFRoZSB1c2VyXFwncyBQSUkgKHByb3ZpZGVkIHdpdGhpbiB0aGUgYHVzZXJgIG9iamVjdCkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgb3RoZXIgdXNlcnMgd2l0aGluIHRoZSBCZWFjb24gUHJvZ3JhbSB5b3Ugc3BlY2lmaWVkLiBJZiBhIG1hdGNoIGlzIGZvdW5kIHRoYXQgdmlvbGF0ZXMgeW91ciBwcm9ncmFtXFwncyBcXFwiRHVwbGljYXRlIEluZm9ybWF0aW9uIEZpbHRlcmluZ1xcXCIgc2V0dGluZ3MsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcGVuZGluZ19yZXZpZXdgLiAgICAtIFRoZSB1c2VyXFwncyBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJDcmVhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJDcmVhdGU6IGFzeW5jIChiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJDcmVhdGUnLCAnYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QnLCBiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGEgQmVhY29uIFVzZXIuICBUaGUgQmVhY29uIFVzZXIgaXMgcmV0dXJuZWQgd2l0aCBhbGwgb2YgdGhlaXIgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiBhbmQgYSBgc3RhdHVzYCBiYXNlZCBvbiB0aGUgQmVhY29uIE5ldHdvcmsgZHVwbGljYXRlIHJlY29yZCBhbmQgZnJhdWQgY2hlY2tzLiBcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyR2V0UmVxdWVzdH0gYmVhY29uVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyR2V0OiBhc3luYyAoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyR2V0JywgJ2JlYWNvblVzZXJHZXRSZXF1ZXN0JywgYmVhY29uVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBCZWFjb24gVXNlciBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBCZWFjb24gVXNlclxcJ3MgaGlzdG9yeVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3R9IGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VySGlzdG9yeUxpc3Q6IGFzeW5jIChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0OiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJIaXN0b3J5TGlzdCcsICdiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0JywgYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHZpYSB0aGlzIGVuZHBvaW50LCBQbGFpZCB2YWxpZGF0ZXMgdGhhdCB0aGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlbGF0ZWQgc3RhdGUgZm9yIHRoaXMgQmVhY29uIFVzZXIuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBjaGVjazogIDEuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnRzIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIsIGFuZCAyLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicmVqZWN0ZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgZWl0aGVyIGEgQmVhY29uIFJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgQmVhY29uIFVzZXIgb3IgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBCZWFjb24gUmVwb3J0cyBvciBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBJZiB5b3UgcHJldmlvdXNseSBjcmVhdGVkIGEgQmVhY29uIFJlcG9ydCBmb3IgdGhpcyB1c2VyLCB5b3UgbXVzdCBkZWxldGUgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIi4gVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInBlbmRpbmdfcmV2aWV3XFxcIi4gIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvciBleHBsYWluaW5nIHRoZSBpc3N1ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyUmV2aWV3OiBhc3luYyAoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdiZWFjb25Vc2VyUmV2aWV3JywgJ2JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0JywgYmVhY29uVXNlclJldmlld1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JlYWNvbi91c2VyL3Jldmlld2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbSBvciBhZGQgbmV3IGFjY291bnRzIHRvIHRoZSBCZWFjb24gVXNlci4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhbiBpZGVudGl0eSBkYXRhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJVcGRhdGU6IGFzeW5jIChiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2JlYWNvblVzZXJVcGRhdGUnLCAnYmVhY29uVXNlclVwZGF0ZVJlcXVlc3QnLCBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmVhY29uL3VzZXIvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXkgaW5zdGVhZCBvZiB0aGUgb2xkZXIgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC4gVGhlIFtgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeSB0YXhvbm9teWAgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYW5kIGlzIG5vdCBhY2Nlc3NpYmxlIHZpYSBBUEkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldDogYXN5bmMgKGJvZHk6IG9iamVjdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdib2R5JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjYXRlZ29yaWVzR2V0JywgJ2JvZHknLCBib2R5KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jYXRlZ29yaWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChib2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBJdGVtIGNvbnNlbnQgZXZlbnRzLiBDb25zZW50IGxvZ3MgYXJlIG9ubHkgYXZhaWxhYmxlIGZvciBldmVudHMgb2NjdXJyaW5nIG9uIG9yIGFmdGVyIE5vdmVtYmVyIDcsIDIwMjQuIFVwIHRvIHRocmVlIHllYXJzIG9mIGNvbnNlbnQgbG9ncyB3aWxsIGJlIGF2YWlsYWJsZSB2aWEgdGhlIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgaXRlbSBjb25zZW50IGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0NvbnNlbnRFdmVudHNHZXRSZXF1ZXN0fSBjb25zZW50RXZlbnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNvbnNlbnRFdmVudHNHZXQ6IGFzeW5jIChjb25zZW50RXZlbnRzR2V0UmVxdWVzdDogQ29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY29uc2VudEV2ZW50c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NvbnNlbnRFdmVudHNHZXQnLCAnY29uc2VudEV2ZW50c0dldFJlcXVlc3QnLCBjb25zZW50RXZlbnRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY29uc2VudC9ldmVudHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlcyBhbGwgZXhpc3RpbmcgQ1JCIEJhbmsgSW5jb21lIGFuZCBCYXNlIHJlcG9ydHMgZm9yIHRoZSBjb25zdW1lciBpbiBQREYgZm9ybWF0LiAgUmVzcG9uc2UgaXMgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBSZXBvcnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0fSBjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zdW1lclJlcG9ydFBkZkdldDogYXN5bmMgKGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdDogQ29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY29uc3VtZXJSZXBvcnRQZGZHZXQnLCAnY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0JywgY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jb25zdW1lcl9yZXBvcnQvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvY3JlYXRlYCBjcmVhdGVzIGEgQ1JBIHJlcG9ydCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDUkEgcmVwb3J0IGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3R9IGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQmFua0luY29tZUNyZWF0ZTogYXN5bmMgKGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0OiBDcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQmFua0luY29tZUNyZWF0ZScsICdjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCcsIGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvYmFua19pbmNvbWUvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2dldGAgcmV0dXJucyB0aGUgYmFuayBpbmNvbWUgcmVwb3J0KHMpIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFCYW5rSW5jb21lR2V0OiBhc3luYyAoY3JhQmFua0luY29tZUdldFJlcXVlc3Q6IENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFCYW5rSW5jb21lR2V0JywgJ2NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0JywgY3JhQmFua0luY29tZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9iYW5rX2luY29tZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBCYXNlIFJlcG9ydCBmb3IgeW91ciB1c2VyLCBhbGxvd2luZyB5b3UgdG8gcmVjZWl2ZSBjb21wcmVoZW5zaXZlIGJhbmsgYWNjb3VudCBhbmQgY2FzaCBmbG93IGRhdGEuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0JywgJ2NyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2Jhc2VfcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQ2FzaGZsb3cgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cywgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9jYXNoZmxvd19pbnNpZ2h0c2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgd2Ugd2lsbCBnZW5lcmF0ZSB0aGUgaW5zaWdodHMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LiBJbiB0aGlzIGNhc2UsIHlvdSBtYXkgb3B0aW9uYWxseSBwcm92aWRlIHBhcmFtZXRlcnMgdW5kZXIgYG9wdGlvbnNgIHRvIGNvbmZpZ3VyZSB3aGljaCBpbnNpZ2h0cyB5b3Ugd2FudCB0byByZWNlaXZlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtpbmcgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldCcsICdjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9jYXNoZmxvd19pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjcmVhdGVzIGEgQ29uc3VtZXIgUmVwb3J0IHBvd2VyZWQgYnkgUGxhaWQgQ2hlY2suIFlvdSBjYW4gY2FsbCB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyByZXBvcnQgaWYgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCB3YXMgb21pdHRlZCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbi4gSWYgeW91IGRpZCBwcm92aWRlIGEgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbiwgdGhlbiBQbGFpZCBDaGVjayB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIExpbmsgcHJvY2VzcywgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBiZWZvcmUgcmV0cmlldmluZyB0aGUgcmVwb3J0LiAgIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQuIE5vdGUgdGhhdCByZWZyZXNoaW5nIG9yIHJlZ2VuZXJhdGluZyBhIHJlcG9ydCBpcyBhIGJpbGxhYmxlIGV2ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDb25zdW1lciBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0Q3JlYXRlOiBhc3luYyAoY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFDaGVja1JlcG9ydENyZWF0ZScsICdjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QnLCBjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIEluY29tZSBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNu4oCZdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5mb3JtYXRpb24gZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldCcsICdjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L2luY29tZV9pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBOZXR3b3JrIEluc2lnaHRzIHByb2R1Y3QgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9uZXR3b3JrX2F0dHJpYnV0ZXNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgZ2VuZXJhdGUgdGhlIGF0dHJpYnV0ZXMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGF0dHJpYnV0ZXMgZm9yIHRoZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQnLCAnY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L25ldHdvcmtfaW5zaWdodHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIFBhcnRuZXIgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGNhbGwgb3VyIHBhcnRuZXJzIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHBhcnRuZXJzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldDogYXN5bmMgKGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQnLCAnY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0JywgY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvY2hlY2tfcmVwb3J0L3BhcnRuZXJfaW5zaWdodHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvcGRmL2dldGAgcmV0cmlldmVzIHRoZSBtb3N0IHJlY2VudCBDb25zdW1lciBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQnkgZGVmYXVsdCwgdGhlIG1vc3QgcmVjZW50IEJhc2UgUmVwb3J0IChpZiBpdCBleGlzdHMpIGZvciB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkLiBUbyByZXF1ZXN0IHRoYXQgdGhlIG1vc3QgcmVjZW50IEluY29tZSBJbnNpZ2h0cyByZXBvcnQgYmUgaW5jbHVkZWQgaW4gdGhlIFBERiBhcyB3ZWxsLCB1c2UgdGhlIGBhZGQtb25zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQ29uc3VtZXIgUmVwb3J0cyBhcyBhIFBERlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQ2hlY2tSZXBvcnRQZGZHZXQ6IGFzeW5jIChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUNoZWNrUmVwb3J0UGRmR2V0JywgJ2NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCcsIGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9hcHBsaWNhdGlvbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBsb2FuIGFwcGxpY2F0aW9ucyBhbmQgZGVjaXNpb25zLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXI6IGFzeW5jIChjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXInLCAnY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QnLCBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgICAgICogQHBhcmFtIHtDUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdH0gY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1JlZ2lzdGVyOiBhc3luYyAoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3Q6IENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFMb2Fuc1JlZ2lzdGVyJywgJ2NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0JywgY1JBTG9hbnNSZWdpc3RlclJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9sb2Fucy9yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9sb2Fucy91bnJlZ2lzdGVyYCBpbmRpY2F0ZXMgdGhlIGxvYW5zIGhhdmUgcmVhY2hlZCBhIGZpbmFsIHN0YXR1cyBhbmQgbm8gZnVydGhlciB1cGRhdGVzIGFyZSBleHBlY3RlZC5cbiAgICAgICAgICogQHN1bW1hcnkgVW5yZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdH0gY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zVW5yZWdpc3RlcjogYXN5bmMgKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhTG9hbnNVbnJlZ2lzdGVyJywgJ2NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QnLCBjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3VwZGF0ZWAgdXBkYXRlcyBsb2FuIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YXR1cyBhbmQgcGF5bWVudCBoaXN0b3J5LlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGVzIGxvYW4gZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc1VwZGF0ZVJlcXVlc3R9IGNyYUxvYW5zVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zVXBkYXRlOiBhc3luYyAoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0OiBDcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTG9hbnNVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFMb2Fuc1VwZGF0ZScsICdjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QnLCBjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9sb2Fucy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX3Rva2VuYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0OiBhc3luYyAoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmFNb25pdG9yaW5nSW5zaWdodHNHZXQnLCAnY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCcsIGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyYS9tb25pdG9yaW5nX2luc2lnaHRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgdG8gaW5zaWdodHMgZm9yIGEgdXNlclxcJ3MgbGlua2VkIENSQSBpdGVtcywgd2hpY2ggYXJlIHVwZGF0ZWQgZXZlcnkgZGF5IChiZXN0LWVmZm9ydCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZTogYXN5bmMgKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlJywgJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QnLCBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy9zdWJzY3JpYmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gdW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91c2x5IHN1YnNjcmliZWQgTW9uaXRvcmluZyBJbnNpZ2h0cy5cbiAgICAgICAgICogQHN1bW1hcnkgVW5zdWJzY3JpYmUgZnJvbSBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZTogYXN5bmMgKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUnLCAnY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0JywgY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvbW9uaXRvcmluZ19pbnNpZ2h0cy91bnN1YnNjcmliZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgIHJldHVybnMgY2FzaCBmbG93IGluc2lnaHRzIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYVBhcnRuZXJJbnNpZ2h0c0dldDogYXN5bmMgKGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JhUGFydG5lckluc2lnaHRzR2V0JywgJ2NyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QnLCBjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIE5ldyBQbGFpZCBjdXN0b21lcnMgd2lsbCBiZSB1bmFibGUgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFuZCBleGlzdGluZyBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gbWlncmF0ZSB0byB0aGUgbmV3ZXIsIGBsaW5rX3Rva2VuYC1iYXNlZCBmbG93LiBUaGUgcmVjb21tZW5kZWQgZmxvdyBpcyB0byBwcm92aWRlIHRoZSBgcGF5bWVudF9pZGAgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAsIHdoaWNoIHJldHVybnMgYSBgbGlua190b2tlbmAgdXNlZCB0byBpbml0aWFsaXplIExpbmsuICBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC90b2tlbi9jcmVhdGVgIGlzIHVzZWQgdG8gY3JlYXRlIGEgYHBheW1lbnRfdG9rZW5gLCB3aGljaCBjYW4gdGhlbiBiZSB1c2VkIGluIExpbmsgaW5pdGlhbGl6YXRpb24gdG8gZW50ZXIgYSBwYXltZW50IGluaXRpYXRpb24gZmxvdy4gWW91IGNhbiBvbmx5IHVzZSBhIGBwYXltZW50X3Rva2VuYCBvbmNlLiBJZiB0aGlzIGF0dGVtcHQgZmFpbHMsIHRoZSBlbmQgdXNlciBhYm9ydHMgdGhlIGZsb3csIG9yIHRoZSB0b2tlbiBleHBpcmVzLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBwYXltZW50IHRva2VuLiBDcmVhdGluZyBhIG5ldyBwYXltZW50IHRva2VuIGRvZXMgbm90IHJlcXVpcmUgZW5kIHVzZXIgaW5wdXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVhdGVQYXltZW50VG9rZW46IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWF0ZVBheW1lbnRUb2tlbicsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldDogYXN5bmMgKHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdyZXF1ZXN0Qm9keScgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0JywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHJlcXVlc3RCb2R5LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlOiBhc3luYyAoY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZScsICdjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QnLCBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBlbXBsb3ltZW50IHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0VtcGxveW1lbnRHZXQ6IGFzeW5jIChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCcsIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS9jcmVkaXQvdjEvYmFua19lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLiBUbyByZXR1cm4gb2xkZXIgcmVwb3J0cywgdXNlIHRoZSBgb3B0aW9ucy5jb3VudGAgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVHZXQnLCAnY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9wZGYvZ2V0YCByZXR1cm5zIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZm9yIGEgc3BlY2lmaWVkIHVzZXIgaW4gUERGIGZvcm1hdC4gIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gaW4gUERGIGZvcm1hdFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVQZGZHZXQ6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVQZGZHZXQnLCAnY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3BkZi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgZGF0YSBmb3IgYSBzcGVjaWZpYyB1c2VyLiBJZiB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGlzIG5vIGxvbmdlciB2YWxpZCAoaS5lLiBkZWxldGVkKSwgdGhlIGVuZHBvaW50IHdpbGwgcmVmcmVzaCB0aGUgbW9zdCByZWNlbnQgdmFsaWQgcmVwb3J0IGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSB1c2VyXFwncyBiYW5rIGluY29tZSBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZVJlZnJlc2g6IGFzeW5jIChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoJywgJ2NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSBhbmQgdW5zdWJzY3JpYmUgdG8gcHJvYWN0aXZlIG5vdGlmaWNhdGlvbnMgZm9yIGEgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlOiBhc3luYyAoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZScsICdjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGRhdGEgZm9yIGEgdXNlclxcJ3MgdXBsb2FkZWQgYmFuayBzdGF0ZW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldDogYXN5bmMgKGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0JywgJ2NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnLCBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0OiBhc3luYyAoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRFbXBsb3ltZW50R2V0JywgJ2NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0JywgY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0OiBhc3luYyAoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0OiBDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldCcsICdjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QnLCBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9mcmVkZGllX21hYy9yZXBvcnRzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBnZXRzIHBheXJvbGwgaW5jb21lIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHVzZXIsIGVpdGhlciBhcyBhIHJlc3VsdCBvZiB0aGUgdXNlciBjb25uZWN0aW5nIHRvIHRoZWlyIHBheXJvbGwgcHJvdmlkZXIgb3IgdXBsb2FkaW5nIGEgcGF5IHJlbGF0ZWQgZG9jdW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdXNlclxcJ3MgcGF5cm9sbCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVHZXQnLCAnY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QnLCBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGU6IGFzeW5jIChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncmVxdWVzdEJvZHknIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlJywgJ3JlcXVlc3RCb2R5JywgcmVxdWVzdEJvZHkpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocmVxdWVzdEJvZHksIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2s6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVjaycsICdjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYSBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2g6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoJywgJ2NyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCcsIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQ6IGFzeW5jIChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldCcsICdjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0JywgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IGRpcmVjdGx5IHdpdGggYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBUaGUgc2hhcmVkIEFzc2V0IFJlcG9ydCBpcyB0aGUgZXhhY3Qgc2FtZSBBc3NldCBSZXBvcnQgb3JpZ2luYWxseSBjcmVhdGVkIGluIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAuICBUbyBncmFudCBhIHRoaXJkIHBhcnR5IGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9jcmVkaXQvcmVsYXkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgcmVsYXlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB5b3VyIHRoaXJkIHBhcnR5LiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBzZWNvbmRhcnlfY2xpZW50X2lkYDsgZm9yIGV4YW1wbGUsIGBjZTViZDMyOGRjZDM0MTIzNDU2YC4gWW91XFwnbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBgcmVsYXlfdG9rZW5gIGZvciBlYWNoIHRoaXJkIHBhcnR5IHRoYXQgbmVlZHMgYWNjZXNzIHRvIHRoZSByZXBvcnQgb24geW91ciBiZWhhbGYuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlbGF5IHRva2VuIHRvIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIGEgcGFydG5lciBjbGllbnRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5Q3JlYXRlOiBhc3luYyAoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheUNyZWF0ZScsICdjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QnLCBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L2dldGAgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVjZWl2ZSBhIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3VcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUdldFJlcXVlc3R9IGNyZWRpdFJlbGF5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5R2V0OiBhc3luYyAoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheUdldCcsICdjcmVkaXRSZWxheUdldFJlcXVlc3QnLCBjcmVkaXRSZWxheUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBwZGYgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheVBkZkdldDogYXN5bmMgKGNyZWRpdFJlbGF5UERGR2V0UmVxdWVzdDogQ3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlQZGZHZXQnLCAnY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0JywgY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVmcmVzaDogYXN5bmMgKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVsYXlSZWZyZXNoJywgJ2NyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QnLCBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gaW52YWxpZGF0ZSBhIGByZWxheV90b2tlbmAuIFRoZSB0aGlyZCBwYXJ0eSBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFjY2VzcyBvciByZWZyZXNoIHRoZSByZXBvcnRzIHdoaWNoIHRoZSBgcmVsYXlfdG9rZW5gIGdpdmVzIGFjY2VzcyB0by4gVGhlIG9yaWdpbmFsIHJlcG9ydCwgYXNzb2NpYXRlZCBJdGVtcywgYW5kIG90aGVyIHJlbGF5IHRva2VucyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBzYW1lIHJlcG9ydCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBgcmVsYXlfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcmVsYXkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3R9IGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlbGF5UmVtb3ZlOiBhc3luYyAoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdjcmVkaXRSZWxheVJlbW92ZScsICdjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QnLCBjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2NyZWRpdC9yZWxheS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gQXVkaXQgQ29weS4gUmVtb3ZpbmcgYW4gQXVkaXQgQ29weSBpbnZhbGlkYXRlcyB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBpdCwgbWVhbmluZyBib3RoIHlvdSBhbmQgYW55IHRoaXJkIHBhcnRpZXMgaG9sZGluZyB0aGUgdG9rZW4gd2lsbCBubyBsb25nZXIgYmUgYWJsZSB0byB1c2UgaXQgdG8gYWNjZXNzIFJlcG9ydCBkYXRhLiBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFJlcG9ydCBkYXRhIGFuZCBvdGhlciBBdWRpdCBDb3BpZXMgb2YgaXQgYXJlIG5vdCBhZmZlY3RlZCBhbmQgd2lsbCByZW1haW4gYWNjZXNzaWJsZSBhZnRlciByZW1vdmluZyB0aGUgZ2l2ZW4gQXVkaXQgQ29weS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEF1ZGl0IENvcHkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZTogYXN5bmMgKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlJywgJ2NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCcsIGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRTZXNzaW9uc0dldDogYXN5bmMgKGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnY3JlZGl0U2Vzc2lvbnNHZXQnLCAnY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0JywgY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9jcmVkaXQvc2Vzc2lvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyR2V0OiBhc3luYyAoZGFzaGJvYXJkVXNlckdldFJlcXVlc3Q6IERhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkYXNoYm9hcmRVc2VyR2V0JywgJ2Rhc2hib2FyZFVzZXJHZXRSZXF1ZXN0JywgZGFzaGJvYXJkVXNlckdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2Rhc2hib2FyZF91c2VyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9saXN0YCBlbmRwb2ludCBwcm92aWRlcyBkZXRhaWxzIChzdWNoIGFzIGVtYWlsIGFkZHJlc3MpIGFsbCBEYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC4gVGhpcyBjYW4gdXNlIHVzZWQgdG8gYXVkaXQgb3IgdHJhY2sgdGhlIGxpc3Qgb2YgcmV2aWV3ZXJzIGZvciBNb25pdG9yLCBCZWFjb24sIGFuZCBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyTGlzdDogYXN5bmMgKGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGFzaGJvYXJkVXNlckxpc3QnLCAnZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0JywgZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kYXNoYm9hcmRfdXNlci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGU6IGFzeW5jIChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdDogRGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2RlcG9zaXRTd2l0Y2hBbHRDcmVhdGUnLCAnZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZGVwb3NpdF9zd2l0Y2gvYWx0L2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaENyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaENyZWF0ZScsICdkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCcsIGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gaG93IHRoZSB1c2VyIGhhcyBjb25maWd1cmVkIHRoZWlyIHBheXJvbGwgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YXRlIG9mIHRoZSBzd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gYnVpbGQgbG9naWMgcmVsYXRlZCB0byB0aGUgdXNlclxcJ3MgZGlyZWN0IGRlcG9zaXQgYWxsb2NhdGlvbiBwcmVmZXJlbmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoR2V0UmVxdWVzdH0gZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoR2V0OiBhc3luYyAoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdkZXBvc2l0U3dpdGNoR2V0JywgJ2RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0JywgZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2RlcG9zaXRfc3dpdGNoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZTogYXN5bmMgKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlJywgJ2RlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QnLCBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9kZXBvc2l0X3N3aXRjaC90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveWVycy9zZWFyY2hgIGFsbG93cyB5b3UgdGhlIGFiaWxpdHkgdG8gc2VhcmNoIFBsYWlk4oCZcyBkYXRhYmFzZSBvZiBrbm93biBlbXBsb3llcnMsIGZvciB1c2Ugd2l0aCBEZXBvc2l0IFN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBlbmRwb2ludCB0byBsb29rIHVwIGEgdXNlclxcJ3MgZW1wbG95ZXIgaW4gb3JkZXIgdG8gY29uZmlybSB0aGF0IHRoZXkgYXJlIHN1cHBvcnRlZC4gVXNlcnMgd2l0aCBub24tc3VwcG9ydGVkIGVtcGxveWVycyBjYW4gdGhlbiBiZSByb3V0ZWQgb3V0IG9mIHRoZSBEZXBvc2l0IFN3aXRjaCBmbG93LiAgVGhlIGRhdGEgaW4gdGhlIGVtcGxveWVyIGRhdGFiYXNlIGlzIGN1cnJlbnRseSBsaW1pdGVkLiBBcyB0aGUgRGVwb3NpdCBTd2l0Y2ggYW5kIEluY29tZSBwcm9kdWN0cyBwcm9ncmVzcyB0aHJvdWdoIHRoZWlyIHJlc3BlY3RpdmUgYmV0YSBwZXJpb2RzLCBtb3JlIGVtcGxveWVycyBhcmUgYmVpbmcgcmVndWxhcmx5IGFkZGVkLiBCZWNhdXNlIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBmcmVxdWVudGx5IHVwZGF0ZWQsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBkbyBub3QgY2FjaGUgb3Igc3RvcmUgZGF0YSBmcm9tIHRoaXMgZW5kcG9pbnQgZm9yIG1vcmUgdGhhbiBhIGRheS5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95ZXJzU2VhcmNoUmVxdWVzdH0gZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGVtcGxveWVyc1NlYXJjaDogYXN5bmMgKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95ZXJzU2VhcmNoJywgJ2VtcGxveWVyc1NlYXJjaFJlcXVlc3QnLCBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3llcnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7RW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldCcsICdlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcsIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBmZHhOb3RpZmljYXRpb25zOiBhc3luYyAoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnZkRYTm90aWZpY2F0aW9uJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdmZHhOb3RpZmljYXRpb25zJywgJ2ZEWE5vdGlmaWNhdGlvbicsIGZEWE5vdGlmaWNhdGlvbilcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L25vdGlmaWNhdGlvbnNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoZkRYTm90aWZpY2F0aW9uLCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhIHNwZWNpZmljIHJlY2lwaWVudFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSByZWNpcGllbnRJZCBSZWNpcGllbnQgSWRlbnRpZmllci4gVW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb0FVVEhTVEFURUlEXSBUaGUgdmFsdWUgdGhhdCBpcyBwYXNzZWQgaW50byB0aGUgT0F1dGggVVJJIFxcJiMzOTtzdGF0ZVxcJiMzOTsgcXVlcnkgcGFyYW1ldGVyLlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50OiBhc3luYyAocmVjaXBpZW50SWQ6IHN0cmluZywgb0FVVEhTVEFURUlEPzogc3RyaW5nLCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3JlY2lwaWVudElkJyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdnZXRSZWNpcGllbnQnLCAncmVjaXBpZW50SWQnLCByZWNpcGllbnRJZClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvZmR4L3JlY2lwaWVudC97cmVjaXBpZW50SWR9YFxuICAgICAgICAgICAgICAgIC5yZXBsYWNlKGB7JHtcInJlY2lwaWVudElkXCJ9fWAsIGVuY29kZVVSSUNvbXBvbmVudChTdHJpbmcocmVjaXBpZW50SWQpKSk7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIGlmIChvQVVUSFNUQVRFSUQgIT09IHVuZGVmaW5lZCAmJiBvQVVUSFNUQVRFSUQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnT0FVVEgtU1RBVEUtSUQnXSA9IFN0cmluZyhvQVVUSFNUQVRFSUQpO1xuICAgICAgICAgICAgfVxuXG5cbiAgICBcbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50czogYXN5bmMgKG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9mZHgvcmVjaXBpZW50c2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdHRVQnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgIHRvIHJldHJpZXZlIGlkZW50aXR5IGRldGFpbHMgd2hlbiB1c2luZyBbSWRlbnRpdHkgRG9jdW1lbnQgVXBsb2FkXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2lkZW50aXR5L2lkZW50aXR5LWRvY3VtZW50LXVwbG9hZC8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIHVwbG9hZGVkIGRvY3VtZW50IGlkZW50aXR5XG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldDogYXN5bmMgKGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0JywgJ2lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QnLCBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9kb2N1bWVudHMvdXBsb2Fkcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldDogYXN5bmMgKGlkZW50aXR5R2V0UmVxdWVzdDogSWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlHZXQnLCAnaWRlbnRpdHlHZXRSZXF1ZXN0JywgaWRlbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlNYXRjaDogYXN5bmMgKGlkZW50aXR5TWF0Y2hSZXF1ZXN0OiBJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eU1hdGNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlNYXRjaCcsICdpZGVudGl0eU1hdGNoUmVxdWVzdCcsIGlkZW50aXR5TWF0Y2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eS9tYXRjaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eU1hdGNoUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgZm9yIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVJlZnJlc2g6IGFzeW5jIChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5UmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lkZW50aXR5UmVmcmVzaCcsICdpZGVudGl0eVJlZnJlc2hSZXF1ZXN0JywgaWRlbnRpdHlSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaWRlbnRpdHkvcmVmcmVzaGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vYXV0b2ZpbGwvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gZm9yIHRoZSB1c2VyIHNwZWNpZmllZCBieSB0aGUgYGNsaWVudF91c2VyX2lkYCBmaWVsZC4gVGhlIHJlcXVpcmVtZW50cyBhbmQgYmVoYXZpb3Igb2YgdGhlIHZlcmlmaWNhdGlvbiBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgYHRlbXBsYXRlX2lkYCBwcm92aWRlZC4gSWYgeW91IGRvblxcJ3Qga25vdyB3aGV0aGVyIHRoZSBhc3NvY2lhdGVkIHVzZXIgYWxyZWFkeSBoYXMgYW4gYWN0aXZlIElkZW50aXR5IFZlcmlmaWNhdGlvbiwgeW91IGNhbiBzcGVjaWZ5IGBcXFwiaXNfaWRlbXBvdGVudFxcXCI6IHRydWVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFdpdGggaWRlbXBvdGVuY3kgZW5hYmxlZCwgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIHdpbGwgb25seSBiZSBjcmVhdGVkIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGZvciB0aGUgYXNzb2NpYXRlZCBgY2xpZW50X3VzZXJfaWRgIGFuZCBgdGVtcGxhdGVfaWRgLiBJZiBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gaXMgZm91bmQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgdW5tb2RpZmllZCB3aXRoIGFuIGAyMDAgT0tgIEhUVFAgc3RhdHVzIGNvZGUuICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgZW5kcG9pbnQgdG8gc3VwcGx5IGluZm9ybWF0aW9uIHlvdSBhbHJlYWR5IGhhdmUgY29sbGVjdGVkIGFib3V0IHRoZSB1c2VyOyBpZiBhbnkgb2YgdGhlc2UgZmllbGRzIGFyZSBzcGVjaWZpZWQsIHRoZSBzY3JlZW5zIHByb21wdGluZyB0aGUgdXNlciB0byBlbnRlciB0aGVtIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgdGhlIExpbmsgZmxvdy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZScsICdpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QnLCBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkdldDogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25HZXQnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0JywgaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGaWx0ZXIgYW5kIGxpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9ucyBjcmVhdGVkIGJ5IHlvdXIgYWNjb3VudFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IElkZW50aXR5IFZlcmlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0OiBhc3luYyAoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QnLCAnaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lkZW50aXR5X3ZlcmlmaWNhdGlvbi9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cnkgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeTogYXN5bmMgKGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeScsICdpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCcsIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pZGVudGl0eV92ZXJpZmljYXRpb24vcmV0cnlgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUnLCAnaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCcsIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgcHJvdmlkZXMgdGhlIGFiaWxpdHkgdG8gZG93bmxvYWQgdGhlIHNvdXJjZSBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBJZiBEb2N1bWVudCBJbmNvbWUgd2FzIHVzZWQsIHRoZSBkb2N1bWVudHMgd2lsbCBiZSB0aG9zZSB0aGUgdXNlciBwcm92aWRlZCBpbiBMaW5rLiBGb3IgUGF5cm9sbCBJbmNvbWUsIHRoZSBtb3N0IHJlY2VudCBmaWxlcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGZyb20gdGhlIHBheXJvbGwgcHJvdmlkZXIgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGlzIGVuZHBvaW50LiAgVGhlIHJlc3BvbnNlIHRvIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIGlzIGEgWklQIGZpbGUgaW4gYmluYXJ5IGRhdGEuIElmIGEgYGRvY3VtZW50X2lkYCBpcyBwYXNzZWQsIGEgc2luZ2xlIGRvY3VtZW50IHdpbGwgYmUgY29udGFpbmVkIGluIHRoaXMgZmlsZS4gSWYgbm90LCB0aGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGFsbCBkb2N1bWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB2ZXJpZmljYXRpb24uICBUaGUgYHJlcXVlc3RfaWRgIGlzIHJldHVybmVkIGluIHRoZSBgUGxhaWQtUmVxdWVzdC1JRGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQnLCAnaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldDogYXN5bmMgKGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2luY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQnLCAnaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0JywgaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrOiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjaycsICdpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi90YXhmb3Jtcy9nZXRgIHJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmcm9tIGZvcm1zIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ1xcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0YXggZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0OiBhc3luYyAoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldCcsICdpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QnLCBpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luY29tZS92ZXJpZmljYXRpb24vdGF4Zm9ybXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0OiBhc3luYyAoaW5zdGl0dXRpb25zR2V0UmVxdWVzdDogSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnN0aXR1dGlvbnNHZXQnLCAnaW5zdGl0dXRpb25zR2V0UmVxdWVzdCcsIGluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2luc3RpdHV0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldEJ5SWQ6IGFzeW5jIChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2luc3RpdHV0aW9uc0dldEJ5SWQnLCAnaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW5zdGl0dXRpb25zL2dldF9ieV9pZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgZm9yIGluc3RpdHV0aW9ucyB0aGF0IG1hdGNoIHRoZSBxdWVyeSBwYXJhbWV0ZXJzLCB1cCB0byBhIG1heGltdW0gb2YgdGVuIGluc3RpdHV0aW9ucyBwZXIgcXVlcnkuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgcGFyYW1ldGVycyB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaGFzIHNpbmNlIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdH0gaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc1NlYXJjaDogYXN5bmMgKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW5zdGl0dXRpb25zU2VhcmNoJywgJ2luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QnLCBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnN0aXR1dGlvbnMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRhdGEgbmVlZGVkIHRvIGF1dGhvcml6ZSBhbiBpbnZlc3RtZW50cyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3R9IGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnZlc3RtZW50c0F1dGhHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2ludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzQXV0aEdldCcsICdpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0JywgaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzSG9sZGluZ3NHZXQ6IGFzeW5jIChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2ludmVzdG1lbnRzSG9sZGluZ3NHZXQnLCAnaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJbnZlc3RtZW50cyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCBpbnZlc3RtZW50IGhvbGRpbmdzIGFuZCB0cmFuc2FjdGlvbnMgZm9yIGFuIEl0ZW0uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgSW52ZXN0bWVudHMtZW5hYmxlZCBJdGVtLiBJZiBjaGFuZ2VzIHRvIGludmVzdG1lbnRzIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIHdlYmhvb2tzOiBbYEhPTERJTkdTOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNob2xkaW5ncy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBob2xkaW5ncyBhcmUgZGV0ZWN0ZWQsIGFuZCBbYElOVkVTVE1FTlRTX1RSQU5TQUNUSU9OUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaW52ZXN0bWVudHNfdHJhbnNhY3Rpb25zLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gVGhpcyB3ZWJob29rIHdpbGwgdHlwaWNhbGx5IG5vdCBmaXJlIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LCBkdWUgdG8gdGhlIGxhY2sgb2YgZHluYW1pYyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhbmQgaG9sZGluZ3MgZGF0YS4gVG8gdGVzdCB0aGlzIHdlYmhvb2sgaW4gU2FuZGJveCwgY2FsbCBgL3NhbmRib3gvaXRlbS9maXJlX3dlYmhvb2tgLiBVcGRhdGVkIGhvbGRpbmdzIGFuZCBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBhbmQgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gTm90ZSB0aGF0IHRoZSBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgYnkgYWxsIGluc3RpdHV0aW9ucy4gSWYgY2FsbGVkIG9uIGFuIEl0ZW0gZnJvbSBhbiBpbnN0aXR1dGlvbiB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmdW5jdGlvbmFsaXR5LCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9TVVBQT1JURURgIGVycm9yLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSW52ZXN0bWVudHMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdH0gaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzUmVmcmVzaDogYXN5bmMgKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaW52ZXN0bWVudHNSZWZyZXNoJywgJ2ludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QnLCBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pbnZlc3RtZW50cy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzR2V0OiBhc3luYyAoaXNzdWVzR2V0UmVxdWVzdDogSXNzdWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpc3N1ZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpc3N1ZXNHZXQnLCAnaXNzdWVzR2V0UmVxdWVzdCcsIGlzc3Vlc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2lzc3Vlcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXNzdWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBTZWFyY2ggZm9yIGFuIGlzc3VlIGFzc29jaWF0ZWQgd2l0aCBvbmUgb2YgdGhlIGZvbGxvd2luZyBpZGVudGlmaWVyczogIGBpdGVtX2lkYCwgYGxpbmtfc2Vzc2lvbl9pZGAgb3IgTGluayBzZXNzaW9uIGByZXF1ZXN0X2lkYC4gIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgYElzc3VlYCBvYmplY3RzLCB3aXRoIGFuIGVtcHR5IGxpc3QgaW5kaWNhdGluZyB0aGF0IG5vIGlzc3VlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBpZGVudGlmaWVyLiBBdCBsZWFzdCBvbmUgb2YgdGhlIGlkZW50aWZpZXJzIG11c3QgYmUgcHJvdmlkZWQgdG8gcGVyZm9ybSB0aGUgc2VhcmNoLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU2VhcmNoUmVxdWVzdH0gaXNzdWVzU2VhcmNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc1NlYXJjaDogYXN5bmMgKGlzc3Vlc1NlYXJjaFJlcXVlc3Q6IElzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXNzdWVzU2VhcmNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXNzdWVzU2VhcmNoJywgJ2lzc3Vlc1NlYXJjaFJlcXVlc3QnLCBpc3N1ZXNTZWFyY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pc3N1ZXMvc2VhcmNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGlzc3Vlc1NlYXJjaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGEgdXNlciB0byBzdWJzY3JpYmUgdG8gdXBkYXRlcyBvbiBhIHNwZWNpZmljIGBJc3N1ZWAgdXNpbmcgYSBQT1NUIG1ldGhvZC4gU3Vic2NyaWJlcnMgd2lsbCByZWNlaXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcywgcGFydGljdWxhcmx5IHdoZW4gcmVzb2x2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1N1YnNjcmliZVJlcXVlc3R9IGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpc3N1ZXNTdWJzY3JpYmU6IGFzeW5jIChpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0OiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2lzc3Vlc1N1YnNjcmliZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2lzc3Vlc1N1YnNjcmliZScsICdpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0JywgaXNzdWVzU3Vic2NyaWJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXNzdWVzL3N1YnNjcmliZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZTogYXN5bmMgKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0OiBJdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZScsICdpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCcsIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjdGl2aXR5TGlzdFJlcXVlc3R9IGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjdGl2aXR5TGlzdDogYXN5bmMgKGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFjdGl2aXR5TGlzdCcsICdpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCcsIGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FjdGl2aXR5L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQXBwbGljYXRpb25MaXN0OiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25MaXN0JywgJ2l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0JywgaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZTogYXN5bmMgKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlJywgJ2l0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QnLCBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2FwcGxpY2F0aW9uL3Njb3Blcy91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb24uIE9uIGFuIHVubGluayByZXF1ZXN0LCBQbGFpZCB3aWxsIGltbWVkaWF0ZWx5IHJldm9rZSB0aGUgQXBwbGljYXRpb27igJlzIGFjY2VzcyB0byB0aGUgVXNlcuKAmXMgZGF0YS4gIFRoZSBVc2VyIHdpbGwgaGF2ZSB0byByZWRvIHRoZSBPQXV0aCBhdXRoZW50aWNhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIHJlc3RvcmUgZnVuY3Rpb25hbGl0eS4gIFRoaXMgZW5kcG9pbnQgb25seSByZW1vdmVzIG9uZ29pbmcgZGF0YSBhY2Nlc3MgcGVybWlzc2lvbnMsIHRoZXJlZm9yZSB0aGUgVXNlciB3aWxsIG5lZWQgdG8gcmVhY2ggb3V0IHRvIHRoZSBBcHBsaWNhdGlvbiBpdHNlbGYgaW4gb3JkZXIgdG8gZGlzYWJsZSBhbmQgZGVsZXRlIHRoZWlyIGFjY291bnQgYW5kIGRlbGV0ZSBhbnkgZGF0YSB0aGF0IHRoZSBBcHBsaWNhdGlvbiBhbHJlYWR5IHJlY2VpdmVkIChpZiB0aGUgQXBwbGljYXRpb24gZG9lcyBub3QgZG8gc28gYnkgZGVmYXVsdCkuICBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgaW4gcmVhbCB0aW1lIGFzIHRoZSBVc2VyIGlzIHVubGlua2luZyBhbiBBcHBsaWNhdGlvbiwgYW5kIHNob3VsZCBub3QgYmUgYmF0Y2hlZCBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIGlzIHJlZmxlY3RlZCBhcyBzb29uIGFzIHBvc3NpYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uVW5saW5rOiBhc3luYyAoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQXBwbGljYXRpb25VbmxpbmsnLCAnaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCcsIGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vYXBwbGljYXRpb24vdW5saW5rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuOiBhc3luYyAoaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtQ3JlYXRlUHVibGljVG9rZW4nLCAnaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldDogYXN5bmMgKGl0ZW1HZXRSZXF1ZXN0OiBJdGVtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUdldCcsICdpdGVtR2V0UmVxdWVzdCcsIGl0ZW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEltcG9ydCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUltcG9ydFJlcXVlc3R9IGl0ZW1JbXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUltcG9ydDogYXN5bmMgKGl0ZW1JbXBvcnRSZXF1ZXN0OiBJdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdpdGVtSW1wb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbUltcG9ydCcsICdpdGVtSW1wb3J0UmVxdWVzdCcsIGl0ZW1JbXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL2ltcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtSW1wb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhIExpbmsgYHB1YmxpY190b2tlbmAgZm9yIGFuIEFQSSBgYWNjZXNzX3Rva2VuYC4gTGluayBoYW5kcyBvZmYgdGhlIGBwdWJsaWNfdG9rZW5gIGNsaWVudC1zaWRlIHZpYSB0aGUgYG9uU3VjY2Vzc2AgY2FsbGJhY2sgb25jZSBhIHVzZXIgaGFzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkIGFuIEl0ZW0uIFRoZSBgcHVibGljX3Rva2VuYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gQW4gYGFjY2Vzc190b2tlbmAgZG9lcyBub3QgZXhwaXJlLCBidXQgY2FuIGJlIHJldm9rZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC4gIFRoZSByZXNwb25zZSBhbHNvIGluY2x1ZGVzIGFuIGBpdGVtX2lkYCB0aGF0IHNob3VsZCBiZSBzdG9yZWQgd2l0aCB0aGUgYGFjY2Vzc190b2tlbmAuIFRoZSBgaXRlbV9pZGAgaXMgdXNlZCB0byBpZGVudGlmeSBhbiBJdGVtIGluIGEgd2ViaG9vay4gVGhlIGBpdGVtX2lkYCBjYW4gYWxzbyBiZSByZXRyaWV2ZWQgYnkgbWFraW5nIGFuIGAvaXRlbS9nZXRgIHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUHVibGljVG9rZW5FeGNoYW5nZTogYXN5bmMgKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UnLCAnaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0JywgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaXRlbS9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEl0ZW0uIE9uY2UgcmVtb3ZlZCwgdGhlIGBhY2Nlc3NfdG9rZW5gLCBhcyB3ZWxsIGFzIGFueSBwcm9jZXNzb3IgdG9rZW5zIG9yIGJhbmsgYWNjb3VudCB0b2tlbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLCBpcyBubyBsb25nZXIgdmFsaWQgYW5kIGNhbm5vdCBiZSB1c2VkIHRvIGFjY2VzcyBhbnkgZGF0YSB0aGF0IHdhcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgQ2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyBhIHJlY29tbWVuZGVkIGJlc3QgcHJhY3RpY2Ugd2hlbiBvZmZib2FyZGluZyB1c2VycyBvciBpZiBhIHVzZXIgY2hvb3NlcyB0byBkaXNjb25uZWN0IGFuIGFjY291bnQgbGlua2VkIHZpYSBQbGFpZC4gRm9yIHN1YnNjcmlwdGlvbiBwcm9kdWN0cywgc3VjaCBhcyBUcmFuc2FjdGlvbnMsIExpYWJpbGl0aWVzLCBhbmQgSW52ZXN0bWVudHMsIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgcmVxdWlyZWQgdG8gZW5kIHN1YnNjcmlwdGlvbiBiaWxsaW5nIGZvciB0aGUgSXRlbS4gRm9yIG1vbmV5IG1vdmVtZW50IHByb2R1Y3RzIHN1Y2ggYXMgQXV0aCBhbmQgVHJhbnNmZXIsIGlmIHRoZSBJdGVtIGlzIGF0IGFuIGluc3RpdHV0aW9uIHRoYXQgdXNlcyBUb2tlbml6ZWQgQWNjb3VudCBOdW1iZXJzIChUQU5zKSwgc3VjaCBhcyBDaGFzZSBvciBQTkMsIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgd2lsbCBpbnZhbGlkYXRlIHRoZSBUQU4sIGFuZCBzdWJzZXF1ZW50IEFDSCB0cmFuc2ZlciBhdHRlbXB0cyB1c2luZyB0aGF0IFRBTiB3aWxsIGJlIHJldHVybmVkLiAgSW4gTGltaXRlZCBQcm9kdWN0aW9uLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGRvZXMgbm90IGltcGFjdCB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBMaW1pdGVkIFByb2R1Y3Rpb24gSXRlbXMgeW91IGhhdmUgYXZhaWxhYmxlLiAgUmVtb3ZpbmcgYW4gSXRlbSBkb2VzIG5vdCBhZmZlY3QgYW55IEFzc2V0IFJlcG9ydHMgb3IgQXVkaXQgQ29waWVzIHlvdSBoYXZlIGFscmVhZHkgY3JlYXRlZCwgd2hpY2ggd2lsbCByZW1haW4gYWNjZXNzaWJsZSB1bnRpbCB5b3UgcmVtb3ZlIGFjY2VzcyB0byB0aGVtIHNwZWNpZmljYWxseSB1c2luZyB0aGUgYC9hc3NldF9yZXBvcnQvcmVtb3ZlYCBlbmRwb2ludC4gIEFsc28gbm90ZSB0aGF0IGZvciBjZXJ0YWluIE9BdXRoLWJhc2VkIGluc3RpdHV0aW9ucywgYW4gSXRlbSByZW1vdmVkIHZpYSBgL2l0ZW0vcmVtb3ZlYCBtYXkgc3RpbGwgc2hvdyBhcyBhbiBhY3RpdmUgY29ubmVjdGlvbiBpbiB0aGUgaW5zdGl0dXRpb25cXCdzIE9BdXRoIHBlcm1pc3Npb24gbWFuYWdlci4gIEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHJldHVybiBhIGByZW1vdmVkYCBib29sZWFuIGFzIHBhcnQgb2YgdGhlIHJlc3BvbnNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1SZW1vdmU6IGFzeW5jIChpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVJlbW92ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2l0ZW1SZW1vdmUnLCAnaXRlbVJlbW92ZVJlcXVlc3QnLCBpdGVtUmVtb3ZlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvaXRlbS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgV2ViaG9vayBVUkxcbiAgICAgICAgICogQHBhcmFtIHtJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3R9IGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1XZWJob29rVXBkYXRlOiBhc3luYyAoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdpdGVtV2ViaG9va1VwZGF0ZScsICdpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QnLCBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2l0ZW0vd2ViaG9vay91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYW4gSXRlbSB3aXRoIGxvYW4gb3IgY3JlZGl0IGFjY291bnRzLiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuIFRvIGxpbWl0IGFjY291bnRzIGxpc3RlZCBpbiBMaW5rIHRvIHR5cGVzIGFuZCBzdWJ0eXBlcyBzdXBwb3J0ZWQgYnkgTGlhYmlsaXRpZXMsIHlvdSBjYW4gdXNlIHRoZSBgYWNjb3VudF9maWx0ZXJzYCBwYXJhbWV0ZXIgd2hlbiBbY3JlYXRpbmcgYSBMaW5rIHRva2VuXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rdG9rZW5jcmVhdGUpLiAgVGhlIHR5cGVzIG9mIGluZm9ybWF0aW9uIHJldHVybmVkIGJ5IExpYWJpbGl0aWVzIGNhbiBpbmNsdWRlIGJhbGFuY2VzIGFuZCBkdWUgZGF0ZXMsIGxvYW4gdGVybXMsIGFuZCBhY2NvdW50IGRldGFpbHMgc3VjaCBhcyBvcmlnaW5hbCBsb2FuIGFtb3VudCBhbmQgZ3VhcmFudG9yLiBEYXRhIGlzIHJlZnJlc2hlZCBhcHByb3hpbWF0ZWx5IG9uY2UgcGVyIGRheTsgdGhlIGxhdGVzdCBkYXRhIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBgL2xpYWJpbGl0aWVzL2dldGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpYWJpbGl0aWVzIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpYWJpbGl0aWVzR2V0OiBhc3luYyAobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlhYmlsaXRpZXNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaWFiaWxpdGllc0dldCcsICdsaWFiaWxpdGllc0dldFJlcXVlc3QnLCBsaWFiaWxpdGllc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpYWJpbGl0aWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaWFiaWxpdGllc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlDcmVhdGU6IGFzeW5jIChsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0OiBMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ2xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ2xpbmtEZWxpdmVyeUNyZWF0ZScsICdsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0JywgbGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvbGlua19kZWxpdmVyeS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5R2V0OiBhc3luYyAobGlua0RlbGl2ZXJ5R2V0UmVxdWVzdDogTGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rRGVsaXZlcnlHZXQnLCAnbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCcsIGxpbmtEZWxpdmVyeUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmtfZGVsaXZlcnkvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJZCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZTogYXN5bmMgKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlJywgJ2xpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QnLCBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL29hdXRoL2NvcnJlbGF0aW9uX2lkL2V4Y2hhbmdlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLiBGb3IgbW9zdCBQbGFpZCBwcm9kdWN0cywgdGhlIGBwdWJsaWNfdG9rZW5gIGlzIHNhdmVkIGFuZCBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbTGluayBmbG93IG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvI2xpbmstZmxvdy1vdmVydmlldykuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gZmxvdy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0fSBsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua1Rva2VuQ3JlYXRlOiBhc3luYyAobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdsaW5rVG9rZW5DcmVhdGUnLCAnbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCcsIGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2xpbmsvdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGluay90b2tlbi9nZXRgIGVuZHBvaW50IGdldHMgaW5mb3JtYXRpb24gYWJvdXQgYSBMaW5rIHNlc3Npb24sIGluY2x1ZGluZyBhbGwgY2FsbGJhY2tzIGZpcmVkIGR1cmluZyB0aGUgc2Vzc2lvbiBhbG9uZyB3aXRoIHRoZWlyIG1ldGFkYXRhLCBpbmNsdWRpbmcgdGhlIHB1YmxpYyB0b2tlbi4gVGhpcyBlbmRwb2ludCBpcyB1c2VkIHdpdGggTGluayBmbG93cyB0aGF0IGRvblxcJ3QgcHJvdmlkZSBhIHB1YmxpYyB0b2tlbiB2aWEgZnJvbnRlbmQgY2FsbGJhY2tzLCBzdWNoIGFzIHRoZSBbSG9zdGVkIExpbmsgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL2hvc3RlZC1saW5rLykgYW5kIHRoZSBbTXVsdGktSXRlbSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmsvKS4gSXQgYWxzbyBjYW4gYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuR2V0UmVxdWVzdH0gbGlua1Rva2VuR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkdldDogYXN5bmMgKGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnbGlua1Rva2VuR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbGlua1Rva2VuR2V0JywgJ2xpbmtUb2tlbkdldFJlcXVlc3QnLCBsaW5rVG9rZW5HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9saW5rL3Rva2VuL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChsaW5rVG9rZW5HZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyBmcm9tIGEgbGlzdCBvZiBgYWNjZXNzX3Rva2Vuc2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgaW5zaWdodHMgZm9yIHRoZSBwcm92aWRlZCBgYWNjZXNzX3Rva2Vuc2BcbiAgICAgICAgICogQHBhcmFtIHtOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0fSBuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0OiBhc3luYyAobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdDogTmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICduZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCduZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQnLCAnbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCcsIG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL25ldHdvcmtfaW5zaWdodHMvcmVwb3J0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL25ldHdvcmsvc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGEgdXNlciBpcyBlbGlnaWJsZSBmb3IgYSBzdHJlYW1saW5lZCBleHBlcmllbmNlLCBzdWNoIGFzIExheWVyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya1N0YXR1c0dldDogYXN5bmMgKG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICduZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnbmV0d29ya1N0YXR1c0dldCcsICduZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcsIG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9uZXR3b3JrL3N0YXR1cy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQobmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckNyZWF0ZScsICdwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGU6IGFzeW5jIChwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BhcnRuZXJDdXN0b21lckVuYWJsZScsICdwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0JywgcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGFydG5lci9jdXN0b21lci9lbmFibGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldDogYXN5bmMgKHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGFydG5lckN1c3RvbWVyR2V0JywgJ3BhcnRuZXJDdXN0b21lckdldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0OiBhc3luYyAocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJPYXV0aEluc3RpdHV0aW9uc0dldCcsICdwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QnLCBwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gZnVsbCBQcm9kdWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGFydG5lckN1c3RvbWVyUmVtb3ZlOiBhc3luYyAocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXJ0bmVyQ3VzdG9tZXJSZW1vdmUnLCAncGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCcsIHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0JywgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgc2luZ2xlIHBheW1lbnQgdXNpbmcgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlJywgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2U6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZScsICdwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gTGltaXRlZCBQcm9kdWN0aW9uLCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KSwgYW5kIHN0YW5kaW5nIG9yZGVycywgdmFyaWFibGUgcmVjdXJyaW5nIHBheW1lbnRzLCBhbmQgVmlydHVhbCBBY2NvdW50cyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGU6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQ6IGFzeW5jIChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdCcsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldmVyc2UgYSBzZXR0bGVkIHBheW1lbnQgZnJvbSBhIFBsYWlkIHZpcnR1YWwgYWNjb3VudC4gIFRoZSBvcmlnaW5hbCBwYXltZW50IG11c3QgYmUgaW4gYSBzZXR0bGVkIHN0YXRlIHRvIGJlIHJlZnVuZGVkLiBUbyByZWZ1bmQgcGFydGlhbGx5LCBzcGVjaWZ5IHRoZSBhbW91bnQgYXMgcGFydCBvZiB0aGUgcmVxdWVzdC4gSWYgdGhlIGFtb3VudCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgcmVmdW5kIGFtb3VudCB3aWxsIGJlIGVxdWFsIHRvIGFsbCBvZiB0aGUgcmVtYWluaW5nIHBheW1lbnQgYW1vdW50IHRoYXQgaGFzIG5vdCBiZWVuIHJlZnVuZGVkIHlldC4gIFRoZSByZWZ1bmQgd2lsbCBnbyBiYWNrIHRvIHRoZSBzb3VyY2UgYWNjb3VudCB0aGF0IGluaXRpYXRlZCB0aGUgcGF5bWVudC4gVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBoYXZlIGJlZW4gaW5pdGlhdGVkIHRvIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50IHNvIHRoYXQgdGhpcyBhY2NvdW50IGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHRoZSByZWZ1bmQuICBQcm92aWRpbmcgY291bnRlcnBhcnR5IGluZm9ybWF0aW9uIHN1Y2ggYXMgZGF0ZSBvZiBiaXJ0aCBhbmQgYWRkcmVzcyBpbmNyZWFzZXMgIHRoZSBsaWtlbGlob29kIG9mIHJlZnVuZCBiZWluZyBzdWNjZXNzZnVsIHdpdGhvdXQgaHVtYW4gaW50ZXJ2ZW50aW9uLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV2ZXJzZSBhbiBleGlzdGluZyBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZTogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZScsICdwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCcsIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9yZXZlcnNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkgb3IgYSBub24tRXVyb3pvbmUgY291bnRyeSBbc3VwcG9ydGVkXShodHRwczovL3BsYWlkLmNvbS9nbG9iYWwpIGJ5IFBsYWlkLiBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBiYWNzYCBpbiB0aGUgVUsgYW5kIGBpYmFuYCBpbiBFVS4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlOiBhc3luYyAocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZScsICdwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfaW5pdGlhdGlvbi9yZWNpcGllbnQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQnLCAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0JywgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudCByZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdDogYXN5bmMgKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0JywgJ3BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QnLCBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVDcmVhdGU6IGFzeW5jIChwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3BheW1lbnRQcm9maWxlQ3JlYXRlJywgJ3BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCcsIHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2dldGAgZW5kcG9pbnQgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlR2V0OiBhc3luYyAocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwYXltZW50UHJvZmlsZUdldCcsICdwYXltZW50UHJvZmlsZUdldFJlcXVlc3QnLCBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYCBlbmRwb2ludCB0byByZW1vdmUgYSBnaXZlbiBQYXltZW50IFByb2ZpbGUuIE9uY2UgaXTigJlzIHJlbW92ZWQsIGl0IGNhbiBubyBsb25nZXIgYmUgdXNlZCB0byBjcmVhdGUgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0fSBwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZVJlbW92ZTogYXN5bmMgKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncGF5bWVudFByb2ZpbGVSZW1vdmUnLCAncGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0JywgcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wYXltZW50X3Byb2ZpbGUvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3R9IHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQWNjb3VudEdldDogYXN5bmMgKHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQWNjb3VudEdldCcsICdwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCcsIHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYWNjb3VudC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFwZXggYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlJywgJ3Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvYXBleC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2F1dGgvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSBiYW5rIGFjY291bnQgYW5kIGJhbmsgaWRlbnRpZmljYXRpb24gbnVtYmVyIChzdWNoIGFzIHRoZSByb3V0aW5nIG51bWJlciwgZm9yIFVTIGFjY291bnRzKSwgZm9yIGEgY2hlY2tpbmcsIHNhdmluZ3MsIG9yIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50IHRoYXRcXCdcXCdzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGBwcm9jZXNzb3JfdG9rZW5gLiBUaGUgZW5kcG9pbnQgYWxzbyByZXR1cm5zIGhpZ2gtbGV2ZWwgYWNjb3VudCBkYXRhIGFuZCBiYWxhbmNlcyB3aGVuIGF2YWlsYWJsZS4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgdXNlIGEgZGlmZmVyZW50IHNjaGVtYSBmb3IgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAyMC0wOS0xNCkuIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBBdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBdXRoR2V0OiBhc3luYyAocHJvY2Vzc29yQXV0aEdldFJlcXVlc3Q6IFByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JBdXRoR2V0JywgJ3Byb2Nlc3NvckF1dGhHZXRSZXF1ZXN0JywgcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9hdXRoL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JCYWxhbmNlR2V0OiBhc3luYyAocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3Q6IFByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JCYWxhbmNlR2V0JywgJ3Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0JywgcHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcHJvY2Vzc29yL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUnLCAncHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5R2V0OiBhc3luYyAocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JJZGVudGl0eUdldCcsICdwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2g6IGFzeW5jIChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvcklkZW50aXR5TWF0Y2gnLCAncHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QnLCBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgc3RvY2sgcG9zaXRpb24gZGF0YSBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldDogYXN5bmMgKHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldCcsICdwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCcsIHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBpbnZlc3RtZW50IGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzb3IgdG9rZW4uICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0OiBhc3luYyAocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldCcsICdwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JMaWFiaWxpdGllc0dldDogYXN5bmMgKHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQnLCAncHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0JywgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBbUGxhaWQgVHJhbnNmZXIgcHJvZHVjdF0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIHRvIGNyZWF0ZSB0cmFuc2ZlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFzIFBsYWlkIGFscmVhZHkga25vd3Mgd2hldGhlciB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVwb3J0IHdoZXRoZXIgeW91IGluaXRpYXRlZCBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0OiBhc3luYyAocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydCcsICdwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGU6IGFzeW5jIChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlJywgJ3Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZTogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUHJlcGFyZScsICdwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCcsIHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0JywgJ3Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIFRvIHJldm9rZSBhIGJhbmsgYWNjb3VudCB0b2tlbiwgdGhlIGVudGlyZSB1bmRlcmx5aW5nIGFjY2VzcyB0b2tlbiBtdXN0IGJlIHJldm9rZWQgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZTogYXN5bmMgKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCcsIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy4gSWYgdXNpbmcgbXVsdGlwbGUgcHJvY2Vzc29ycywgbXVsdGlwbGUgZGlmZmVyZW50IHByb2Nlc3NvciB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgc2luZ2xlIGFjY2VzcyB0b2tlbi4gT25jZSBjcmVhdGVkLCBhIHByb2Nlc3NvciB0b2tlbiBmb3IgYSBnaXZlbiBJdGVtIGNhbm5vdCBiZSBtb2RpZmllZCBvciB1cGRhdGVkLiBUbyByZXZva2UgdGhlIHByb2Nlc3NvclxcJ3MgYWNjZXNzLCB0aGUgZW50aXJlIEl0ZW0gbXVzdCBiZSBkZWxldGVkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUb2tlbkNyZWF0ZScsICdwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQ6IGFzeW5jIChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQnLCAncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QnLCBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3Blcm1pc3Npb25zL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0cyBvbiB0aGUgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBCeSBkZWZhdWx0LCBhIHByb2Nlc3NvciB3aWxsIGhhdmUgYWNjZXNzIHRvIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMgb24gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbS4gVG8gcmVzdHJpY3QgYWNjZXNzIHRvIGEgcGFydGljdWxhciBzZXQgb2YgcHJvZHVjdHMsIGNhbGwgdGhpcyBlbmRwb2ludCB3aXRoIHRoZSBkZXNpcmVkIHByb2R1Y3RzLiBUbyByZXN0b3JlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCBhbiBlbXB0eSBsaXN0LiBUaGlzIGVuZHBvaW50IGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgYXMgeW91ciBuZWVkcyBhbmQgeW91ciBwcm9jZXNzb3JcXCdzIG5lZWRzIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldDogYXN5bmMgKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldCcsICdwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCcsIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9jZXNzb3IvdG9rZW4vcGVybWlzc2lvbnMvc2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGU6IGFzeW5jIChwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZScsICdwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0JywgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQ6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldCcsICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0JywgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgKS4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0OiBhc3luYyAocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2g6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGVuZHBvaW50IHJldHJpZXZlcyB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gYW5kIGNhbiBmZXRjaCB1cGRhdGVzIHVzaW5nIGEgY3Vyc29yIHRvIHRyYWNrIHdoaWNoIHVwZGF0ZXMgaGF2ZSBhbHJlYWR5IGJlZW4gc2Vlbi4gIEZvciBpbXBvcnRhbnQgaW5zdHJ1Y3Rpb25zIG9uIGludGVncmF0aW5nIHdpdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdhcyBjYWxsZWQgd2l0aGluIGEgZmV3IHNlY29uZHMgb2YgSXRlbSBjcmVhdGlvbiwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmM6IGFzeW5jIChwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3Byb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMnLCAncHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QnLCBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2ZpbGUvbmV0d29ya19zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9maWxlTmV0d29ya1N0YXR1c0dldDogYXN5bmMgKHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygncHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQnLCAncHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0JywgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2s6IGFzeW5jIChzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2snLCAnc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgQmFuayBUcmFuc2ZlciB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgYmFuayB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlJywgJ3NhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9jcmEvY2FzaGZsb3dfdXBkYXRlcy91cGRhdGVgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYW4gdXBkYXRlIGZvciBjYXNoZmxvdyB1cGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2hmbG93IFVwZGF0ZXNcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdH0gc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlOiBhc3luYyAoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3Q6IFNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlJywgJ3NhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0Jywgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvY3JhL2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEluY29tZUZpcmVXZWJob29rJywgJ3NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBzaW11bGF0aW5nIGEgZGVmYXVsdCB1cGRhdGUgZXZlbnQgZm9yIHRoZSByZXNwZWN0aXZlIHByb2R1Y3QgYXMgc3BlY2lmaWVkIHdpdGggdGhlIGB3ZWJob29rX3R5cGVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFZhbGlkIFNhbmRib3ggYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHR5cGVzIGluY2x1ZGU6IGBBVVRIYCwgYElERU5USVRZYCwgYFRSQU5TQUNUSU9OU2AsIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgLCBgTElBQklMSVRJRVNgLCBgSE9MRElOR1NgLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm9kdWN0LCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBGaXJlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbmV3IGFjY291bnQgaXMgYXZhaWxhYmxlIG9uIHRoZSBJdGVtIGFuZCB5b3UgY2FuIGxhdW5jaCB1cGRhdGUgbW9kZSB0byByZXF1ZXN0IGFjY2VzcyB0byBpdC4gIGBTTVNfTUlDUk9ERVBPU0lUU19WRVJJRklDQVRJT05gOiBGaXJlZCB3aGVuIGEgZ2l2ZW4gc2FtZSBkYXkgbWljcm8tZGVwb3NpdCBpdGVtIGlzIHZlcmlmaWVkIHZpYSBTTVMgdmVyaWZpY2F0aW9uLiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUEVORElOR19ESVNDT05ORUNUYDogRmlyZWQgd2hlbiBhbiBJdGVtIHdpbGwgc3RvcCB3b3JraW5nIGluIHRoZSBuZWFyIGZ1dHVyZSAoZS5nLiBkdWUgdG8gYSBwbGFubmVkIGJhbmsgbWlncmF0aW9uKSBhbmQgbXVzdCBiZSBzZW50IHRocm91Z2ggdXBkYXRlIG1vZGUgdG8gY29udGludWUgd29ya2luZy4gICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGA6IEluZGljYXRlcyBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBNYXkgbm90IGFsd2F5cyBmaXJlIHVwb24gcmV2b2NhdGlvbiwgYXMgc29tZSBpbnN0aXR1dGlvbnPigJkgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgOiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoaXMgd2ViaG9vayBpcyBjdXJyZW50bHkgc2VudCBvbmx5IGZvciBDaGFzZSBhbmQgUE5DIEl0ZW1zLCBidXQgbWF5IGJlIHNlbnQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaXJlIGEgdGVzdCB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1GaXJlV2ViaG9vazogYXN5bmMgKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1GaXJlV2ViaG9vaycsICdzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCcsIHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luOiBhc3luYyAoc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94SXRlbVJlc2V0TG9naW4nLCAnc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1czogYXN5bmMgKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXMnLCAnc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0Jywgc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L2l0ZW0vc2V0X3ZlcmlmaWNhdGlvbl9zdGF0dXNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHM6IGFzeW5jIChzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3Q6IFNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzJywgJ3NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCcsIHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC9vYXV0aC9zZWxlY3RfYWNjb3VudHNgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luOiBhc3luYyAoc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luJywgJ3NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0Jywgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3BheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIHZhcmlvdXMgcGF5bWVudCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFRoaXMgZW5kcG9pbnQgd2lsbCB0cmlnZ2VyIHRoZSBjb3JyZXNwb25kaW5nIHBheW1lbnQgc3RhdHVzIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcGF5bWVudCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFBheW1lbnRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFBheW1lbnRTaW11bGF0ZScsICdzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3BheW1lbnQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHByb2Nlc3Nvcl90b2tlbmAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHByb2Nlc3Nvcl90b2tlbmAgY29ycmVzcG9uZHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gdXNlIHRoaXMgYHByb2Nlc3Nvcl90b2tlbmAgd2l0aCB0aGUgYC9wcm9jZXNzb3IvYCBBUEkgZW5kcG9pbnRzIGluIFNhbmRib3guIFlvdSBjYW4gYWxzbyB1c2UgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlOiBhc3luYyAoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUnLCAnc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCcsIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvcHJvY2Vzc29yX3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEsIG9yIHdpdGggUGxhaWRcXCdzIFtwcmUtcG9wdWxhdGVkIFNhbmRib3ggdGVzdCBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3Rlc3QtY3JlZGVudGlhbHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZTogYXN5bmMgKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlJywgJ3NhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QnLCBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vaycsICdzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgZGVwb3NpdCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2UgZm9yIGFsbCBvcmlnaW5hdG9ycyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZScsICdzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3NpbXVsYXRlX2F2YWlsYWJsZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXcvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZScsICdzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvcmVmdW5kL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlJywgJ3NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCcsIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY3JlYXRpbmcgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGU6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUnLCAnc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlOiBhc3luYyAoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZTogYXN5bmMgKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlJywgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQ6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldCcsICdzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0Jywgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Q6IGFzeW5jIChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3QnLCAnc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QnLCBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW4vYCBmdW5jdGlvbnMgdGhlIHNhbWUgYXMgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBidXQgd2lsbCBtb2RpZnkgSXRlbXMgcmVsYXRlZCB0byBhIFVzZXIuIFRoaXMgZW5kcG9pbnQgZm9yY2VzIGVhY2ggSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGl0ZW0ocykgZm9yIGEgU2FuZGJveCBVc2VyIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFVzZXJSZXNldExvZ2luOiBhc3luYyAoc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCdzYW5kYm94VXNlclJlc2V0TG9naW4nLCAnc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCcsIHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbmA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxEZWNpc2lvblJlcG9ydDogYXN5bmMgKHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdDogU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRGVjaXNpb25SZXBvcnQnLCAnc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0Jywgc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzaWduYWxFdmFsdWF0ZTogYXN5bmMgKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3NpZ25hbEV2YWx1YXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsRXZhbHVhdGUnLCAnc2lnbmFsRXZhbHVhdGVSZXF1ZXN0Jywgc2lnbmFsRXZhbHVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvZXZhbHVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYW4gSXRlbSBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiBUaGlzIHNob3VsZCBiZSBkb25lIG9uIEl0ZW1zIHdoZXJlIFNpZ25hbCB3YXMgYWRkZWQgaW4gdGhlIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXkgYnV0IG5vdCBpbiB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXkuIElmIGAvc2lnbmFsL3ByZXBhcmVgIGlzIHNraXBwZWQgb24gYW4gSXRlbSB0aGF0IGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhlIGluaXRpYWwgY2FsbCB0byBgL3NpZ25hbC9ldmFsdWF0ZWAgb24gdGhhdCBJdGVtIHdpbGwgYmUgbGVzcyBhY2N1cmF0ZSwgYmVjYXVzZSBTaWduYWwgd2lsbCBoYXZlIGFjY2VzcyB0byBsZXNzIGRhdGEgZm9yIGNvbXB1dGluZyB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFByZXBhcmU6IGFzeW5jIChzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFByZXBhcmUnLCAnc2lnbmFsUHJlcGFyZVJlcXVlc3QnLCBzaWduYWxQcmVwYXJlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3ByZXBhcmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc2lnbmFsUHJlcGFyZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydDogYXN5bmMgKHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3Q6IFNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc2lnbmFsUmV0dXJuUmVwb3J0JywgJ3NpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QnLCBzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zaWduYWwvcmV0dXJuL3JlcG9ydGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9zY2hlZHVsZWAgdG8gc2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgU2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFNjaGVkdWxlUmVxdWVzdH0gc2lnbmFsU2NoZWR1bGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsU2NoZWR1bGU6IGFzeW5jIChzaWduYWxTY2hlZHVsZVJlcXVlc3Q6IFNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICdzaWduYWxTY2hlZHVsZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3NpZ25hbFNjaGVkdWxlJywgJ3NpZ25hbFNjaGVkdWxlUmVxdWVzdCcsIHNpZ25hbFNjaGVkdWxlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvc2lnbmFsL3NjaGVkdWxlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHNpbmdsZSBzdGF0ZW1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdH0gc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHN0YXRlbWVudHNEb3dubG9hZDogYXN5bmMgKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc3RhdGVtZW50c0Rvd25sb2FkJywgJ3N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QnLCBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzTGlzdDogYXN5bmMgKHN0YXRlbWVudHNMaXN0UmVxdWVzdDogU3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3N0YXRlbWVudHNMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc3RhdGVtZW50c0xpc3QnLCAnc3RhdGVtZW50c0xpc3RSZXF1ZXN0Jywgc3RhdGVtZW50c0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zdGF0ZW1lbnRzL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc3RhdGVtZW50c0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBzdGF0ZW1lbnRzIGRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0fSBzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzUmVmcmVzaDogYXN5bmMgKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdDogU3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnc3RhdGVtZW50c1JlZnJlc2gnLCAnc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0Jywgc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9zdGF0ZW1lbnRzL3JlZnJlc2hgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQoc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgZW5oYW5jZSBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VuaGFuY2U6IGFzeW5jICh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc0VuaGFuY2UnLCAndHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvZW5yaWNoYCBlbmRwb2ludCBlbnJpY2hlcyByYXcgdHJhbnNhY3Rpb24gZGF0YSBnZW5lcmF0ZWQgYnkgeW91ciBvd24gYmFua2luZyBwcm9kdWN0cyBvciByZXRyaWV2ZWQgZnJvbSBvdGhlciBub24tUGxhaWQgc291cmNlcy5cbiAgICAgICAgICogQHN1bW1hcnkgRW5yaWNoIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc0VucmljaDogYXN5bmMgKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zRW5yaWNoJywgJ3RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvZW5yaWNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdGhlIEl0ZW0gd2FzIGxhc3QgdXBkYXRlZCwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zR2V0OiBhc3luYyAodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNHZXQnLCAndHJhbnNhY3Rpb25zR2V0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc0dldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiAgIFdoZW4gdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgZm9yIGJlc3QgcmVzdWx0cywgbWFrZSBzdXJlIHRvIHVzZSB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBwYXJhbWV0ZXIgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIEl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldDogYXN5bmMgKHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0JywgJ3RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QnLCB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGUgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgVHJhbnNhY3Rpb25zIGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLiAgSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBvcHRpb25hbCBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWZyZXNoOiBhc3luYyAodHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSZWZyZXNoJywgJ3RyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gcnVsZXMuICBSdWxlcyB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3BvbnNlLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuIFRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHRyYW5zYWN0aW9ucy1mZWVkYmFja0BwbGFpZC5jb20uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZTogYXN5bmMgKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUnLCAndHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YCByZXR1cm5zIGEgbGlzdCBvZiB0cmFuc2FjdGlvbiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNMaXN0OiBhc3luYyAodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNSdWxlc0xpc3QnLCAndHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCcsIHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL2JldGEvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZTogYXN5bmMgKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUnLCAndHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0JywgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC9iZXRhL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9yZW1vdmVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBgbG9hbmAtdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNTeW5jOiBhc3luYyAodHJhbnNhY3Rpb25zU3luY1JlcXVlc3Q6IFRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2FjdGlvbnNTeW5jJywgJ3RyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0JywgdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zYWN0aW9ucy9zeW5jYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQ6IGFzeW5jICh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCcsICd0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0JywgdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb24uIEEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gdXNlZCB0byBjcmVhdGUgYSB0cmFuc2Zlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWw6IGFzeW5jICh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCcsICd0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiBUaGUgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiB3aWxsIGV4cGlyZSBpZiBub3QgdXNlZCBhZnRlciBvbmUgaG91ci4gKFlvdSBjYW4gY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYXV0aG9yaXphdGlvbiBsaWZldGltZS4pICAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIGFkZGl0aW9uYWwgdXNlciBpbnB1dCBpcyBuZWVkZWQsIHVzdWFsbHkgdG8gZml4IGEgYnJva2VuIGJhbmsgY29ubmVjdGlvbiwgYmVmb3JlIFBsYWlkIGNhbiBwcm9wZXJseSBhc3Nlc3MgdGhlIHJpc2suIFlvdSBuZWVkIHRvIGxhdW5jaCBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCB1c2VyIGFjdGlvbi4gV2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIHRvIGdldCBhIG5ldyBMaW5rIHRva2VuLCBpbnN0ZWFkIG9mIHByb3ZpZGluZyBgYWNjZXNzX3Rva2VuYCBpbiB0aGUgcmVxdWVzdCwgeW91IHNob3VsZCBzZXQgW2B0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2Zlci1hdXRob3JpemF0aW9uLWlkKSBhcyB0aGUgYGF1dGhvcml6YXRpb24uaWRgLiBBZnRlciB0aGUgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiAgICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gZ2V0IGFuIGF1dGhvcml6YXRpb24gZGVjaXNpb24gb2YgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGU6IGFzeW5jICh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZScsICd0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0JywgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAoRGVwcmVjYXRlZCkgVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQmFsYW5jZUdldDogYXN5bmMgKHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJCYWxhbmNlR2V0JywgJ3RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QnLCB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9iYWxhbmNlL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIHRyYW5zZmVyLiAgQSB0cmFuc2ZlciBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNhbmNlbDogYXN5bmMgKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJDYW5jZWwnLCAndHJhbnNmZXJDYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9jYW5jZWxgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdGhlIFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhbiBhY2NvdW50IHRvIGJlIHVzZWQgd2l0aCBUcmFuc2Zlci4gVGhpcyBlbmRwb2ludCB3b3JrcyBvbiBhbGwgVHJhbnNmZXItY2FwYWJsZSBJdGVtcywgaW5jbHVkaW5nIHRob3NlIGNyZWF0ZWQgYnkgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLiBUbyBzaW11bGF0ZSBSVFAgZWxpZ2liaWxpdHkgaW4gU2FuZGJveCwgbG9nIGluIHVzaW5nIHRoZSB1c2VybmFtZSBgdXNlcl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgYW5kIHVzZSB0aGUgZmlyc3QgdHdvIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzIGluIHRoZSBcXFwiRmlyc3QgUGxhdHlwdXMgQmFua1xcXCIgaW5zdGl0dXRpb24gKGVuZGluZyBpbiAwMDAwIG9yIDExMTEpLCB3aGljaCB3aWxsIHJldHVybiBgdHJ1ZWAuIEFueSBvdGhlciBhY2NvdW50IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQ6IGFzeW5jICh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3Q6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0JywgJ3RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCcsIHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY2FwYWJpbGl0aWVzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQ6IGFzeW5jICh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyQ29uZmlndXJhdGlvbkdldCcsICd0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0JywgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvY29uZmlndXJhdGlvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBpcyByZXRyeWFibGUgYW5kIGlkZW1wb3RlbnQ7IGlmIGEgdHJhbnNmZXIgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSB0cmFuc2ZlciBkZXRhaWxzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgdHJhbnNmZXIuIEEgdHJhbnNmZXIgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaWYgYSA1MDAgZXJyb3IgaXMgcmV0dXJuZWQ7IHRvIGRldGVjdCB0aGlzIHNjZW5hcmlvLCB1c2UgW1RyYW5zZmVyIGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9yZWNvbmNpbGluZy10cmFuc2ZlcnMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckNyZWF0ZScsICd0cmFuc2ZlckNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcmQtcGFydHkgc2VuZGVyIGN1c3RvbWVycyBjYW4gdXNlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGAgZW5kcG9pbnQgdG8gdXBsb2FkIGEgZG9jdW1lbnQgb24gYmVoYWxmIG9mIGl0cyBlbmQgY3VzdG9tZXIgKGkuZS4gb3JpZ2luYXRvcikgdG8gUGxhaWQuIFlvdeKAmWxsIG5lZWQgdG8gc2VuZCBhIHJlcXVlc3Qgb2YgdHlwZSBtdWx0aXBhcnQvZm9ybS1kYXRhLiBZb3UgbXVzdCBwcm92aWRlIHRoZSBgY2xpZW50X2lkYCBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIGFuZCBgc2VjcmV0YCBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQ6IGFzeW5jICh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQnLCAndHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QnLCB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQ6IGFzeW5jICh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRGlsaWdlbmNlU3VibWl0JywgJ3RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCcsIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50TGlzdDogYXN5bmMgKHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJFdmVudExpc3QnLCAndHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0JywgdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9ldmVudC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudFN5bmM6IGFzeW5jICh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyRXZlbnRTeW5jJywgJ3RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCcsIHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZXZlbnQvc3luY2A7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYC4gT25lIG9mIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgIG11c3QgYmUgcG9wdWxhdGVkIGJ1dCBub3QgYm90aC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQ6IGFzeW5jICh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlckdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyR2V0JywgJ3RyYW5zZmVyR2V0UmVxdWVzdCcsIHRyYW5zZmVyR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2NyZWF0ZWAgZW5kcG9pbnQgdG8gZ2VuZXJhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IGFuZCBpbnZva2UgdGhlIFRyYW5zZmVyIFVJLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVySW50ZW50Q3JlYXRlOiBhc3luYyAodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlckludGVudENyZWF0ZScsICd0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0fSB0cmFuc2ZlckludGVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckludGVudEdldDogYXN5bmMgKHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdDogVHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVySW50ZW50R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJJbnRlbnRHZXQnLCAndHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0JywgdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9pbnRlbnQvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXRgIGVuZHBvaW50IHRvIGRlcG9zaXQgZnVuZHMgaW50byBQbGFpZCBMZWRnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IERlcG9zaXQgZnVuZHMgaW50byBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdDogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJEZXBvc2l0JywgJ3RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QnLCB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9ycy5cbiAgICAgICAgICogQHN1bW1hcnkgTW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9yc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGU6IGFzeW5jICh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZScsICd0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckdldDogYXN5bmMgKHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMZWRnZXJHZXQnLCAndHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0JywgdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9sZWRnZXIvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YCBlbmRwb2ludCB0byB3aXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXc6IGFzeW5jICh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyTGVkZ2VyV2l0aGRyYXcnLCAndHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QnLCB0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMaXN0UmVxdWVzdH0gdHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTGlzdDogYXN5bmMgKHRyYW5zZmVyTGlzdFJlcXVlc3Q6IFRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJMaXN0JywgJ3RyYW5zZmVyTGlzdFJlcXVlc3QnLCB0cmFuc2Zlckxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL21ldHJpY3MvZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNmZXIgcHJvZHVjdCB1c2FnZSBtZXRyaWNzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWV0cmljc0dldDogYXN5bmMgKHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJNZXRyaWNzR2V0JywgJ3RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QnLCB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9tZXRyaWNzL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiBUaGlzIGVuZHBvaW50IGlzIGFsc28gcmVxdWlyZWQgd2hlbiBhZGRpbmcgYW4gSXRlbSBmb3IgdXNlIHdpdGggd2lyZSB0cmFuc2ZlcnM7IGlmIHlvdSBpbnRlbmQgdG8gY3JlYXRlIHdpcmUgdHJhbnNmZXJzIG9uIHRoaXMgYWNjb3VudCwgeW91IG11c3QgcHJvdmlkZSBgd2lyZV9yb3V0aW5nX251bWJlcmAuIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50OiBhc3luYyAodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck1pZ3JhdGVBY2NvdW50JywgJ3RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0JywgdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUnLCAndHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWAgZW5kcG9pbnQgdG8gdXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlOiBhc3luYyAodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZScsICd0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZnVuZGluZ19hY2NvdW50L3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckdldDogYXN5bmMgKHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJPcmlnaW5hdG9yR2V0JywgJ3RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9vcmlnaW5hdG9yL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckxpc3Q6IGFzeW5jICh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyT3JpZ2luYXRvckxpc3QnLCAndHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3QnLCB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCBhbGxvd3MgZ2F0aGVyaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hdG9yIHNwZWNpZmljIHRvIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcsIGluY2x1ZGluZyB0aGUgb3JpZ2luYXRvclxcJ3MgYWdyZWVtZW50IHRvIGxlZ2FsIHRlcm1zIHJlcXVpcmVkIGJlZm9yZSBhY2NlcHRpbmcgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIG9yaWdpbmF0b3IgZm9yIHNjYWxlZCBwbGF0Zm9ybSBjdXN0b21lcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZScsICd0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIHJlY29yZCBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvciBhbmQgb3B0aW9uYWxseSBzdWJtaXQgcGVyc29uLXNwZWNpZmljIHJlcXVpcmVtZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZScsICd0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL3JlcXVpcmVtZW50L3N1Ym1pdGAgZW5kcG9pbnQgYWxsb3dzIHBsYXRmb3JtcyB0byBzdWJtaXQgb25ib2FyZGluZyByZXF1aXJlbWVudHMgZm9yIGFuIG9yaWdpbmF0b3IgYXMgcGFydCBvZiB0aGUgU2NhbGVkIFBsYXRmb3JtIFRyYW5zZmVyIG9mZmVyaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgb25ib2FyZGluZyByZXF1aXJlbWVudHMgZm9yIFNjYWxlZCBQbGF0Zm9ybSBvcmlnaW5hdG9yc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXQ6IGFzeW5jICh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCcsICd0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0JywgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZOKAmXMgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZTogYXN5bmMgKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlJywgJ3RyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbDogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwnLCAndHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0JywgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGU6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlJywgJ3RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdHZXQ6IGFzeW5jICh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVjdXJyaW5nR2V0JywgJ3RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCcsIHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nTGlzdDogYXN5bmMgKHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZWN1cnJpbmdMaXN0JywgJ3RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDYW5jZWw6IGFzeW5jICh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVmdW5kQ2FuY2VsJywgJ3RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCcsIHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBSZWZ1bmRzIGNvbWUgb3V0IG9mIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIHVzZWQgZm9yIHRoZSBvcmlnaW5hbCBkZWJpdCB0cmFuc2Zlci4gSWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZnVuZHMgaW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIHRvIGNvdmVyIHRoZSByZWZ1bmQgYW1vdW50LCB0aGUgcmVmdW5kIHdpbGwgYmUgcmVqZWN0ZWQuIFlvdSBjYW4gY3JlYXRlIGEgcmVmdW5kIGF0IGFueSB0aW1lLiBQbGFpZCBkb2VzIG5vdCBpbXBvc2UgYW55IGhvbGQgdGltZSBvbiByZWZ1bmRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ3JlYXRlOiBhc3luYyAodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZENyZWF0ZScsICd0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kR2V0OiBhc3luYyAodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd0cmFuc2ZlclJlZnVuZEdldCcsICd0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QnLCB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudExpc3Q6IGFzeW5jICh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3RyYW5zZmVyUmVwYXltZW50TGlzdCcsICd0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0JywgdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdHJhbnNmZXIvcmVwYXltZW50L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdDogYXN5bmMgKHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0JywgJ3RyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QnLCB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJTd2VlcEdldDogYXN5bmMgKHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJTd2VlcEdldCcsICd0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCcsIHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9zd2VlcC9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3Qgc3dlZXBzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwTGlzdDogYXN5bmMgKHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndHJhbnNmZXJTd2VlcExpc3QnLCAndHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0JywgdHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC90cmFuc2Zlci9zd2VlcC9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHVzZXIgcGVybWlzc2lvbmVkIGFjY291bnQgZGF0YSBpbmNsdWRpbmcgaWRlbnRpdHkgYW5kIEl0ZW0gYWNjZXNzIHRva2Vucy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgVXNlciBBY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7VXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdH0gdXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJBY2NvdW50U2Vzc2lvbkdldDogYXN5bmMgKHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAndXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckFjY291bnRTZXNzaW9uR2V0JywgJ3VzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QnLCB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyX2FjY291bnQvc2Vzc2lvbi9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHNob3VsZCBiZSBjYWxsZWQgZm9yIGVhY2ggb2YgeW91ciBlbmQgdXNlcnMgYmVmb3JlIHRoZXkgYmVnaW4gYSBQbGFpZCBDaGVjayBvciBJbmNvbWUgZmxvdywgb3IgYSBNdWx0aS1JdGVtIExpbmsgZmxvdy4gVGhpcyBwcm92aWRlcyB5b3UgYSBzaW5nbGUgdG9rZW4gdG8gYWNjZXNzIGFsbCBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gWW91IHNob3VsZCBvbmx5IGNyZWF0ZSBvbmUgcGVyIGVuZCB1c2VyLiAgVGhlIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IG11c3QgYmUgcHJlc2VudCBpbiBvcmRlciB0byBjcmVhdGUgYSBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnQgZm9yIGEgdXNlci4gSWYgaXQgaXMgbm90IHByb3ZpZGVkIGR1cmluZyB0aGUgYC91c2VyL2NyZWF0ZWAgY2FsbCwgaXQgY2FuIGJlIGFkZGVkIGxhdGVyIGJ5IGNhbGxpbmcgYC91c2VyL3VwZGF0ZWAuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLiAgSWYgeW91IGNhbGwgdGhlIGVuZHBvaW50IG11bHRpcGxlIHRpbWVzIHdpdGggdGhlIHNhbWUgYGNsaWVudF91c2VyX2lkYCwgdGhlIGZpcnN0IGNyZWF0aW9uIGNhbGwgd2lsbCBzdWNjZWVkIGFuZCB0aGUgcmVzdCB3aWxsIGZhaWwgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgdXNlciBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgZ2l2ZW4gYGNsaWVudF91c2VyX2lkYC4gIEVuc3VyZSB0aGF0IHlvdSBzdG9yZSB0aGUgYHVzZXJfdG9rZW5gIGFsb25nIHdpdGggeW91ciB1c2VyXFwncyBpZGVudGlmaWVyIGluIHlvdXIgZGF0YWJhc2UsIGFzIGl0IGlzIG5vdCBwb3NzaWJsZSB0byByZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBgdXNlcl90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckNyZWF0ZVJlcXVlc3R9IHVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckNyZWF0ZTogYXN5bmMgKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlckNyZWF0ZScsICd1c2VyQ3JlYXRlUmVxdWVzdCcsIHVzZXJDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIFVzZXIgYWxvbmcgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nIHN0YXR1c2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc0dldFJlcXVlc3R9IHVzZXJJdGVtc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VySXRlbXNHZXQ6IGFzeW5jICh1c2VySXRlbXNHZXRSZXF1ZXN0OiBVc2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJJdGVtc0dldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3VzZXJJdGVtc0dldCcsICd1c2VySXRlbXNHZXRSZXF1ZXN0JywgdXNlckl0ZW1zR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvdXNlci9pdGVtcy9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQodXNlckl0ZW1zR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3VzZXIvcmVtb3ZlYCBkZWxldGVzIGEgdXNlciB0b2tlbiBhbmQgYW5kIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBhbnkgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b2tlbi4gIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdXNlciBkb2VzIG5vdCBleGlzdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyUmVtb3ZlUmVxdWVzdH0gdXNlclJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyUmVtb3ZlOiBhc3luYyAodXNlclJlbW92ZVJlcXVlc3Q6IFVzZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJSZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyUmVtb3ZlJywgJ3VzZXJSZW1vdmVSZXF1ZXN0JywgdXNlclJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJSZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBUaGlzIHRva2VuIGNhbiBiZSBzaGFyZWQgd2l0aCBhbmQgdXNlZCBieSBhIHNwZWNpZmllZCB0aGlyZC1wYXJ0eSBjbGllbnQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRocm91Z2ggc3VwcG9ydGVkIGVuZHBvaW50cy4gIEVuc3VyZSB5b3Ugc3RvcmUgdGhlIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHRoZSBgdXNlcl90b2tlbmAgYW5kIGB0aGlyZF9wYXJ0eV9jbGllbnRfaWRgLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZTogYXN5bmMgKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygndXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZScsICd1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCcsIHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC91c2VyL3RoaXJkX3BhcnR5X3Rva2VuL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gZGVsZXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gT25jZSByZW1vdmVkLCB0aGUgdG9rZW4gY2FuIGxvbmdlciBiZSB1c2VkIHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gICBBbnkgc3Vic2VxdWVudCBjYWxscyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgc2FtZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIHN0YXRpbmcgdGhlIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gZG9lcyBub3QgZXhpc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlOiBhc3luYyAodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlJywgJ3VzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0JywgdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvdGhpcmRfcGFydHlfdG9rZW4vcmVtb3ZlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGVuYWJsZSBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAgZm9yIHVzZSB3aXRoIENvbnN1bWVyIFJlcG9ydHMgYnkgUGxhaWQgQ2hlY2ssIGJ5IGFkZGluZyBhIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IHRvIHRoZSB1c2VyLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHVzZXIgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtVc2VyVXBkYXRlUmVxdWVzdH0gdXNlclVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB1c2VyVXBkYXRlOiBhc3luYyAodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3VzZXJVcGRhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd1c2VyVXBkYXRlJywgJ3VzZXJVcGRhdGVSZXF1ZXN0JywgdXNlclVwZGF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3VzZXIvdXBkYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHVzZXJVcGRhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldENyZWF0ZTogYXN5bmMgKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2FsbGV0Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0Q3JlYXRlJywgJ3dhbGxldENyZWF0ZVJlcXVlc3QnLCB3YWxsZXRDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldENyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldEdldFJlcXVlc3R9IHdhbGxldEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRHZXQ6IGFzeW5jICh3YWxsZXRHZXRSZXF1ZXN0OiBXYWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldEdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldEdldCcsICd3YWxsZXRHZXRSZXF1ZXN0Jywgd2FsbGV0R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgbGlzdHMgYWxsIGUtd2FsbGV0cyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGNyZWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhIGxpc3Qgb2YgZS13YWxsZXRzXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0TGlzdFJlcXVlc3R9IHdhbGxldExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0TGlzdDogYXN5bmMgKHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2FsbGV0TGlzdCcsICd3YWxsZXRMaXN0UmVxdWVzdCcsIHdhbGxldExpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YWxsZXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlOiBhc3luYyAod2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGUnLCAnd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCcsIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhbGxldC90cmFuc2FjdGlvbi9leGVjdXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25HZXQ6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uR2V0JywgJ3dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCcsIHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkxpc3Q6IGFzeW5jICh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhbGxldFRyYW5zYWN0aW9uTGlzdCcsICd3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0Jywgd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2FsbGV0L3RyYW5zYWN0aW9uL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZScsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9nZXRgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L2hpc3RvcnkvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9lbnRpdHkvaGl0L2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9wcm9ncmFtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3QnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9wcm9ncmFtL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHJldmlldyBmb3IgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS9yZXZpZXcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgYSBwYXJ0aWN1bGFyIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvZW50aXR5L3Jldmlldy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZTogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2VudGl0eS91cGRhdGVgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgV2F0Y2hsaXN0IFNjcmVlbmluZyB0byBjaGVjayB5b3VyIGN1c3RvbWVyIGFnYWluc3Qgd2F0Y2hsaXN0cyBkZWZpbmVkIGluIHRoZSBhc3NvY2lhdGVkIFdhdGNobGlzdCBQcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhIHBlcnNvblxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2NyZWF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvZ2V0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvaGlzdG9yeS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3VuZCBieSBQbGFpZCBmb3IgYSBwYXJ0aWN1bGFyIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXRzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9oaXQvbGlzdGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBwcmV2aW91c2x5IGNyZWF0ZWQgd2F0Y2hsaXN0IHNjcmVlbmluZ3MgZm9yIGluZGl2aWR1YWxzXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSW5kaXZpZHVhbCBXYXRjaGxpc3QgU2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL2xpc3RgO1xuICAgICAgICAgICAgLy8gdXNlIGR1bW15IGJhc2UgVVJMIHN0cmluZyBiZWNhdXNlIHRoZSBVUkwgY29uc3RydWN0b3Igb25seSBhY2NlcHRzIGFic29sdXRlIFVSTHMuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclVybE9iaiA9IG5ldyBVUkwobG9jYWxWYXJQYXRoLCBEVU1NWV9CQVNFX1VSTCk7XG4gICAgICAgICAgICBsZXQgYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGJhc2VPcHRpb25zID0gY29uZmlndXJhdGlvbi5iYXNlT3B0aW9ucztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyA9IHsgbWV0aG9kOiAnUE9TVCcsIC4uLmJhc2VPcHRpb25zLCAuLi5vcHRpb25zfTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyID0ge30gYXMgYW55O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciA9IHt9IGFzIGFueTtcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gY2xpZW50SWQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELUNMSUVOVC1JRFwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBwbGFpZFZlcnNpb24gcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBsYWlkLVZlcnNpb25cIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gc2VjcmV0IHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1TRUNSRVRcIiwgY29uZmlndXJhdGlvbilcblxuXG4gICAgXG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlclBhcmFtZXRlclsnQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24vanNvbic7XG5cbiAgICAgICAgICAgIHNldFNlYXJjaFBhcmFtcyhsb2NhbFZhclVybE9iaiwgbG9jYWxWYXJRdWVyeVBhcmFtZXRlciwgb3B0aW9ucy5xdWVyeSk7XG4gICAgICAgICAgICBsZXQgaGVhZGVyc0Zyb21CYXNlT3B0aW9ucyA9IGJhc2VPcHRpb25zICYmIGJhc2VPcHRpb25zLmhlYWRlcnMgPyBiYXNlT3B0aW9ucy5oZWFkZXJzIDoge307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmhlYWRlcnMgPSB7Li4ubG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIC4uLmhlYWRlcnNGcm9tQmFzZU9wdGlvbnMsIC4uLm9wdGlvbnMuaGVhZGVyc307XG4gICAgICAgICAgICBsb2NhbFZhclJlcXVlc3RPcHRpb25zLmRhdGEgPSBzZXJpYWxpemVEYXRhSWZOZWVkZWQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0OiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCcsICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9wcm9ncmFtL2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdDogYXN5bmMgKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCcgaXMgbm90IG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBhc3NlcnRQYXJhbUV4aXN0cygnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0KVxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJQYXRoID0gYC93YXRjaGxpc3Rfc2NyZWVuaW5nL2luZGl2aWR1YWwvcHJvZ3JhbS9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdXJsOiB0b1BhdGhTdHJpbmcobG9jYWxWYXJVcmxPYmopLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlOiBhc3luYyAod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zOiBhbnkgPSB7fSk6IFByb21pc2U8UmVxdWVzdEFyZ3M+ID0+IHtcbiAgICAgICAgICAgIC8vIHZlcmlmeSByZXF1aXJlZCBwYXJhbWV0ZXIgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0JyBpcyBub3QgbnVsbCBvciB1bmRlZmluZWRcbiAgICAgICAgICAgIGFzc2VydFBhcmFtRXhpc3RzKCd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlJywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0Jywgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QpXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclBhdGggPSBgL3dhdGNobGlzdF9zY3JlZW5pbmcvaW5kaXZpZHVhbC9yZXZpZXcvY3JlYXRlYDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBsb2NhbFZhclJlcXVlc3RPcHRpb25zLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHVybDogdG9QYXRoU3RyaW5nKGxvY2FsVmFyVXJsT2JqKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiBsb2NhbFZhclJlcXVlc3RPcHRpb25zLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Q6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9uczogYW55ID0ge30pOiBQcm9taXNlPFJlcXVlc3RBcmdzPiA9PiB7XG4gICAgICAgICAgICAvLyB2ZXJpZnkgcmVxdWlyZWQgcGFyYW1ldGVyICd3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0JywgJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCcsIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3Jldmlldy9saXN0YDtcbiAgICAgICAgICAgIC8vIHVzZSBkdW1teSBiYXNlIFVSTCBzdHJpbmcgYmVjYXVzZSB0aGUgVVJMIGNvbnN0cnVjdG9yIG9ubHkgYWNjZXB0cyBhYnNvbHV0ZSBVUkxzLlxuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJVcmxPYmogPSBuZXcgVVJMKGxvY2FsVmFyUGF0aCwgRFVNTVlfQkFTRV9VUkwpO1xuICAgICAgICAgICAgbGV0IGJhc2VPcHRpb25zO1xuICAgICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBiYXNlT3B0aW9ucyA9IGNvbmZpZ3VyYXRpb24uYmFzZU9wdGlvbnM7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMgPSB7IG1ldGhvZDogJ1BPU1QnLCAuLi5iYXNlT3B0aW9ucywgLi4ub3B0aW9uc307XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckhlYWRlclBhcmFtZXRlciA9IHt9IGFzIGFueTtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIGNsaWVudElkIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQTEFJRC1DTElFTlQtSURcIiwgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gcGxhaWRWZXJzaW9uIHJlcXVpcmVkXG4gICAgICAgICAgICBhd2FpdCBzZXRBcGlLZXlUb09iamVjdChsb2NhbFZhckhlYWRlclBhcmFtZXRlciwgXCJQbGFpZC1WZXJzaW9uXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHNlY3JldCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtU0VDUkVUXCIsIGNvbmZpZ3VyYXRpb24pXG5cblxuICAgIFxuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXJbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuXG4gICAgICAgICAgICBzZXRTZWFyY2hQYXJhbXMobG9jYWxWYXJVcmxPYmosIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXIsIG9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgbGV0IGhlYWRlcnNGcm9tQmFzZU9wdGlvbnMgPSBiYXNlT3B0aW9ucyAmJiBiYXNlT3B0aW9ucy5oZWFkZXJzID8gYmFzZU9wdGlvbnMuaGVhZGVycyA6IHt9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5oZWFkZXJzID0gey4uLmxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCAuLi5oZWFkZXJzRnJvbUJhc2VPcHRpb25zLCAuLi5vcHRpb25zLmhlYWRlcnN9O1xuICAgICAgICAgICAgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucy5kYXRhID0gc2VyaWFsaXplRGF0YUlmTmVlZGVkKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGU6IGFzeW5jICh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUnLCAnd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QnLCB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2F0Y2hsaXN0X3NjcmVlbmluZy9pbmRpdmlkdWFsL3VwZGF0ZWA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQ6IGFzeW5jICh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdDogV2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnM6IGFueSA9IHt9KTogUHJvbWlzZTxSZXF1ZXN0QXJncz4gPT4ge1xuICAgICAgICAgICAgLy8gdmVyaWZ5IHJlcXVpcmVkIHBhcmFtZXRlciAnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QnIGlzIG5vdCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgYXNzZXJ0UGFyYW1FeGlzdHMoJ3dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQnLCAnd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QnLCB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdClcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyUGF0aCA9IGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGA7XG4gICAgICAgICAgICAvLyB1c2UgZHVtbXkgYmFzZSBVUkwgc3RyaW5nIGJlY2F1c2UgdGhlIFVSTCBjb25zdHJ1Y3RvciBvbmx5IGFjY2VwdHMgYWJzb2x1dGUgVVJMcy5cbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyVXJsT2JqID0gbmV3IFVSTChsb2NhbFZhclBhdGgsIERVTU1ZX0JBU0VfVVJMKTtcbiAgICAgICAgICAgIGxldCBiYXNlT3B0aW9ucztcbiAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgYmFzZU9wdGlvbnMgPSBjb25maWd1cmF0aW9uLmJhc2VPcHRpb25zO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclJlcXVlc3RPcHRpb25zID0geyBtZXRob2Q6ICdQT1NUJywgLi4uYmFzZU9wdGlvbnMsIC4uLm9wdGlvbnN9O1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIgPSB7fSBhcyBhbnk7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyID0ge30gYXMgYW55O1xuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBjbGllbnRJZCByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUExBSUQtQ0xJRU5ULUlEXCIsIGNvbmZpZ3VyYXRpb24pXG5cbiAgICAgICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIHBsYWlkVmVyc2lvbiByZXF1aXJlZFxuICAgICAgICAgICAgYXdhaXQgc2V0QXBpS2V5VG9PYmplY3QobG9jYWxWYXJIZWFkZXJQYXJhbWV0ZXIsIFwiUGxhaWQtVmVyc2lvblwiLCBjb25maWd1cmF0aW9uKVxuXG4gICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBzZWNyZXQgcmVxdWlyZWRcbiAgICAgICAgICAgIGF3YWl0IHNldEFwaUtleVRvT2JqZWN0KGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyLCBcIlBMQUlELVNFQ1JFVFwiLCBjb25maWd1cmF0aW9uKVxuXG5cbiAgICBcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVyUGFyYW1ldGVyWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJztcblxuICAgICAgICAgICAgc2V0U2VhcmNoUGFyYW1zKGxvY2FsVmFyVXJsT2JqLCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVyLCBvcHRpb25zLnF1ZXJ5KTtcbiAgICAgICAgICAgIGxldCBoZWFkZXJzRnJvbUJhc2VPcHRpb25zID0gYmFzZU9wdGlvbnMgJiYgYmFzZU9wdGlvbnMuaGVhZGVycyA/IGJhc2VPcHRpb25zLmhlYWRlcnMgOiB7fTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuaGVhZGVycyA9IHsuLi5sb2NhbFZhckhlYWRlclBhcmFtZXRlciwgLi4uaGVhZGVyc0Zyb21CYXNlT3B0aW9ucywgLi4ub3B0aW9ucy5oZWFkZXJzfTtcbiAgICAgICAgICAgIGxvY2FsVmFyUmVxdWVzdE9wdGlvbnMuZGF0YSA9IHNlcmlhbGl6ZURhdGFJZk5lZWRlZCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucywgY29uZmlndXJhdGlvbilcblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB1cmw6IHRvUGF0aFN0cmluZyhsb2NhbFZhclVybE9iaiksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogbG9jYWxWYXJSZXF1ZXN0T3B0aW9ucyxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfVxufTtcblxuLyoqXG4gKiBQbGFpZEFwaSAtIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKi9cbmV4cG9ydCBjb25zdCBQbGFpZEFwaUZwID0gZnVuY3Rpb24oY29uZmlndXJhdGlvbj86IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yID0gUGxhaWRBcGlBeGlvc1BhcmFtQ3JlYXRvcihjb25maWd1cmF0aW9uKVxuICAgIHJldHVybiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cywgc3VjaCBhcyBgL2FjY291bnRzL2dldGAsIHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSByZWFsLXRpbWUgYmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7QWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdH0gYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0OiBBY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYWNjb3VudHNCYWxhbmNlR2V0KGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIHBhaWQgZW5kcG9pbnQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYWNjb3VudHNcbiAgICAgICAgICogQHBhcmFtIHtBY2NvdW50c0dldFJlcXVlc3R9IGFjY291bnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdDogQWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFjY291bnRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBcHBsaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFwcGxpY2F0aW9uR2V0KGFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlKGFzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZShhc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBUaGUgZXhhY3QgYW1vdW50IG9mIHRpbWUgdG8gY3JlYXRlIHRoZSByZXBvcnQgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkYXlzIG9mIGhpc3RvcnkgYXJlIHJlcXVlc3RlZCBhbmQgd2lsbCB0eXBpY2FsbHkgcmFuZ2UgZnJvbSBhIGZldyBzZWNvbmRzIHRvIGFib3V0IG9uZSBtaW51dGUuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyN3ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydENyZWF0ZShhc3NldFJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBGaWx0ZXIgQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0fSBhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3Q6IEFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZpbHRlclJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0R2V0KGFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgUERGIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UERGR2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFuIEFzc2V0IFJlcG9ydCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSB1c2VyXFwncyBhc3NldHMuIEluIG9yZGVyIHRvIFxcXCJyZWZyZXNoXFxcIiBhbiBBc3NldCBSZXBvcnQgeW91IGNyZWF0ZWQgcHJldmlvdXNseSwgeW91IGNhbiB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBBc3NldCBSZXBvcnQgYmFzZWQgb24gdGhlIG9sZCBvbmUsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZS4gIFRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgY29udGFpbiB0aGUgc2FtZSBJdGVtcyBhcyB0aGUgb3JpZ2luYWwgUmVwb3J0LCBhcyB3ZWxsIGFzIHRoZSBzYW1lIGZpbHRlcnMgYXBwbGllZCBieSBhbnkgY2FsbCB0byBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgLiBCeSBkZWZhdWx0LCB0aGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGFsc28gdXNlIHRoZSBzYW1lIHBhcmFtZXRlcnMgeW91IHN1Ym1pdHRlZCB3aXRoIHlvdXIgb3JpZ2luYWwgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCByZXF1ZXN0LCBidXQgdGhlIG9yaWdpbmFsIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgYW5kIHRoZSB2YWx1ZXMgb2YgYW55IHBhcmFtZXRlcnMgaW4gdGhlIGBvcHRpb25zYCBvYmplY3QgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBuZXcgdmFsdWVzLiBUbyBjaGFuZ2UgdGhlc2UgYXJndW1lbnRzLCBzaW1wbHkgc3VwcGx5IG5ldyB2YWx1ZXMgZm9yIHRoZW0gaW4geW91ciByZXF1ZXN0IHRvIGAvYXNzZXRfcmVwb3J0L3JlZnJlc2hgLiBTdWJtaXQgYW4gZW1wdHkgc3RyaW5nIChcXFwiXFxcIikgZm9yIGFueSBwcmV2aW91c2x5LXBvcHVsYXRlZCBmaWVsZHMgeW91IHdvdWxkIGxpa2Ugc2V0IGFzIGVtcHR5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3R9IGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBhc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdDogQXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydFJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hc3NldFJlcG9ydFJlbW92ZShhc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZywgc2F2aW5ncywgYW5kIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGF1dGggZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0F1dGhHZXRSZXF1ZXN0fSBhdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGF1dGhHZXQoYXV0aEdldFJlcXVlc3Q6IEF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEF1dGhHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5hdXRoR2V0KGF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHNlZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4geW91ciBiYW5rIHRyYW5zZmVyIGFjY291bnQuIERlYml0IHRyYW5zZmVycyBpbmNyZWFzZSB0aGlzIGJhbGFuY2Ugb25jZSB0aGVpciBzdGF0dXMgaXMgcG9zdGVkLiBDcmVkaXQgdHJhbnNmZXJzIGRlY3JlYXNlIHRoaXMgYmFsYW5jZSB3aGVuIHRoZXkgYXJlIGNyZWF0ZWQuICBUaGUgdHJhbnNhY3RhYmxlIGJhbGFuY2Ugc2hvd3MgdGhlIGFtb3VudCBpbiB5b3VyIGFjY291bnQgdGhhdCB5b3UgYXJlIGFibGUgdG8gdXNlIGZvciB0cmFuc2ZlcnMsIGFuZCBpcyBlc3NlbnRpYWxseSB5b3VyIGF2YWlsYWJsZSBiYWxhbmNlIG1pbnVzIHlvdXIgbWluaW11bSBiYWxhbmNlLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIEZCTyBhY2NvdW50cywgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgRnVsbCBTZXJ2aWNlIGNvbmZpZ3VyYXRpb24uIEl0IGNhbm5vdCBiZSB1c2VkIG9uIHlvdXIgb3duIGFjY291bnQgd2hlbiB1c2luZyBCYW5rIFRyYW5zZmVycyBpbiB0aGUgQlRTIFBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQmFsYW5jZUdldChiYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyQ3JlYXRlKGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlciBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJhbmsgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYGJhbmtfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyR2V0KGJhbmtUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGJhbmsgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXAgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHN3ZWVwX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBHZXQoYmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9iYW5rX3RyYW5zZmVyL3N3ZWVwL2xpc3RgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYCB0byBnZXQgcmlzayBpbnNpZ2h0cyBmb3IgYSBsaW5rZWQgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgcmlzayBvZiBhIGJhbmsgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0fSBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3Q6IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25BY2NvdW50Umlza0V2YWx1YXRlKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBEdXBsaWNhdGUgZm9yIGEgZ2l2ZW4gQmVhY29uIER1cGxpY2F0ZSBpZC4gIEEgQmVhY29uIER1cGxpY2F0ZSByZXByZXNlbnRzIGEgcGFpciBvZiBzaW1pbGFyIEJlYWNvbiBVc2VycyB3aXRoaW4geW91ciBvcmdhbml6YXRpb24uICBUd28gQmVhY29uIFVzZXIgcmV2aXNpb25zIGFyZSByZXR1cm5lZCBmb3IgZWFjaCBEdXBsaWNhdGUgcmVjb3JkIGluIGVpdGhlciB0aGUgYGJlYWNvbl91c2VyMWAgb3IgYGJlYWNvbl91c2VyMmAgcmVzcG9uc2UgZmllbGRzLiAgVGhlIGBhbmFseXNpc2AgZmllbGQgaW4gdGhlIHJlc3BvbnNlIGluZGljYXRlcyB3aGljaCBmaWVsZHMgbWF0Y2hlZCBiZXR3ZWVuIGBiZWFjb25fdXNlcjFgIGFuZCBgYmVhY29uX3VzZXIyYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0fSBiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3Q6IEJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uRHVwbGljYXRlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uRHVwbGljYXRlR2V0KGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0fSBiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3Q6IEJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JlYWNvbi9yZXBvcnQvbGlzdGAgZW5kcG9pbnQgdG8gdmlldyBhbGwgQmVhY29uIFJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoZSByZXBvcnRzIHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgYXJlIGV4Y2x1c2l2ZWx5IHJlcG9ydHMgeW91IGNyZWF0ZWQgZm9yIGEgc3BlY2lmaWMgdXNlci4gQSBCZWFjb24gVXNlciBjYW4gb25seSBoYXZlIG9uZSBhY3RpdmUgcmVwb3J0IGF0IGEgdGltZSwgYnV0IGEgbmV3IHJlcG9ydCBjYW4gYmUgY3JlYXRlZCBpZiBhIHByZXZpb3VzIHJlcG9ydCBoYXMgYmVlbiBkZWxldGVkLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydExpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb24gZm9yIGEgZ2l2ZW4gQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBpZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgQWNjb3VudCBJbnNpZ2h0cyBmb3IgYWxsIEFjY291bnRzIGxpbmtlZCB0byB0aGlzIEJlYWNvbiBVc2VyLiBUaGUgaW5zaWdodHMgZm9yIGVhY2ggYWNjb3VudCBhcmUgY29tcHV0ZWQgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uIHRoYXQgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdH0gYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0KGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0OiBCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbmQgc2NhbiBhIEJlYWNvbiBVc2VyIGFnYWluc3QgeW91ciBCZWFjb24gUHJvZ3JhbSwgYWNjb3JkaW5nIHRvIHlvdXIgcHJvZ3JhbVxcJ3Mgc2V0dGluZ3MuICBXaGVuIHlvdSBzdWJtaXQgYSBuZXcgdXNlciB0byBgL2JlYWNvbi91c2VyL2NyZWF0ZWAsIHNldmVyYWwgY2hlY2tzIGFyZSBwZXJmb3JtZWQgaW1tZWRpYXRlbHk6ICAgIC0gVGhlIHVzZXJcXCdzIFBJSSAocHJvdmlkZWQgd2l0aGluIHRoZSBgdXNlcmAgb2JqZWN0KSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIFBJSSBpcyBhbHNvIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydHMgY3JlYXRlZCBieSB5b3VyIG9yZ2FuaXphdGlvbiBhY3Jvc3MgYWxsIG9mIHlvdXIgQmVhY29uIFByb2dyYW1zLiBJZiB0aGUgdXNlclxcJ3MgZGF0YSBtYXRjaGVzIGEgZnJhdWQgcmVwb3J0IHRoYXQgeW91ciB0ZWFtIGNyZWF0ZWQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIHN0YXR1cyBvZiBgcmVqZWN0ZWRgLiAgICAtIEZpbmFsbHksIHRoZSB1c2VyXFwncyBQSUkgaXMgc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0IHNoYXJlZCB3aXRoIHRoZSBCZWFjb24gTmV0d29yayBieSBvdGhlciBjb21wYW5pZXMuIElmIGEgbWF0Y2hpbmcgZnJhdWQgcmVwb3J0IGlzIGZvdW5kLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBgcGVuZGluZ19yZXZpZXdgIHN0YXR1cyBpZiB5b3VyIHByb2dyYW0gaGFzIGVuYWJsZWQgYXV0b21hdGljIGZsYWdnaW5nIGJhc2VkIG9uIG5ldHdvcmsgZnJhdWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckNyZWF0ZVJlcXVlc3R9IGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdDogQmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBCZWFjb24gVXNlciBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBCZWFjb24gVXNlclxcJ3MgaGlzdG9yeVxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3R9IGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBiZWFjb25Vc2VySGlzdG9yeUxpc3QoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdDogQmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VySGlzdG9yeUxpc3QoYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldmlldyBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclJldmlld1JlcXVlc3R9IGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdDogQmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbSBvciBhZGQgbmV3IGFjY291bnRzIHRvIHRoZSBCZWFjb24gVXNlci4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhbiBpZGVudGl0eSBkYXRhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VuZCBhIHJlcXVlc3QgdG8gdGhlIGAvY2F0ZWdvcmllcy9nZXRgIGVuZHBvaW50IHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBjYXRlZ29yaWVzIHJldHVybmVkIGJ5IFBsYWlkLiBUaGlzIGVuZHBvaW50IGRvZXMgbm90IHJlcXVpcmUgYXV0aGVudGljYXRpb24uICBBbGwgaW1wbGVtZW50YXRpb25zIGFyZSByZWNvbW1lbmRlZCB0byB1c2UgdGhlIG5ld2VyIGBwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5YCB0YXhvbm9teSBpbnN0ZWFkIG9mIHRoZSBvbGRlciBgY2F0ZWdvcnlgIHRheG9ub215IHN1cHBvcnRlZCBieSB0aGlzIGVuZHBvaW50LiBUaGUgW2BwZXJzb25hbF9maW5hbmNlX2NhdGVnb3J5IHRheG9ub215YCBDU1YgZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jdW1lbnRzL3RyYW5zYWN0aW9ucy1wZXJzb25hbC1maW5hbmNlLWNhdGVnb3J5LXRheG9ub215LmNzdikgaXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBhbmQgaXMgbm90IGFjY2Vzc2libGUgdmlhIEFQSS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGNhdGVnb3JpZXNcbiAgICAgICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDYXRlZ29yaWVzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY2F0ZWdvcmllc0dldChib2R5LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIEl0ZW0gY29uc2VudCBldmVudHMuIENvbnNlbnQgbG9ncyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGV2ZW50cyBvY2N1cnJpbmcgb24gb3IgYWZ0ZXIgTm92ZW1iZXIgNywgMjAyNC4gVXAgdG8gdGhyZWUgeWVhcnMgb2YgY29uc2VudCBsb2dzIHdpbGwgYmUgYXZhaWxhYmxlIHZpYSB0aGUgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiBpdGVtIGNvbnNlbnQgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Q29uc2VudEV2ZW50c0dldFJlcXVlc3R9IGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY29uc2VudEV2ZW50c0dldChjb25zZW50RXZlbnRzR2V0UmVxdWVzdDogQ29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q29uc2VudEV2ZW50c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYWxsIGV4aXN0aW5nIENSQiBCYW5rIEluY29tZSBhbmQgQmFzZSByZXBvcnRzIGZvciB0aGUgY29uc3VtZXIgaW4gUERGIGZvcm1hdC4gIFJlc3BvbnNlIGlzIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgUmVwb3J0c1xuICAgICAgICAgKiBAcGFyYW0ge0NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdH0gY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0OiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNvbnN1bWVyUmVwb3J0UGRmR2V0KGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2JhbmtfaW5jb21lL2NyZWF0ZWAgY3JlYXRlcyBhIENSQSByZXBvcnQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQ1JBIHJlcG9ydCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0fSBjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUJhbmtJbmNvbWVDcmVhdGUoY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3Q6IENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUJhbmtJbmNvbWVDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFCYW5rSW5jb21lQ3JlYXRlKGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmFCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3Q6IENyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUJhbmtJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBCYXNlIFJlcG9ydCBmb3IgeW91ciB1c2VyLCBhbGxvd2luZyB5b3UgdG8gcmVjZWl2ZSBjb21wcmVoZW5zaXZlIGJhbmsgYWNjb3VudCBhbmQgY2FzaCBmbG93IGRhdGEuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBDYXNoZmxvdyBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzLCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JhX2Nhc2hmbG93X2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua2luZyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgY3JlYXRlcyBhIENvbnN1bWVyIFJlcG9ydCBwb3dlcmVkIGJ5IFBsYWlkIENoZWNrLiBZb3UgY2FuIGNhbGwgdGhpcyBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcmVwb3J0IGlmIGBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZWAgd2FzIG9taXR0ZWQgZHVyaW5nIExpbmsgdG9rZW4gY3JlYXRpb24uIElmIHlvdSBkaWQgcHJvdmlkZSBhIGBjb25zdW1lcl9yZXBvcnRfcGVybWlzc2libGVfcHVycG9zZWAgZHVyaW5nIExpbmsgdG9rZW4gY3JlYXRpb24sIHRoZW4gUGxhaWQgQ2hlY2sgd2lsbCBhdXRvbWF0aWNhbGx5IGJlZ2luIGNyZWF0aW5nIGEgQ29uc3VtZXIgUmVwb3J0IG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBMaW5rIHByb2Nlc3MsIGFuZCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYmVmb3JlIHJldHJpZXZpbmcgdGhlIHJlcG9ydC4gICBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHRvIHJlZnJlc2ggZGF0YSBpbiBhbiBleGlzdGluZyByZXBvcnQuIEEgQ29uc3VtZXIgUmVwb3J0IHdpbGwgbGFzdCBmb3IgMjQgaG91cnMgYmVmb3JlIGV4cGlyaW5nOyB5b3Ugc2hvdWxkIGNhbGwgYW55IGAvZ2V0YCBlbmRwb2ludHMgb24gdGhlIHJlcG9ydCBiZWZvcmUgaXQgZXhwaXJlcy4gSWYgYSByZXBvcnQgZXhwaXJlcywgeW91IGNhbiBjYWxsIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGFnYWluIHRvIHJlLWdlbmVyYXRlIGl0LiBOb3RlIHRoYXQgcmVmcmVzaGluZyBvciByZWdlbmVyYXRpbmcgYSByZXBvcnQgaXMgYSBiaWxsYWJsZSBldmVudC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQ29uc3VtZXIgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydENyZWF0ZShjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiAgWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua3NcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyBwcm9kdWN0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmFfbmV0d29ya19hdHRyaWJ1dGVzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBhdHRyaWJ1dGVzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbmV0d29yayBhdHRyaWJ1dGVzIGZvciB0aGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIFBhcnRuZXIgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGNhbGwgb3VyIHBhcnRuZXJzIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbnNpZ2h0cyBmcm9tIHBhcnRuZXJzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCeSBkZWZhdWx0LCB0aGUgbW9zdCByZWNlbnQgQmFzZSBSZXBvcnQgKGlmIGl0IGV4aXN0cykgZm9yIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHJlcXVlc3QgdGhhdCB0aGUgbW9zdCByZWNlbnQgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBiZSBpbmNsdWRlZCBpbiB0aGUgUERGIGFzIHdlbGwsIHVzZSB0aGUgYGFkZC1vbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBDb25zdW1lciBSZXBvcnRzIGFzIGEgUERGXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhQ2hlY2tSZXBvcnRQZGZHZXQoY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvYXBwbGljYXRpb25zL3JlZ2lzdGVyYCByZWdpc3RlcnMgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9ucy5cbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdH0gY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0OiBDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3JlZ2lzdGVyYCByZWdpc3RlcnMgYSBsaXN0IG9mIGxvYW5zIHRvIHRoZWlyIGFwcGxpY2FudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGEgbGlzdCBvZiBsb2FucyB0byB0aGVpciBhcHBsaWNhbnRzLlxuICAgICAgICAgKiBAcGFyYW0ge0NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0fSBjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYUxvYW5zUmVnaXN0ZXIoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3Q6IENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYUxvYW5zUmVnaXN0ZXJSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmAgaW5kaWNhdGVzIHRoZSBsb2FucyBoYXZlIHJlYWNoZWQgYSBmaW5hbCBzdGF0dXMgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVucmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYUxvYW5zVW5yZWdpc3RlcihjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvdXBkYXRlYCB1cGRhdGVzIGxvYW4gaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgc3RhdHVzIGFuZCBwYXltZW50IGhpc3RvcnkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZXMgbG9hbiBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVXBkYXRlUmVxdWVzdH0gY3JhTG9hbnNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhTG9hbnNVcGRhdGUoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0OiBDcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFMb2Fuc1VwZGF0ZShjcmFMb2Fuc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgYSBNb25pdG9yaW5nIEluc2lnaHRzIHJlcG9ydCBieSBwYXNzaW5nIGluIHRoZSBgdXNlcl90b2tlbmAgcmVmZXJyZWQgdG8gaW4gdGhlIHdlYmhvb2sgeW91IHJlY2VpdmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSB0byBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBsaW5rZWQgQ1JBIGl0ZW1zLCB3aGljaCBhcmUgdXBkYXRlZCBldmVyeSBkYXkgKGJlc3QtZWZmb3J0KS5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gdW5zdWJzY3JpYmUgZnJvbSBwcmV2aW91c2x5IHN1YnNjcmliZWQgTW9uaXRvcmluZyBJbnNpZ2h0cy5cbiAgICAgICAgICogQHN1bW1hcnkgVW5zdWJzY3JpYmUgZnJvbSBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL3BhcnRuZXJfaW5zaWdodHMvZ2V0YCByZXR1cm5zIGNhc2ggZmxvdyBpbnNpZ2h0cyBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdC4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QXNzZXRSZXBvcnRGcmVkZGllTWFjR2V0KHJlcXVlc3RCb2R5OiB7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEZyZWRkaWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gY3JlYXRlIGFuIEF1ZGl0IENvcHkgdG9rZW4gb2YgYW4gQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IHRvIHNoYXJlIHdpdGggcGFydGljaXBhdGluZyBHb3Zlcm5tZW50IFNwb25zb3JlZCBFbnRpdHkgKEdTRSkuIElmIHlvdSBwYXJ0aWNpcGF0ZSBpbiB0aGUgRGF5IDEgQ2VydGFpbnR54oSiIHByb2dyYW0sIFBsYWlkIGNhbiBzdXBwbHkgYW4gQXVkaXQgQ29weSB0b2tlbiBkaXJlY3RseSB0byBGYW5uaWUgTWFlIG9uIHlvdXIgYmVoYWxmLiBBbiBBdWRpdCBDb3B5IHRva2VuIGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0IGFuZC9vciBJbmNvbWUgUmVwb3J0IChyZXN1bHQgb2YgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXQpLiAgVXNlIHRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGFuIGBhdWRpdF9jb3B5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8gdGhlIEdTRSB3aG8gbmVlZHMgYWNjZXNzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgb3IgSW5jb21lIFJlcG9ydCBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyAgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfZW1wbG95bWVudC9nZXRgIHJldHVybnMgdGhlIGVtcGxveW1lbnQgcmVwb3J0KHMpIGRlcml2ZWQgZnJvbSBiYW5rIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgZW1wbG95bWVudCB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuIEEgc2luZ2xlIHJlcG9ydCBjb3JyZXNwb25kcyB0byBhbGwgaW5zdGl0dXRpb25zIGxpbmtlZCBpbiBhIHNpbmdsZSBMaW5rIHNlc3Npb24uIFRvIGluY2x1ZGUgbXVsdGlwbGUgaW5zdGl0dXRpb25zIGluIGEgc2luZ2xlIHJlcG9ydCwgdXNlIFtNdWx0aS1JdGVtIExpbmtdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9tdWx0aS1pdGVtLWxpbmspLiBUbyByZXR1cm4gb2xkZXIgcmVwb3J0cywgdXNlIHRoZSBgb3B0aW9ucy5jb3VudGAgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuICBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3JlZnJlc2hgIHJlZnJlc2hlcyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGRhdGEgZm9yIGEgc3BlY2lmaWMgdXNlci4gSWYgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBpcyBubyBsb25nZXIgdmFsaWQgKGkuZS4gZGVsZXRlZCksIHRoZSBlbmRwb2ludCB3aWxsIHJlZnJlc2ggdGhlIG1vc3QgcmVjZW50IHZhbGlkIHJlcG9ydCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgdXNlclxcJ3MgYmFuayBpbmNvbWUgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoKGNyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIG9yIHVuc3Vic2NyaWJlIGEgdXNlciBmb3IgaW5jb21lIHdlYmhvb2sgbm90aWZpY2F0aW9ucy4gQnkgZGVmYXVsdCwgYWxsIHVzZXJzIHN0YXJ0IG91dCB1bnN1YnNjcmliZWQuICBJZiBhIHVzZXIgaXMgc3Vic2NyaWJlZCwgb24gc2lnbmlmaWNhbnQgY2hhbmdlcyB0byB0aGUgdXNlclxcJ3MgaW5jb21lIHByb2ZpbGUsIHlvdSB3aWxsIHJlY2VpdmUgYSBgQkFOS19JTkNPTUVfUkVGUkVTSF9VUERBVEVgIHdlYmhvb2ssIHByb21wdGluZyB5b3UgdG8gcmVmcmVzaCBiYW5rIGluY29tZSBkYXRhIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGUoY3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdEVtcGxveW1lbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBWZXJpZmljYXRpb24gb2YgQXNzZXRzIGFuZCBWZXJpZmljYXRpb24gb2YgRW1wbG95bWVudCByZXBvcnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQgKGFrYSBWT0EgLSBWZXJpZmljYXRpb24gT2YgQXNzZXRzKSwgYW5kIGEgVmVyaWZpY2F0aW9uIE9mIEVtcGxveW1lbnQgKFZPRSkgcmVwb3J0IGlmIHRoaXMgb25lIGlzIGF2YWlsYWJsZS4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0fSBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldChjcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3Q6IENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3BhcnNpbmdfY29uZmlnL3VwZGF0ZWAgdXBkYXRlcyB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgcGFyc2luZyBjb25maWd1cmF0aW9uIGZvciBhIGRvY3VtZW50IGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbi4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCB0aGF0IGluZm9ybWF0aW9uIHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRva2VuLCBhbmQgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgYGVtcGxveWVyYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgV2hlbiB0ZXN0aW5nIGluIFNhbmRib3gsIHlvdSBjYW4gY29udHJvbCB0aGUgcmVzdWx0cyBieSBwcm92aWRpbmcgc3BlY2lhbCB0ZXN0IHZhbHVlcyBpbiB0aGUgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGZpZWxkcy4gYGVtcGxveWVyX2dvb2RgIGFuZCBgZW1wbG95ZXJfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIGBlbXBsb3llcl9tdWx0aWAgd2lsbCByZXN1bHQgaW4gYSBgSElHSGAgY29uZmlkZW5jZSB3aXRoIG11bHRpcGxlIHBheXJvbGwgb3B0aW9ucy4gTGlrZXdpc2UsIGBhY2Nlc3NfZ29vZGAgYW5kIGBhY2Nlc3NfYmFkYCB3aWxsIHJlc3VsdCBpbiBgSElHSGAgYW5kIGBMT1dgIGNvbmZpZGVuY2UgdmFsdWVzLCByZXNwZWN0aXZlbHkuIEFueSBvdGhlciB2YWx1ZSBmb3IgYGVtcGxveWVyYCBhbmQgYGFjY2Vzc190b2tlbnNgIGluIFNhbmRib3ggd2lsbCByZXN1bHQgaW4gYFVOS05PV05gIGNvbmZpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENoZWNrIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL3Jpc2tfc2lnbmFscy9nZXRgIGNhbiBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93IHRvIGFzc2VzcyBhIHVzZXItdXBsb2FkZWQgZG9jdW1lbnQgZm9yIHNpZ25zIG9mIHBvdGVudGlhbCBmcmF1ZCBvciB0YW1wZXJpbmcuIEl0IHJldHVybnMgYSByaXNrIHNjb3JlIGZvciBlYWNoIHVwbG9hZGVkIGRvY3VtZW50IHRoYXQgaW5kaWNhdGVzIHRoZSBsaWtlbGlob29kIG9mIHRoZSBkb2N1bWVudCBiZWluZyBmcmF1ZHVsZW50LCBpbiBhZGRpdGlvbiB0byBkZXRhaWxzIG9uIHRoZSBpbmRpdmlkdWFsIHJpc2sgc2lnbmFscyBjb250cmlidXRpbmcgdG8gdGhlIHNjb3JlLiAgVG8gdHJpZ2dlciByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGZvciBhbiBJdGVtLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYHBhcnNpbmdfY29uZmlnYCBzZXQgdG8gaW5jbHVkZSBgcmlza19zaWduYWxzYCwgb3IgY2FsbCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgLiBPbmNlIHJpc2sgc2lnbmFsIGdlbmVyYXRpb24gaGFzIGJlZW4gdHJpZ2dlcmVkLCBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lIGFmdGVyIHRoZSBgSU5DT01FX1ZFUklGSUNBVElPTl9SSVNLX1NJR05BTFNgIHdlYmhvb2sgaGFzIGJlZW4gZmlyZWQuICBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBEb2N1bWVudCBJbmNvbWUgYW5kIGlzIGJpbGxlZCBzZXBhcmF0ZWx5LiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBwcm9kdWN0IGFjY2VzcyByZXF1ZXN0IG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXQoY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmVsYXkgdG9rZW4gdG8gc2hhcmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggYSBwYXJ0bmVyIGNsaWVudFxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdH0gY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0OiBDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5R2V0KGNyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBwZGYgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3UgKGJldGEpXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3Q6IENyZWRpdFJlbGF5UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxhbnk+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlZnJlc2hgIGVuZHBvaW50IGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlZnJlc2ggYSByZXBvcnQgdGhhdCB3YXMgcmVsYXllZCB0byB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiBBIG5ldyByZXBvcnQgd2lsbCBiZSBjcmVhdGVkIHdpdGggdGhlIG9yaWdpbmFsIHJlcG9ydCBwYXJhbWV0ZXJzLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUgYmFzZWQgb24gdGhlIGBkYXlzX3JlcXVlc3RlZGAgdmFsdWUgb2YgdGhlIG9yaWdpbmFsIHJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdH0gY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPENyZWRpdFJlbGF5UmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZWxheVJlbW92ZShjcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBBdWRpdCBDb3B5IHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBjcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0OiBDcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIExpbmsgc2Vzc2lvbnMgZm9yIHlvdXIgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFNlc3Npb25zR2V0UmVxdWVzdH0gY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0OiBDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8Q3JlZGl0U2Vzc2lvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Rhc2hib2FyZF91c2VyL2xpc3RgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWxsIERhc2hib2FyZCB1c2VycyBhc3NvY2lhdGVkIHdpdGggeW91ciBhY2NvdW50LiBUaGlzIGNhbiB1c2UgdXNlZCB0byBhdWRpdCBvciB0cmFjayB0aGUgbGlzdCBvZiByZXZpZXdlcnMgZm9yIE1vbml0b3IsIEJlYWNvbiwgYW5kIElkZW50aXR5IFZlcmlmaWNhdGlvbiBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBkYXNoYm9hcmQgdXNlcnNcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3R9IGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRhc2hib2FyZFVzZXJMaXN0KGRhc2hib2FyZFVzZXJMaXN0UmVxdWVzdDogRGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERhc2hib2FyZFVzZXJMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBwcm92aWRlcyBhbiBhbHRlcm5hdGl2ZSB0byBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAgZm9yIGN1c3RvbWVycyB3aG8gaGF2ZSBub3QgeWV0IGZ1bGx5IGludGVncmF0ZWQgd2l0aCBQbGFpZCBFeGNoYW5nZS4gTGlrZSBgL2RlcG9zaXRfc3dpdGNoL2NyZWF0ZWAsIGl0IGNyZWF0ZXMgYSBkZXBvc2l0IHN3aXRjaCBlbnRpdHkgdGhhdCB3aWxsIGJlIHBlcnNpc3RlZCB0aHJvdWdob3V0IHRoZSBsaWZlY3ljbGUgb2YgdGhlIHN3aXRjaC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlKGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZGVwb3NpdFN3aXRjaENyZWF0ZShkZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGhvdyB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBwYXlyb2xsIGFsbG9jYXRpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgc3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGxvZ2ljIHJlbGF0ZWQgdG8gdGhlIHVzZXJcXCdzIGRpcmVjdCBkZXBvc2l0IGFsbG9jYXRpb24gcHJlZmVyZW5jZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaEdldFJlcXVlc3R9IGRlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdDogRGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJbiBvcmRlciBmb3IgdGhlIGVuZCB1c2VyIHRvIHRha2UgYWN0aW9uLCB5b3Ugd2lsbCBuZWVkIHRvIGNyZWF0ZSBhIHB1YmxpYyB0b2tlbiByZXByZXNlbnRpbmcgdGhlIGRlcG9zaXQgc3dpdGNoLiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBJdCBjYW4gYmUgdXNlZCBvbmUgdGltZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBcbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxFbXBsb3llcnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvZW1wbG95bWVudC92ZXJpZmljYXRpb24vZ2V0YCByZXR1cm5zIGEgbGlzdCBvZiBlbXBsb3ltZW50cyB0aHJvdWdoIGEgdXNlciBwYXlyb2xsIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIHN1bW1hcnkgb2YgYW4gaW5kaXZpZHVhbFxcJ3MgZW1wbG95bWVudCBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5lbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IFdlYmhvb2sgcmVjZWl2ZXIgZm9yIGZkeCBub3RpZmljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7RkRYTm90aWZpY2F0aW9ufSBmRFhOb3RpZmljYXRpb24gXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBmZHhOb3RpZmljYXRpb25zKGZEWE5vdGlmaWNhdGlvbjogRkRYTm90aWZpY2F0aW9uLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPHZvaWQ+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb24sIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYSBzcGVjaWZpYyByZWNpcGllbnRcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50SWQgUmVjaXBpZW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29BVVRIU1RBVEVJRF0gVGhlIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIE9BdXRoIFVSSSBcXCYjMzk7c3RhdGVcXCYjMzk7IHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGdldFJlY2lwaWVudChyZWNpcGllbnRJZDogc3RyaW5nLCBvQVVUSFNUQVRFSUQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8R2V0UmVjaXBpZW50UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuZ2V0UmVjaXBpZW50KHJlY2lwaWVudElkLCBvQVVUSFNUQVRFSUQsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBSZWNpcGllbnRzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRzXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBnZXRSZWNpcGllbnRzKG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8R2V0UmVjaXBpZW50c1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmdldFJlY2lwaWVudHMob3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGAgdG8gcmV0cmlldmUgaWRlbnRpdHkgZGV0YWlscyB3aGVuIHVzaW5nIFtJZGVudGl0eSBEb2N1bWVudCBVcGxvYWRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHkvaWRlbnRpdHktZG9jdW1lbnQtdXBsb2FkLykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgdXBsb2FkZWQgZG9jdW1lbnQgaWRlbnRpdHlcbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IElkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlNYXRjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgZm9yIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaWRlbnRpdHkgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5UmVmcmVzaFJlcXVlc3R9IGlkZW50aXR5UmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdDogSWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVJlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93IGEgY3VzdG9tZXIgdG8gcmV0cnkgdGhlaXIgSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJ5IGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGFuIGluY29tZSB2ZXJpZmljYXRpb24gaW5zdGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIElmIERvY3VtZW50IEluY29tZSB3YXMgdXNlZCwgdGhlIGRvY3VtZW50cyB3aWxsIGJlIHRob3NlIHRoZSB1c2VyIHByb3ZpZGVkIGluIExpbmsuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gSWYgYSBgZG9jdW1lbnRfaWRgIGlzIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhpcyBmaWxlLiBJZiBub3QsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYWxsIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPGFueT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZChpbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHBheXN0dWJzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXQoaW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDaGVjayBkaWdpdGFsIGluY29tZSB2ZXJpZmljYXRpb24gZWxpZ2liaWxpdHkgYW5kIG9wdGltaXplIGNvbnZlcnNpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldChpbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYWxsIHN1cHBvcnRlZCBpbnN0aXR1dGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYSBzcGVjaWZpZWQgZmluYW5jaWFsIGluc3RpdHV0aW9uIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIGFsbG93IHVzZSBvZiB0aGUgYHB1YmxpY19rZXlgIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgaGFzIGJlZW4gZGVwcmVjYXRlZDsgYWxsIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIGluc3RlYWQuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbiBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldEJ5SWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2F1dGgvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBkYXRhIHRvIGZhY2lsaXRhdGUgdGhlIHRyYW5zZmVyIG9mIGhvbGRpbmdzXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkYXRhIG5lZWRlZCB0byBhdXRob3JpemUgYW4gaW52ZXN0bWVudHMgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNBdXRoR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHN0b2NrIHBvc2l0aW9uIGRhdGEgZm9yIGBpbnZlc3RtZW50YC10eXBlIGFjY291bnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGludmVzdG1lbnRzSG9sZGluZ3NHZXQoaW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIEludmVzdG1lbnRzIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IGludmVzdG1lbnQgaG9sZGluZ3MgYW5kIHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNpbnZlc3RtZW50c190cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFuZCBob2xkaW5ncyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJbnZlc3RtZW50cyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGludmVzdG1lbnQgYWNjb3VudHMuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGZpcnN0IGNhbGxlZCwgUGxhaWQgd2lsbCB3YWl0IGZvciB0aGUgZGF0YS4gRm9yIHRoaXMgcmVhc29uLCBjYWxsaW5nIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0ludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQoaW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBhIHNwZWNpZmljIGBJc3N1ZWAuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIHNpbmdsZSBgSXNzdWVgIG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzR2V0UmVxdWVzdH0gaXNzdWVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0OiBJc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPElzc3Vlc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuICBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIGBJc3N1ZWAgb2JqZWN0cywgd2l0aCBhbiBlbXB0eSBsaXN0IGluZGljYXRpbmcgdGhhdCBubyBpc3N1ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpZGVudGlmaWVycyBtdXN0IGJlIHByb3ZpZGVkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGZvciBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1NlYXJjaFJlcXVlc3R9IGlzc3Vlc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdDogSXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJc3N1ZXNTZWFyY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFsbG93cyBhIHVzZXIgdG8gc3Vic2NyaWJlIHRvIHVwZGF0ZXMgb24gYSBzcGVjaWZpYyBgSXNzdWVgIHVzaW5nIGEgUE9TVCBtZXRob2QuIFN1YnNjcmliZXJzIHdpbGwgcmVjZWl2ZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMgd2hlbiB0aGUgaXNzdWUgc3RhdHVzIGNoYW5nZXMsIHBhcnRpY3VsYXJseSB3aGVuIHJlc29sdmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgdG8gYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0fSBpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3Q6IElzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXNzdWVzU3Vic2NyaWJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0gZG9lcyBub3QgZXhwaXJlIGFuZCBzaG91bGQgYmUgc3RvcmVkIGluIGEgcGVyc2lzdGVudCwgc2VjdXJlIG1hbm5lci4gIFlvdSBjYW4gdXNlIHRoZSBgL2l0ZW0vYWNjZXNzX3Rva2VuL2ludmFsaWRhdGVgIGVuZHBvaW50IHRvIHJvdGF0ZSB0aGUgYGFjY2Vzc190b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoZSBlbmRwb2ludCByZXR1cm5zIGEgbmV3IGBhY2Nlc3NfdG9rZW5gIGFuZCBpbW1lZGlhdGVseSBpbnZhbGlkYXRlcyB0aGUgcHJldmlvdXMgYGFjY2Vzc190b2tlbmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0fSBpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGUoaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3Q6IEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUFjdGl2aXR5TGlzdChpdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFbmFibGUgY29uc3VtZXJzIHRvIHVwZGF0ZSBwcm9kdWN0IGFjY2VzcyBvbiBzZWxlY3RlZCBhY2NvdW50cyBmb3IgYW4gYXBwbGljYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTm90ZTogQXMgb2YgSnVseSAyMDIwLCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGFuIGBhY2Nlc3NfdG9rZW5gIHRvIGNyZWF0ZSBhIExpbmsgdG9rZW4gZm9yIHVzZSB3aXRoIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKS4gIElmIHlvdSBuZWVkIHlvdXIgdXNlciB0byB0YWtlIGFjdGlvbiB0byByZXN0b3JlIG9yIHJlc29sdmUgYW4gZXJyb3IgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIGdlbmVyYXRlIGEgcHVibGljIHRva2VuIHdpdGggdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBhbmQgdGhlbiBpbml0aWFsaXplIExpbmsgd2l0aCB0aGF0IGBwdWJsaWNfdG9rZW5gLiAgQSBgcHVibGljX3Rva2VuYCBpcyBvbmUtdGltZSB1c2UgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gWW91IHVzZSBhIGBwdWJsaWNfdG9rZW5gIHRvIGluaXRpYWxpemUgTGluayBpbiBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZm9yIGEgcGFydGljdWxhciBJdGVtLiBZb3UgY2FuIGdlbmVyYXRlIGEgYHB1YmxpY190b2tlbmAgZm9yIGFuIEl0ZW0gZXZlbiBpZiB5b3UgZGlkIG5vdCB1c2UgTGluayB0byBjcmVhdGUgdGhlIEl0ZW0gb3JpZ2luYWxseS4gIFRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgKipub3QqKiB1c2VkIHRvIGNyZWF0ZSB5b3VyIGluaXRpYWwgYHB1YmxpY190b2tlbmAuIElmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IHJlY2VpdmVkIGFuIGBhY2Nlc3NfdG9rZW5gIGZvciBhIHNwZWNpZmljIEl0ZW0sIHVzZSBMaW5rIHRvIG9idGFpbiB5b3VyIGBwdWJsaWNfdG9rZW5gIGluc3RlYWQuIFNlZSB0aGUgW1F1aWNrc3RhcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvcXVpY2tzdGFydCkgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwdWJsaWMgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IuaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0dXMgb2YgYW4gSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1HZXRSZXF1ZXN0fSBpdGVtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1HZXQoaXRlbUdldFJlcXVlc3Q6IEl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtSW1wb3J0KGl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSBwdWJsaWMgdG9rZW4gZm9yIGFuIGFjY2VzcyB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtUHVibGljVG9rZW5FeGNoYW5nZShpdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBDYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIGEgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSB3aGVuIG9mZmJvYXJkaW5nIHVzZXJzIG9yIGlmIGEgdXNlciBjaG9vc2VzIHRvIGRpc2Nvbm5lY3QgYW4gYWNjb3VudCBsaW5rZWQgdmlhIFBsYWlkLiBGb3Igc3Vic2NyaXB0aW9uIHByb2R1Y3RzLCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgTGlhYmlsaXRpZXMsIGFuZCBJbnZlc3RtZW50cywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyByZXF1aXJlZCB0byBlbmQgc3Vic2NyaXB0aW9uIGJpbGxpbmcgZm9yIHRoZSBJdGVtLiBGb3IgbW9uZXkgbW92ZW1lbnQgcHJvZHVjdHMgc3VjaCBhcyBBdXRoIGFuZCBUcmFuc2ZlciwgaWYgdGhlIEl0ZW0gaXMgYXQgYW4gaW5zdGl0dXRpb24gdGhhdCB1c2VzIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKFRBTnMpLCBzdWNoIGFzIENoYXNlIG9yIFBOQywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCB3aWxsIGludmFsaWRhdGUgdGhlIFRBTiwgYW5kIHN1YnNlcXVlbnQgQUNIIHRyYW5zZmVyIGF0dGVtcHRzIHVzaW5nIHRoYXQgVEFOIHdpbGwgYmUgcmV0dXJuZWQuICBJbiBMaW1pdGVkIFByb2R1Y3Rpb24sIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgZG9lcyBub3QgaW1wYWN0IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIExpbWl0ZWQgUHJvZHVjdGlvbiBJdGVtcyB5b3UgaGF2ZSBhdmFpbGFibGUuICBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgYWNjZXNzIHRvIHRoZW0gc3BlY2lmaWNhbGx5IHVzaW5nIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVJlbW92ZVJlcXVlc3R9IGl0ZW1SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdDogSXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5pdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saWFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHJldHVybnMgdmFyaW91cyBkZXRhaWxzIGFib3V0IGFuIEl0ZW0gd2l0aCBsb2FuIG9yIGNyZWRpdCBhY2NvdW50cy4gTGlhYmlsaXRpZXMgZGF0YSBpcyBhdmFpbGFibGUgcHJpbWFyaWx5IGZvciBVUyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB3aXRoIHNvbWUgbGltaXRlZCBjb3ZlcmFnZSBvZiBDYW5hZGlhbiBpbnN0aXR1dGlvbnMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYWNjb3VudCB0eXBlcyBhcmUgYWNjb3VudCB0eXBlIGBjcmVkaXRgIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBjcmVkaXQgY2FyZGAgb3IgYHBheXBhbGAsIGFuZCBhY2NvdW50IHR5cGUgYGxvYW5gIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCBvciBgbW9ydGdhZ2VgLiBUbyBsaW1pdCBhY2NvdW50cyBsaXN0ZWQgaW4gTGluayB0byB0eXBlcyBhbmQgc3VidHlwZXMgc3VwcG9ydGVkIGJ5IExpYWJpbGl0aWVzLCB5b3UgY2FuIHVzZSB0aGUgYGFjY291bnRfZmlsdGVyc2AgcGFyYW1ldGVyIHdoZW4gW2NyZWF0aW5nIGEgTGluayB0b2tlbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGlua3Rva2VuY3JlYXRlKS4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9saWFiaWxpdGllcy9nZXRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7TGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBsaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaWFiaWxpdGllc0dldChsaWFiaWxpdGllc0dldFJlcXVlc3Q6IExpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaWFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLmxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9saW5rX2RlbGl2ZXJ5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0fSBsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3Q6IExpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGNoYW5nZSBhbiBPQXV0aCBgbGlua19jb3JyZWxhdGlvbl9pZGAgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGBsaW5rX3Rva2VuYC4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBvbmx5IGF2YWlsYWJsZSBmb3IgXFwncGF5bWVudF9pbml0aWF0aW9uXFwnIHByb2R1Y3RzIGFuZCBpcyBwcm92aWRlZCB0byB0aGUgY2xpZW50IHZpYSB0aGUgT0F1dGggYHJlZGlyZWN0X3VyaWAgYXMgYSBxdWVyeSBwYXJhbWV0ZXIuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGluIGEgYnJpZWYgcGVyaW9kLCBhZnRlciB3aGljaCBpdCBjYW4gbm8gbG9uZ2VyIGJlIGV4Y2hhbmdlZCBmb3IgdGhlIFxcJ2xpbmtfdG9rZW5cXCcuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHRoZSBMaW5rIENvcnJlbGF0aW9uIElkIGZvciBhIExpbmsgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhIGBsaW5rX3Rva2VuYCwgd2hpY2ggaXMgcmVxdWlyZWQgYXMgYSBwYXJhbWV0ZXIgd2hlbiBpbml0aWFsaXppbmcgTGluay4gT25jZSBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkLCBpdCByZXR1cm5zIGEgYHB1YmxpY190b2tlbmAuIEZvciBtb3N0IFBsYWlkIHByb2R1Y3RzLCB0aGUgYHB1YmxpY190b2tlbmAgaXMgc2F2ZWQgYW5kIGV4Y2hhbmdlZCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgdmlhIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIGFzIHBhcnQgb2YgdGhlIG1haW4gTGluayBmbG93LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIFtMaW5rIGZsb3cgb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay8jbGluay1mbG93LW92ZXJ2aWV3KS4gIEEgYGxpbmtfdG9rZW5gIGdlbmVyYXRlZCBieSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBpcyBhbHNvIHVzZWQgdG8gaW5pdGlhbGl6ZSBvdGhlciBMaW5rIGZsb3dzLCBzdWNoIGFzIHRoZSBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBmb3IgdG9rZW5zIHdpdGggZXhwaXJlZCBjcmVkZW50aWFscywgb3IgdGhlIElkZW50aXR5IFZlcmlmaWNhdGlvbiBmbG93LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkNyZWF0ZVJlcXVlc3R9IGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdDogTGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgTGluayBzZXNzaW9uLCBpbmNsdWRpbmcgYWxsIGNhbGxiYWNrcyBmaXJlZCBkdXJpbmcgdGhlIHNlc3Npb24gYWxvbmcgd2l0aCB0aGVpciBtZXRhZGF0YSwgaW5jbHVkaW5nIHRoZSBwdWJsaWMgdG9rZW4uIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB3aXRoIExpbmsgZmxvd3MgdGhhdCBkb25cXCd0IHByb3ZpZGUgYSBwdWJsaWMgdG9rZW4gdmlhIGZyb250ZW5kIGNhbGxiYWNrcywgc3VjaCBhcyB0aGUgW0hvc3RlZCBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pIGFuZCB0aGUgW011bHRpLUl0ZW0gTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rLykuIEl0IGFsc28gY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5saW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyBmcm9tIGEgbGlzdCBvZiBgYWNjZXNzX3Rva2Vuc2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgaW5zaWdodHMgZm9yIHRoZSBwcm92aWRlZCBgYWNjZXNzX3Rva2Vuc2BcbiAgICAgICAgICogQHBhcmFtIHtOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0fSBuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0KG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3Q6IE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8TmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IubmV0d29ya0luc2lnaHRzUmVwb3J0R2V0KG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9uZXR3b3JrL3N0YXR1cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgUGxhaWQgaGFzIGEgbWF0Y2hpbmcgcHJvZmlsZSBmb3IgdGhlIHVzZXIuIFRoaXMgaXMgdXNlZnVsIGZvciBkZXRlcm1pbmluZyBpZiBhIHVzZXIgaXMgZWxpZ2libGUgZm9yIGEgc3RyZWFtbGluZWQgZXhwZXJpZW5jZSwgc3VjaCBhcyBMYXllci4gIE5vdGU6IGl0IGlzIHN0cm9uZ2x5IHJlY29tbWVuZGVkIHRvIGNoZWNrIGZvciBMYXllciBlbGlnaWJpbGl0eSBpbiB0aGUgZnJvbnRlbmQuIGAvbmV0d29yay9zdGF0dXMvZ2V0YCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBjaGVja2luZyBMYXllciBlbGlnaWJpbGl0eSBpZiBhIGZyb250ZW5kIGNoZWNrIGlzIG5vdCBwb3NzaWJsZSBmb3IgeW91ciB1c2UgY2FzZS4gRm9yIGluc3RydWN0aW9ucyBvbiBwZXJmb3JtaW5nIGEgZnJvbnRlbmQgZWxpZ2liaWxpdHkgY2hlY2ssIHNlZSB0aGUgW0xheWVyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGF5ZXIvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAgICAgKiBAcGFyYW0ge05ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0fSBuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIG5ldHdvcmtTdGF0dXNHZXQobmV0d29ya1N0YXR1c0dldFJlcXVlc3Q6IE5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPE5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5uZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvZW5hYmxlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIGVuYWJsZSBhbiBlbmQgY3VzdG9tZXIgaW4gdGhlIGZ1bGwgUHJvZHVjdGlvbiBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckVuYWJsZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBhcnRuZXJDdXN0b21lckVuYWJsZShwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckdldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9yZW1vdmVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lci4gUmVtb3ZpbmcgYW4gZW5kIGN1c3RvbWVyIHdpbGwgcmVtb3ZlIGl0IGZyb20gdmlldyBpbiB0aGUgUGxhaWQgRGFzaGJvYXJkIGFuZCBkZWFjdGl2YXRlIGl0cyBBUEkga2V5cy4gVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuIGVuYWJsZWQgaW4gZnVsbCBQcm9kdWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmVzIGEgUGxhaWQgcmVzZWxsZXJcXCdzIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgcGF5bWVudCBjb25zZW50LCB3aGljaCBjYW4gYmUgdXNlZCB0byBpbml0aWF0ZSBwYXltZW50cyBvbiBiZWhhbGYgb2YgdGhlIHVzZXIuIFBheW1lbnQgY29uc2VudHMgYXJlIGNyZWF0ZWQgd2l0aCBgVU5BVVRIT1JJU0VEYCBzdGF0dXMgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBhdXRob3Jpc2VkIGJ5IHRoZSB1c2VyIGJlZm9yZSBwYXltZW50cyBjYW4gYmUgaW5pdGlhdGVkLiAgQ29uc2VudHMgY2FuIGJlIGxpbWl0ZWQgaW4gdGltZSBhbmQgc2NvcGUsIGFuZCBoYXZlIGNvbnN0cmFpbnRzIHRoYXQgZGVzY3JpYmUgbGltaXRhdGlvbnMgZm9yIHBheW1lbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcGF5bWVudC9leGVjdXRlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBleGVjdXRlIHBheW1lbnRzIHVzaW5nIHBheW1lbnQgY29uc2VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHNpbmdsZSBwYXltZW50IHVzaW5nIGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvcmV2b2tlYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byByZXZva2UgdGhlIHBheW1lbnQgY29uc2VudC4gT25jZSB0aGUgY29uc2VudCBpcyByZXZva2VkLCBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5pdGlhdGUgcGF5bWVudHMgdXNpbmcgaXQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldm9rZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSLCBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIsIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yayBhbmQgZm9yIG5vbi1FdXJvem9uZSBtYXJrZXRzIHR5cGljYWxseSB2aWEgdGhlIGxvY2FsIHBheW1lbnQgc2NoZW1lLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIG9yIG90aGVyIGxvY2FsIHBheW1lbnQgc2NoZW1lcyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiBMaW1pdGVkIFByb2R1Y3Rpb24sIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLCBhbmQgc3RhbmRpbmcgb3JkZXJzLCB2YXJpYWJsZSByZWN1cnJpbmcgcGF5bWVudHMsIGFuZCBWaXJ0dWFsIEFjY291bnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgZGV0YWlsc1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2xpc3RgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGFsbCBjcmVhdGVkIHBheW1lbnRzLiBCeSBkZWZhdWx0LCB0aGUgMTAgbW9zdCByZWNlbnQgcGF5bWVudHMgYXJlIHJldHVybmVkLiBZb3UgY2FuIHJlcXVlc3QgbW9yZSBwYXltZW50cyBhbmQgcGFnaW5hdGUgdGhyb3VnaCB0aGUgcmVzdWx0cyB1c2luZyB0aGUgb3B0aW9uYWwgYGNvdW50YCBhbmQgYGN1cnNvcmAgcGFyYW1ldGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gIFByb3ZpZGluZyBjb3VudGVycGFydHkgaW5mb3JtYXRpb24gc3VjaCBhcyBkYXRlIG9mIGJpcnRoIGFuZCBhZGRyZXNzIGluY3JlYXNlcyAgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIHBheW1lbnQgcmVjaXBpZW50IGZvciBwYXltZW50IGluaXRpYXRpb24uICBUaGUgcmVjaXBpZW50IG11c3QgYmUgaW4gRXVyb3BlLCB3aXRoaW4gYSBjb3VudHJ5IHRoYXQgaXMgYSBtZW1iZXIgb2YgdGhlIFNpbmdsZSBFdXJvIFBheW1lbnQgQXJlYSAoU0VQQSkgb3IgYSBub24tRXVyb3pvbmUgY291bnRyeSBbc3VwcG9ydGVkXShodHRwczovL3BsYWlkLmNvbS9nbG9iYWwpIGJ5IFBsYWlkLiBGb3IgYSBzdGFuZGluZyBvcmRlciAocmVjdXJyaW5nKSBwYXltZW50LCB0aGUgcmVjaXBpZW50IG11c3QgYmUgaW4gdGhlIFVLLiAgSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBiYWNzYCBpbiB0aGUgVUsgYW5kIGBpYmFuYCBpbiBFVS4gIFRoZSBlbmRwb2ludCBpcyBpZGVtcG90ZW50OiBpZiBhIGRldmVsb3BlciBoYXMgYWxyZWFkeSBtYWRlIGEgcmVxdWVzdCB3aXRoIHRoZSBzYW1lIHBheW1lbnQgZGV0YWlscywgUGxhaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgYHJlY2lwaWVudF9pZGAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGRldGFpbHMgYWJvdXQgYSBwYXltZW50IHJlY2lwaWVudCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXQocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50UHJvZmlsZUNyZWF0ZShwYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlR2V0UmVxdWVzdH0gcGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0OiBQYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wYXltZW50UHJvZmlsZVJlbW92ZShwYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3R9IHByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdDogUHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQWNjb3VudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIEFwZXggdG8gZW5hYmxlIFBsYWlkLUFwZXggaW50ZWdyYXRpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nLCBzYXZpbmdzLCBvciBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMgbWF5IHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQmFsYW5jZSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYWxhbmNlR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L21hdGNoYCBlbmRwb2ludCBnZW5lcmF0ZXMgYSBtYXRjaCBzY29yZSwgd2hpY2ggaW5kaWNhdGVzIGhvdyB3ZWxsIHRoZSBwcm92aWRlZCBpZGVudGl0eSBkYXRhIG1hdGNoZXMgdGhlIGlkZW50aXR5IGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgYWNjb3VudCBob2xkZXJcXCdzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbi4gIEZpZWxkcyB3aXRoaW4gdGhlIGBiYWxhbmNlc2Agb2JqZWN0IHdpbGwgYWx3YXlzIGJlIG51bGwgd2hlbiByZXRyaWV2ZWQgYnkgYC9pZGVudGl0eS9tYXRjaGAuIEluc3RlYWQsIHVzZSB0aGUgZnJlZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgdG8gcmVxdWVzdCBiYWxhbmNlIGNhY2hlZCBkYXRhLCBvciBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3IgcmVhbC10aW1lIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGlkZW50aXR5IG1hdGNoIHNjb3JlXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIHN0b2NrIHBvc2l0aW9uIGRhdGEgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgSW52ZXN0bWVudCBIb2xkaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIGludmVzdG1lbnQgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NvciB0b2tlbi4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBJbnZlc3RtZW50cyBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhIGxvYW4gb3IgY3JlZGl0IGFjY291bnQuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gIFRoZSB0eXBlcyBvZiBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBMaWFiaWxpdGllcyBjYW4gaW5jbHVkZSBiYWxhbmNlcyBhbmQgZHVlIGRhdGVzLCBsb2FuIHRlcm1zLCBhbmQgYWNjb3VudCBkZXRhaWxzIHN1Y2ggYXMgb3JpZ2luYWwgbG9hbiBhbW91bnQgYW5kIGd1YXJhbnRvci4gRGF0YSBpcyByZWZyZXNoZWQgYXBwcm94aW1hdGVseSBvbmNlIHBlciBkYXk7IHRoZSBsYXRlc3QgZGF0YSBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvbGlhYmlsaXRpZXMvZ2V0YC4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgYGxpYWJpbGl0aWVzYCB3YXMgbm90IHNwZWNpZmllZCBhcyBhbiBpbml0aWFsIHByb2R1Y3Qgd2hlbiBjcmVhdGluZyB0aGUgcHJvY2Vzc29yIHRva2VuLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB0byByZXRyaWV2ZSB0aGUgYWRkaXRpb25hbCBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JMaWFiaWxpdGllc0dldChwcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3Q6IFByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnQocHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGEgcHJvY2Vzc29yIHRva2VuIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3Byb2Nlc3Nvci9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgcHJvY2Vzc29yIHRva2VuIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIHdoaWNoIHdpbGwgaW1wcm92ZSB0aGUgYWNjdXJhY3kgb2YgdGhlIFNpZ25hbCBzY29yZS4gIElmIHRoaXMgZW5kcG9pbnQgaXMgY2FsbGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBpdCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBwcm9jZXNzb3IgdG9rZW4uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhIHByb2Nlc3NvciB0b2tlbiB0byBTaWduYWxcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENhbGwgdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBbUGxhaWQgVHJhbnNmZXIgcHJvZHVjdF0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIHRvIGNyZWF0ZSB0cmFuc2ZlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFzIFBsYWlkIGFscmVhZHkga25vd3Mgd2hldGhlciB0aGUgdHJhbnNmZXIgd2FzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgVG8gcmV2b2tlIGEgYmFuayBhY2NvdW50IHRva2VuLCB0aGUgZW50aXJlIHVuZGVybHlpbmcgYWNjZXNzIHRva2VuIG11c3QgYmUgcmV2b2tlZCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gb25lIG9mIFBsYWlkXFwncyBwYXJ0bmVycyB0byBlbmFibGUgaW50ZWdyYXRpb25zLiBOb3RlIHRoYXQgU3RyaXBlIHBhcnRuZXJzaGlwcyB1c2UgYmFuayBhY2NvdW50IHRva2VucyBpbnN0ZWFkOyBzZWUgYC9wcm9jZXNzb3Ivc3RyaXBlL2JhbmtfYWNjb3VudF90b2tlbi9jcmVhdGVgIGZvciBjcmVhdGluZyB0b2tlbnMgZm9yIHVzZSB3aXRoIFN0cmlwZSBpbnRlZ3JhdGlvbnMuIElmIHVzaW5nIG11bHRpcGxlIHByb2Nlc3NvcnMsIG11bHRpcGxlIGRpZmZlcmVudCBwcm9jZXNzb3IgdG9rZW5zIGNhbiBiZSBjcmVhdGVkIGZvciBhIHNpbmdsZSBhY2Nlc3MgdG9rZW4uIE9uY2UgY3JlYXRlZCwgYSBwcm9jZXNzb3IgdG9rZW4gZm9yIGEgZ2l2ZW4gSXRlbSBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgdXBkYXRlZC4gVG8gcmV2b2tlIHRoZSBwcm9jZXNzb3JcXCdzIGFjY2VzcywgdGhlIGVudGlyZSBJdGVtIG11c3QgYmUgZGVsZXRlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gZ2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zLiBUaGUgYHByb2R1Y3RzYCBmaWVsZCB3aWxsIGJlIGFuIGVtcHR5IGxpc3QgaWYgdGhlIHByb2Nlc3NvciBjYW4gYWNjZXNzIGFsbCBhdmFpbGFibGUgcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIHByb2Nlc3NvciB0b2tlblxcJ3MgcHJvZHVjdCBwZXJtaXNzaW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91LCB0aGUgcHJvY2Vzc29yLCB0byB1cGRhdGUgdGhlIHdlYmhvb2sgVVJMIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgYFdFQkhPT0tfVVBEQVRFX0FDS05PV0xFREdFRGAgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHdlYmhvb2sgVVJMXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZShwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIFRyYW5zYWN0aW9ucyBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG5ld2VzdCB0cmFuc2FjdGlvbnMgZm9yIGEgcHJvY2Vzc29yIHRva2VuLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IFRyYW5zYWN0aW9ucy1lbmFibGVkIHByb2Nlc3NvciB0b2tlbi4gSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2s6IGZvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCB1c2VycywgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3aWxsIGJlIGZpcmVkIGlmIHRoZXJlIGFyZSBhbnkgdHJhbnNhY3Rpb25zIHVwZGF0ZWQsIGFkZGVkLCBvciByZW1vdmVkLiBGb3IgdXNlcnMgb2YgYm90aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgYW5kIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgLiBOb3RlIHRoYXQgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIENhcGl0YWwgT25lIChgaW5zXzEyODAyNmApIG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGBQUk9EVUNUU19OT1RfU1VQUE9SVEVEYCBlcnJvciBpZiBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGNvbnRhaW5zIG9ubHkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgZnJvbSB0aGF0IGluc3RpdHV0aW9uLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBpbnRlZ3JhdGlvbiBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvI2ludGVncmF0aW9uLW92ZXJ2aWV3KS4gSWYgeW91IGFyZSBtaWdyYXRpbmcgZnJvbSBhbiBleGlzdGluZyBpbnRlZ3JhdGlvbiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBgbG9hbmAtdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gIFdoZW4gcmV0cmlldmluZyBwYWdpbmF0ZWQgdXBkYXRlcywgdHJhY2sgYm90aCB0aGUgYG5leHRfY3Vyc29yYCBmcm9tIHRoZSBsYXRlc3QgcmVzcG9uc2UgYW5kIHRoZSBvcmlnaW5hbCBjdXJzb3IgZnJvbSB0aGUgZmlyc3QgY2FsbCBpbiB3aGljaCBgaGFzX21vcmVgIHdhcyBgdHJ1ZWA7IGlmIGEgY2FsbCB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2Agd2lsbCByZXR1cm4gZW1wdHkgdHJhbnNhY3Rpb25zIGFycmF5cy4gICBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgdHJhbnNhY3Rpb25zIGRhdGEgYmV0d2VlbiBvbmUgYW5kIGZvdXIgdGltZXMgcGVyIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0cmFuc2FjdGlvbnMgd2VyZSBsYXN0IHVwZGF0ZWQgZm9yIGFuIEl0ZW0sIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGEgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5wcm9maWxlTmV0d29ya1N0YXR1c0dldChwcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgYmFuayBpbmNvbWUgd2ViaG9vayBpbiBzYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIEJhbmsgVHJhbnNmZXJzIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9jcmEvY2FzaGZsb3dfdXBkYXRlcy91cGRhdGVgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYW4gdXBkYXRlIGZvciBjYXNoZmxvdyB1cGRhdGVzIChNb25pdG9yaW5nKSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgVHJpZ2dlciBhbiB1cGRhdGUgZm9yIENhc2hmbG93IFVwZGF0ZXNcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdH0gc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0OiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGFuIEluY29tZSB3ZWJob29rXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gc2ltdWxhdGluZyBhIGRlZmF1bHQgdXBkYXRlIGV2ZW50IGZvciB0aGUgcmVzcGVjdGl2ZSBwcm9kdWN0IGFzIHNwZWNpZmllZCB3aXRoIHRoZSBgd2ViaG9va190eXBlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBWYWxpZCBTYW5kYm94IGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0eXBlcyBpbmNsdWRlOiBgQVVUSGAsIGBJREVOVElUWWAsIGBUUkFOU0FDVElPTlNgLCBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYCwgYExJQUJJTElUSUVTYCwgYEhPTERJTkdTYC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgcHJvZHVjdCwgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogRmlyZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBhY2NvdW50IGlzIGF2YWlsYWJsZSBvbiB0aGUgSXRlbSBhbmQgeW91IGNhbiBsYXVuY2ggdXBkYXRlIG1vZGUgdG8gcmVxdWVzdCBhY2Nlc3MgdG8gaXQuICBgU01TX01JQ1JPREVQT1NJVFNfVkVSSUZJQ0FUSU9OYDogRmlyZWQgd2hlbiBhIGdpdmVuIHNhbWUgZGF5IG1pY3JvLWRlcG9zaXQgaXRlbSBpcyB2ZXJpZmllZCB2aWEgU01TIHZlcmlmaWNhdGlvbi4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFBFTkRJTkdfRElTQ09OTkVDVGA6IEZpcmVkIHdoZW4gYW4gSXRlbSB3aWxsIHN0b3Agd29ya2luZyBpbiB0aGUgbmVhciBmdXR1cmUgKGUuZy4gZHVlIHRvIGEgcGxhbm5lZCBiYW5rIG1pZ3JhdGlvbikgYW5kIG11c3QgYmUgc2VudCB0aHJvdWdoIHVwZGF0ZSBtb2RlIHRvIGNvbnRpbnVlIHdvcmtpbmcuICAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgOiBJbmRpY2F0ZXMgYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gTWF5IG5vdCBhbHdheXMgZmlyZSB1cG9uIHJldm9jYXRpb24sIGFzIHNvbWUgaW5zdGl0dXRpb25z4oCZIGNvbnNlbnQgcG9ydGFscyBkbyBub3QgdHJpZ2dlciB0aGlzIHdlYmhvb2suIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYDogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGlzIHdlYmhvb2sgaXMgY3VycmVudGx5IHNlbnQgb25seSBmb3IgQ2hhc2UgYW5kIFBOQyBJdGVtcywgYnV0IG1heSBiZSBzZW50IGluIHRoZSBmdXR1cmUgZm9yIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMuIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgaXMgcHJvdmlkZWQgZm9yIGRldmVsb3BlciBlYXNlLW9mLXVzZSBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciB0ZXN0aW5nIHdlYmhvb2tzOyB3ZWJob29rcyB3aWxsIGFsc28gZmlyZSBpbiBTYW5kYm94IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgdGhhdCB0aGV5IHdvdWxkIGluIFByb2R1Y3Rpb24gKGV4Y2VwdCBmb3Igd2ViaG9va3Mgb2YgdHlwZSBgVFJBTlNGRVJgKS5cbiAgICAgICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SXRlbUZpcmVXZWJob29rKHNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgYSBTYW5kYm94IEl0ZW0gaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdDogU2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3NhbmRib3gvaXRlbS9zZXRfdmVyaWZpY2F0aW9uX3N0YXR1c2AgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2ZXJpZmljYXRpb24gc3RhdHVzIG9mIGFuIEl0ZW0gaW4gaW4gdGhlIFNhbmRib3ggaW4gb3JkZXIgdG8gc2ltdWxhdGUgdGhlIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0IGZsb3cuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0ZXN0aW5nIEF1dG9tYXRlZCBNaWNyby1kZXBvc2l0cyBpbiBTYW5kYm94LCBzZWUgW0F1dGggZnVsbCBjb3ZlcmFnZSB0ZXN0aW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZyMpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTZXQgdmVyaWZpY2F0aW9uIHN0YXR1cyBmb3IgU2FuZGJveCBhY2NvdW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3BheW1lbnRfcHJvZmlsZS9yZXNldF9sb2dpbi9gIGZvcmNlcyBhIFBheW1lbnQgUHJvZmlsZSBpbnRvIGEgc3RhdGUgd2hlcmUgdGhlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW5gLCBjYWxscyB0byB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgd2l0aCB0aGUgUGF5bWVudCBQcm9maWxlIHdpbGwgcmVzdWx0IGluIGEgYGRlY2lzaW9uX3JhdGlvbmFsZWAgYFBBWU1FTlRfUFJPRklMRV9MT0dJTl9SRVFVSVJFRGAuIFlvdSBjYW4gdGhlbiB1c2UgdXBkYXRlIG1vZGUgZm9yIFBheW1lbnQgUHJvZmlsZSB0byByZXN0b3JlIGl0IGludG8gYSBnb29kIHN0YXRlLiAgIEluIG9yZGVyIHRvIGludm9rZSB0aGlzIGVuZHBvaW50LCB5b3UgbXVzdCBmaXJzdCBbY3JlYXRlIGEgUGF5bWVudCBQcm9maWxlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLXBheW1lbnQtcHJvZmlsZS1vcHRpb25hbCkgYW5kIFtnbyB0aHJvdWdoIHRoZSBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNmZXIvYWRkLXRvLWFwcC8jY3JlYXRlLWEtbGluay10b2tlbikuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgdmFyaW91cyBwYXltZW50IGV2ZW50cyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gVGhpcyBlbmRwb2ludCB3aWxsIHRyaWdnZXIgdGhlIGNvcnJlc3BvbmRpbmcgcGF5bWVudCBzdGF0dXMgd2ViaG9vay5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBwYXltZW50IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94UGF5bWVudFNpbXVsYXRlKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFBheW1lbnRTaW11bGF0ZShzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgdmFsaWQgYHB1YmxpY190b2tlbmAgIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQsIGluaXRpYWwgcHJvZHVjdHMsIGFuZCB0ZXN0IGNyZWRlbnRpYWxzLiBUaGUgY3JlYXRlZCBgcHVibGljX3Rva2VuYCBtYXBzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIGNhbGwgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgdG8gZXhjaGFuZ2UgdGhlIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBgYWNjZXNzX3Rva2VuYCBhbmQgcGVyZm9ybSBhbGwgQVBJIGFjdGlvbnMuIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBjYW4gYWxzbyBiZSB1c2VkIHdpdGggdGhlIFtgdXNlcl9jdXN0b21gIHRlc3QgdXNlcm5hbWVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbSkgdG8gZ2VuZXJhdGUgYSB0ZXN0IGFjY291bnQgd2l0aCBjdXN0b20gZGF0YSwgb3Igd2l0aCBQbGFpZFxcJ3MgW3ByZS1wb3B1bGF0ZWQgU2FuZGJveCB0ZXN0IGFjY291bnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdGVzdC1jcmVkZW50aWFscy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBgVFJBTlNGRVJfRVZFTlRTX1VQREFURWAgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlKHNhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIHdpdGhkcmF3IGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlcGF5bWVudC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgYSByZXBheW1lbnQuIEFzIGEgc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyB0aGlzIHJvdXRlLCBhIHJlcGF5bWVudCBpcyBjcmVhdGVkIHRoYXQgaW5jbHVkZXMgYWxsIHVucmVpbWJ1cnNlZCByZXR1cm5zIG9mIGd1YXJhbnRlZWQgdHJhbnNmZXJzLiBJZiB0aGVyZSBhcmUgbm8gc3VjaCByZXR1cm5zLCBhbiA0MDAgZXJyb3IgaXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBzd2VlcCBhbmQgYXNzb2NpYXRlZCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFVwb24gY2FsbGluZyB0aGlzIGVuZHBvaW50LCBhbGwgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRfc2V0dGxlZGAsIGFsbCBgcG9zdGVkYCBvciBgcGVuZGluZ2AgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHVuc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdGAsIGFuZCBhbGwgYHJldHVybmVkYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGByZXR1cm5fc3dlcHRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2FkdmFuY2VgIGVuZHBvaW50IHRvIGFkdmFuY2UgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gQSB0ZXN0IGNsb2NrIGNhbiBiZSBhZHZhbmNlZCBieSBpbmNyZW1lbnRpbmcgYHZpcnR1YWxfdGltZWAsIGJ1dCBtYXkgbmV2ZXIgZ28gYmFjayB0byBhIGxvd2VyIGB2aXJ0dWFsX3RpbWVgLiAgSWYgYSB0ZXN0IGNsb2NrIGlzIGFkdmFuY2VkLCB3ZSB3aWxsIHNpbXVsYXRlIHRoZSBjaGFuZ2VzIHRoYXQgb3VnaHQgdG8gb2NjdXIgZHVyaW5nIHRoZSB0aW1lIHRoYXQgZWxhcHNlZC4gIEZvciBleGFtcGxlLCBhIGNsaWVudCBjcmVhdGVzIGEgd2Vla2x5IHJlY3VycmluZyB0cmFuc2ZlciB3aXRoIGEgdGVzdCBjbG9jayBzZXQgYXQgdC4gV2hlbiB0aGUgY2xpZW50IGFkdmFuY2VzIHRoZSB0ZXN0IGNsb2NrIGJ5IHNldHRpbmcgYHZpcnR1YWxfdGltZWAgPSB0ICsgMTUgZGF5cywgMiBuZXcgb3JpZ2luYXRpb25zIHNob3VsZCBiZSBjcmVhdGVkLCBhbG9uZyB3aXRoIHRoZSB3ZWJob29rIGV2ZW50cy4gIFRoZSBhZHZhbmNlbWVudCBvZiB0aGUgdGVzdCBjbG9jayBmcm9tIGl0cyBjdXJyZW50IGB2aXJ0dWFsX3RpbWVgIHNob3VsZCBiZSBsaW1pdGVkIHN1Y2ggdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0aGFuIDIwIG9yaWdpbmF0aW9ucyByZXN1bHRpbmcgZnJvbSB0aGUgYWR2YW5jZSBvcGVyYXRpb24gb24gZWFjaCBgcmVjdXJyaW5nX3RyYW5zZmVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIGB0ZXN0X2Nsb2NrYC4gIEZvciBleGFtcGxlLCBpZiB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlc3QgY2xvY2sgb3JpZ2luYXRlcyBvbmNlIGV2ZXJ5IDQgd2Vla3MsIHlvdSBjYW4gYWR2YW5jZSB0aGUgYHZpcnR1YWxfdGltZWAgdXAgdG8gODAgd2Vla3Mgb24gZWFjaCBBUEkgY2FsbC5cbiAgICAgICAgICogQHN1bW1hcnkgQWR2YW5jZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0ZXN0IGNsb2NrcyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgYnkgYXNjZW5kaW5nIGB2aXJ0dWFsX3RpbWVgLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0ZXN0IGNsb2Nrcy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW4vYCBmdW5jdGlvbnMgdGhlIHNhbWUgYXMgYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW5gLCBidXQgd2lsbCBtb2RpZnkgSXRlbXMgcmVsYXRlZCB0byBhIFVzZXIuIFRoaXMgZW5kcG9pbnQgZm9yY2VzIGVhY2ggSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC91c2VyL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBVc2VyIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGl0ZW0ocykgZm9yIGEgU2FuZGJveCBVc2VyIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2FuZGJveFVzZXJSZXNldExvZ2luUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iuc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9zaWduYWwvZXZhbHVhdGVgIHRvIGV2YWx1YXRlIGEgcGxhbm5lZCBBQ0ggdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmV0dXJuIHJpc2sgYXNzZXNzbWVudCAoc3VjaCBhcyBhIHJpc2sgc2NvcmUgYW5kIHJpc2sgdGllcikgYW5kIGFkZGl0aW9uYWwgcmlzayBzaWduYWxzLiAgSW4gb3JkZXIgdG8gb2J0YWluIGEgdmFsaWQgc2NvcmUgZm9yIGFuIEFDSCB0cmFuc2FjdGlvbiwgUGxhaWQgbXVzdCBoYXZlIGFuIGFjY2VzcyB0b2tlbiBmb3IgdGhlIGFjY291bnQsIGFuZCB0aGUgSXRlbSBtdXN0IGJlIGhlYWx0aHkgKHJlY2VpdmluZyBwcm9kdWN0IHVwZGF0ZXMpIG9yIGhhdmUgcmVjZW50bHkgYmVlbiBpbiBhIGhlYWx0aHkgc3RhdGUuIElmIHRoZSB0cmFuc2FjdGlvbiBkb2VzIG5vdCBtZWV0IGVsaWdpYmlsaXR5IHJlcXVpcmVtZW50cywgYW4gZXJyb3Igd2lsbCBiZSByZXR1cm5lZCBjb3JyZXNwb25kaW5nIHRvIHRoZSB1bmRlcmx5aW5nIGNhdXNlLiBJZiBgL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byB0aGUgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbSXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBzaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxFdmFsdWF0ZShzaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxFdmFsdWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFdoZW4gYW4gSXRlbSBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgdG8gb3B0LWluIHRoYXQgSXRlbSB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCBkZXZlbG9waW5nIGEgU2lnbmFsIHNjb3JlLiBUaGlzIHNob3VsZCBiZSBkb25lIG9uIEl0ZW1zIHdoZXJlIFNpZ25hbCB3YXMgYWRkZWQgaW4gdGhlIGBhZGRpdGlvbmFsX2NvbnNlbnRlZF9wcm9kdWN0c2AgYXJyYXkgYnV0IG5vdCBpbiB0aGUgYHByb2R1Y3RzYCwgYG9wdGlvbmFsX3Byb2R1Y3RzYCwgb3IgYHJlcXVpcmVkX2lmX3N1cHBvcnRlZF9wcm9kdWN0c2AgYXJyYXkuIElmIGAvc2lnbmFsL3ByZXBhcmVgIGlzIHNraXBwZWQgb24gYW4gSXRlbSB0aGF0IGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhlIGluaXRpYWwgY2FsbCB0byBgL3NpZ25hbC9ldmFsdWF0ZWAgb24gdGhhdCBJdGVtIHdpbGwgYmUgbGVzcyBhY2N1cmF0ZSwgYmVjYXVzZSBTaWduYWwgd2lsbCBoYXZlIGFjY2VzcyB0byBsZXNzIGRhdGEgZm9yIGNvbXB1dGluZyB0aGUgU2lnbmFsIHNjb3JlLiAgSWYgcnVuIG9uIGFuIEl0ZW0gdGhhdCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGlzIGVuZHBvaW50IHdpbGwgcmV0dXJuIGEgMjAwIHJlc3BvbnNlIGFuZCB3aWxsIG5vdCBtb2RpZnkgdGhlIEl0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFByZXBhcmVSZXF1ZXN0fSBzaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFByZXBhcmUoc2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFByZXBhcmVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL3NjaGVkdWxlYCB0byBzY2hlZHVsZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBTY2hlZHVsZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsU2NoZWR1bGVSZXF1ZXN0fSBzaWduYWxTY2hlZHVsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzaWduYWxTY2hlZHVsZShzaWduYWxTY2hlZHVsZVJlcXVlc3Q6IFNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTaWduYWxTY2hlZHVsZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnNpZ25hbFNjaGVkdWxlKHNpZ25hbFNjaGVkdWxlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3N0YXRlbWVudHMvZG93bmxvYWRgIGVuZHBvaW50IHJldHJpZXZlcyBhIHNpbmdsZSBzdGF0ZW1lbnQgUERGIGluIGJpbmFyeSBmb3JtYXQuICBUaGUgcmVzcG9uc2Ugd2lsbCBjb250YWluIGEgYFBsYWlkLUNvbnRlbnQtSGFzaGAgaGVhZGVyIGNvbnRhaW5pbmcgYSBTSEEgMjU2IGNoZWNrc3VtIG9mIHRoZSBzdGF0ZW1lbnQuIFRoaXMgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBieSBQbGFpZCBpcyB0aGUgc2FtZSBmaWxlIHRoYXQgd2FzIGRvd25sb2FkZWQgdG8geW91ciBzeXN0ZW0uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgICAgICogQHBhcmFtIHtTdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0fSBzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgc3RhdGVtZW50c0Rvd25sb2FkKHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3Q6IFN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8YW55Pj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc3RhdGVtZW50cy9yZWZyZXNoYCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIHN0YXRlbWVudHMgZm9yIHRoZSBwcm92aWRlZCBkYXRlcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBzdGF0ZW1lbnRzIGRhdGEuXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0fSBzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyBzdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3Q6IFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxTdGF0ZW1lbnRzUmVmcmVzaFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3YxL2VuaGFuY2VgIGVuZHBvaW50IGVucmljaGVzIHJhdyB0cmFuc2FjdGlvbiBkYXRhIHByb3ZpZGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgZW5oYW5jZSBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdDogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFsbCBuZXcgaW1wbGVtZW50YXRpb25zIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCByYXRoZXIgdGhhbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiBgL3RyYW5zYWN0aW9ucy9zeW5jYCBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGAvdHJhbnNhY3Rpb25zL2dldGAgYW5kIGltcHJvdmVzIGRldmVsb3BlciBlYXNlLW9mLXVzZSBmb3IgaGFuZGxpbmcgdHJhbnNhY3Rpb25zIHVwZGF0ZXMuICBUaGUgYC90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBjcmVkaXQsIGRlcG9zaXRvcnksIGFuZCBzb21lIGxvYW4tdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGA7IGNvdmVyYWdlIG1heSBiZSBsaW1pdGVkKS4gRm9yIHRyYW5zYWN0aW9uIGhpc3RvcnkgZnJvbSBpbnZlc3RtZW50cyBhY2NvdW50cywgdXNlIHRoZSBbSW52ZXN0bWVudHMgZW5kcG9pbnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLykgaW5zdGVhZC4gVHJhbnNhY3Rpb24gZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYWNyb3NzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIGFuZCBpbiBtYW55IGNhc2VzIHRyYW5zYWN0aW9ucyBhcmUgbGlua2VkIHRvIGEgY2xlYW4gbmFtZSwgZW50aXR5IHR5cGUsIGxvY2F0aW9uLCBhbmQgY2F0ZWdvcnkuIFNpbWlsYXJseSwgYWNjb3VudCBkYXRhIGlzIHN0YW5kYXJkaXplZCBhbmQgcmV0dXJuZWQgd2l0aCBhIGNsZWFuIG5hbWUsIG51bWJlciwgYmFsYW5jZSwgYW5kIG90aGVyIG1ldGEgaW5mb3JtYXRpb24gd2hlcmUgYXZhaWxhYmxlLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIFRyYW5zYWN0aW9ucyBhcmUgbm90IGltbXV0YWJsZSBhbmQgY2FuIGFsc28gYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyIGJ5IHRoZSBpbnN0aXR1dGlvbjsgYSByZW1vdmVkIHRyYW5zYWN0aW9uIHdpbGwgbm8gbG9uZ2VyIGFwcGVhciBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3RyYW5zYWN0aW9ucy9nZXRgIHdpbGwgYmUgdGhlIGRhdGEgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRoZSBJdGVtIHdhcyBsYXN0IHVwZGF0ZWQsIHVzZSB0aGUgW0l0ZW0gRGVidWdnZXJdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYWNjb3VudC9hY3Rpdml0eS8jdHJvdWJsZXNob290aW5nLXdpdGgtaXRlbS1kZWJ1Z2dlcikgb3IgY2FsbCBgL2l0ZW0vZ2V0YDsgdGhlIGBpdGVtLnN0YXR1cy50cmFuc2FjdGlvbnMubGFzdF9zdWNjZXNzZnVsX3VwZGF0ZWAgZmllbGQgd2lsbCBzaG93IHRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgdXBkYXRlLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgTm90ZSB0aGF0IGRhdGEgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBUbyBiZSBhbGVydGVkIHdoZW4gdHJhbnNhY3Rpb24gZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBbYElOSVRJQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNpbml0aWFsX3VwZGF0ZSkgYW5kIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rcy4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgYSBzdW1tYXJ5IG9mIHRoZSByZWN1cnJpbmcgb3V0ZmxvdyBhbmQgaW5mbG93IHN0cmVhbXMgKGV4cGVuc2VzIGFuZCBkZXBvc2l0cykgZnJvbSBhIHVzZXLigJlzIGNoZWNraW5nLCBzYXZpbmdzIG9yIGNyZWRpdCBjYXJkIGFjY291bnRzLiBBZGRpdGlvbmFsbHksIFBsYWlkIHByb3ZpZGVzIGtleSBpbnNpZ2h0cyBhYm91dCBlYWNoIHJlY3VycmluZyBzdHJlYW0gaW5jbHVkaW5nIHRoZSBjYXRlZ29yeSwgbWVyY2hhbnQsIGxhc3QgYW1vdW50LCBhbmQgbW9yZS4gRGV2ZWxvcGVycyBjYW4gdXNlIHRoZXNlIGluc2lnaHRzIHRvIGJ1aWxkIHRvb2xzIGFuZCBleHBlcmllbmNlcyB0aGF0IGhlbHAgdGhlaXIgdXNlcnMgYmV0dGVyIG1hbmFnZSBjYXNoIGZsb3csIG1vbml0b3Igc3Vic2NyaXB0aW9ucywgcmVkdWNlIHNwZW5kLCBhbmQgc3RheSBvbiB0cmFjayB3aXRoIGJpbGwgcGF5bWVudHMuICBUaGlzIGVuZHBvaW50IGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIFRyYW5zYWN0aW9ucy4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLiAgVGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSBjYWxsZWQgb24gYW4gSXRlbSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgKS4gICBXaGVuIHVzaW5nIFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGZvciBiZXN0IHJlc3VsdHMsIG1ha2Ugc3VyZSB0byB1c2UgdGhlIFtgZGF5c19yZXF1ZXN0ZWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zYWN0aW9ucy1kYXlzLXJlcXVlc3RlZCkgcGFyYW1ldGVyIHRvIHJlcXVlc3QgYXQgbGVhc3QgMTgwIGRheXMgb2YgaGlzdG9yeSB3aGVuIGluaXRpYWxpemluZyBJdGVtcyB3aXRoIFRyYW5zYWN0aW9ucy4gT25jZSBhbGwgaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3RyYW5zYWN0aW9ucy9nZXRgLCBsaXN0ZW4gZm9yIHRoZSBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9vay4gIEFmdGVyIHRoZSBpbml0aWFsIGNhbGwsIHlvdSBjYW4gY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGUgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgVHJhbnNhY3Rpb25zIGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLiAgSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBvcHRpb25hbCBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcml6YXRpb24gcnVsZXMuICBSdWxlcyB3aWxsIGJlIGFwcGxpZWQgb24gdGhlIEl0ZW1cXCdzIHRyYW5zYWN0aW9ucyByZXR1cm5lZCBpbiBgL3RyYW5zYWN0aW9ucy9nZXRgIHJlc3BvbnNlLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuIFRvIHJlcXVlc3QgYWNjZXNzLCBjb250YWN0IHRyYW5zYWN0aW9ucy1mZWVkYmFja0BwbGFpZC5jb20uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZSh0cmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9ydWxlcy92MS9saXN0YCByZXR1cm5zIGEgbGlzdCBvZiB0cmFuc2FjdGlvbiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlKHRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBgbG9hbmAtdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmNyZW1lbnRhbCB0cmFuc2FjdGlvbiB1cGRhdGVzIG9uIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gdHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JldGEvdHJhbnNhY3Rpb25zL3VzZXJfaW5zaWdodHMvdjEvZ2V0YCBnZXRzIHVzZXIgaW5zaWdodHMgZm9yIGNsaWVudHMgd2hvIGhhdmUgZW5yaWNoZWQgZGF0YSB3aXRoIGAvdHJhbnNhY3Rpb25zL2VucmljaGAuICBUaGUgcHJvZHVjdCBpcyBjdXJyZW50bHkgaW4gYmV0YS5cbiAgICAgICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gQSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIHRvIGNyZWF0ZSBhIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2F1dGhvcml6YXRpb24vY3JlYXRlYCBlbmRwb2ludCB0byBhdXRob3JpemUgYSB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byBjYWxsaW5nIGAvdHJhbnNmZXIvY3JlYXRlYC4gVGhlIHRyYW5zZmVyIGF1dGhvcml6YXRpb24gd2lsbCBleHBpcmUgaWYgbm90IHVzZWQgYWZ0ZXIgb25lIGhvdXIuIChZb3UgY2FuIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGF1dGhvcml6YXRpb24gbGlmZXRpbWUuKSAgIFRoZXJlIGFyZSBmb3VyIHBvc3NpYmxlIG91dGNvbWVzIHRvIGNhbGxpbmcgdGhpcyBlbmRwb2ludDogICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpbiB0aGUgcmVzcG9uc2UgaXMgYGRlY2xpbmVkYCwgdGhlIHByb3Bvc2VkIHRyYW5zZmVyIGhhcyBmYWlsZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW5ub3QgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2Zlci4gICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBhZGRpdGlvbmFsIHVzZXIgaW5wdXQgaXMgbmVlZGVkLCB1c3VhbGx5IHRvIGZpeCBhIGJyb2tlbiBiYW5rIGNvbm5lY3Rpb24sIGJlZm9yZSBQbGFpZCBjYW4gcHJvcGVybHkgYXNzZXNzIHRoZSByaXNrLiBZb3UgbmVlZCB0byBsYXVuY2ggTGluayBpbiB1cGRhdGUgbW9kZSB0byBjb21wbGV0ZSB0aGUgcmVxdWlyZWQgdXNlciBhY3Rpb24uIFdoZW4gY2FsbGluZyBgL2xpbmsvdG9rZW4vY3JlYXRlYCB0byBnZXQgYSBuZXcgTGluayB0b2tlbiwgaW5zdGVhZCBvZiBwcm92aWRpbmcgYGFjY2Vzc190b2tlbmAgaW4gdGhlIHJlcXVlc3QsIHlvdSBzaG91bGQgc2V0IFtgdHJhbnNmZXIuYXV0aG9yaXphdGlvbl9pZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNmZXItYXV0aG9yaXphdGlvbi1pZCkgYXMgdGhlIGBhdXRob3JpemF0aW9uLmlkYC4gQWZ0ZXIgdGhlIExpbmsgZmxvdyBpcyBjb21wbGV0ZWQsIHlvdSBtYXkgcmUtYXR0ZW1wdCB0aGUgYXV0aG9yaXphdGlvbi4gICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAsIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIGBudWxsYCwgdGhlIHRyYW5zZmVyIGhhcyBwYXNzZWQgdGhlIHJpc2sgY2hlY2sgYW5kIHlvdSBjYW4gcHJvY2VlZCB0byBjYWxsIGAvdHJhbnNmZXIvY3JlYXRlYC4gICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBub24tYG51bGxgLCB0aGUgcmlzayBjaGVjayBjb3VsZCBub3QgYmUgcnVuOiB5b3UgbWF5IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIsIGJ1dCBzaG91bGQgcGVyZm9ybSB5b3VyIG93biByaXNrIGV2YWx1YXRpb24uIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgcmVzcG9uc2Ugc2NoZW1hLiAgSW4gUGxhaWRcXCdzIFNhbmRib3ggZW52aXJvbm1lbnQgdGhlIGRlY2lzaW9ucyB3aWxsIGJlIHJldHVybmVkIGFzIGZvbGxvd3M6ICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggYG51bGxgIHJhdGlvbmFsZSBjb2RlLCBtYWtlIGFuIGF1dGhvcml6YXRpb24gcmVxdWVzdCB3aXRoIGFuIGBhbW91bnRgIGxlc3MgdGhhbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgaW4gdGhlIGFjY291bnQuICAgIC0gVG8gYXBwcm92ZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBNQU5VQUxMWV9WRVJJRklFRF9JVEVNYCwgY3JlYXRlIGFuIEl0ZW0gaW4gTGluayB0aHJvdWdoIHRoZSBbU2FtZSBEYXkgTWljcm8tZGVwb3NpdHMgZmxvd10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL3Rlc3RpbmcvI3Rlc3Rpbmctc2FtZS1kYXktbWljcm8tZGVwb3NpdHMpLiAgICAtIFRvIGdldCBhbiBhdXRob3JpemF0aW9uIGRlY2lzaW9uIG9mIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIFtyZXNldCB0aGUgbG9naW4gZm9yIGFuIEl0ZW1dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC8jaXRlbV9sb2dpbl9yZXF1aXJlZCkuICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBOU0ZgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGF1dGhvcml6YXRpb24gYGFtb3VudGAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYFJJU0tgLCB0aGUgYXZhaWxhYmxlIGJhbGFuY2Ugb24gdGhlIGFjY291bnQgbXVzdCBiZSBleGFjdGx5ICQwLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAoRGVwcmVjYXRlZCkgVXNlIHRoZSBgL3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byB2aWV3IGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gdHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQmFsYW5jZUdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDYW5jZWwodHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGFuIGFjY291bnQgdG8gYmUgdXNlZCB3aXRoIFRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IHdvcmtzIG9uIGFsbCBUcmFuc2Zlci1jYXBhYmxlIEl0ZW1zLCBpbmNsdWRpbmcgdGhvc2UgY3JlYXRlZCBieSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuIFRvIHNpbXVsYXRlIFJUUCBlbGlnaWJpbGl0eSBpbiBTYW5kYm94LCBsb2cgaW4gdXNpbmcgdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCBhbmQgdXNlIHRoZSBmaXJzdCB0d28gY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMgaW4gdGhlIFxcXCJGaXJzdCBQbGF0eXB1cyBCYW5rXFxcIiBpbnN0aXR1dGlvbiAoZW5kaW5nIGluIDAwMDAgb3IgMTExMSksIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYC4gQW55IG90aGVyIGFjY291bnQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0fSB0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3Q6IFRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0KHRyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0fSB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3Q6IFRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBpcyByZXRyeWFibGUgYW5kIGlkZW1wb3RlbnQ7IGlmIGEgdHJhbnNmZXIgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSB0cmFuc2ZlciBkZXRhaWxzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgdHJhbnNmZXIuIEEgdHJhbnNmZXIgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaWYgYSA1MDAgZXJyb3IgaXMgcmV0dXJuZWQ7IHRvIGRldGVjdCB0aGlzIHNjZW5hcmlvLCB1c2UgW1RyYW5zZmVyIGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9yZWNvbmNpbGluZy10cmFuc2ZlcnMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcmQtcGFydHkgc2VuZGVyIGN1c3RvbWVycyBjYW4gdXNlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL2RvY3VtZW50L3VwbG9hZGAgZW5kcG9pbnQgdG8gdXBsb2FkIGEgZG9jdW1lbnQgb24gYmVoYWxmIG9mIGl0cyBlbmQgY3VzdG9tZXIgKGkuZS4gb3JpZ2luYXRvcikgdG8gUGxhaWQuIFlvdeKAmWxsIG5lZWQgdG8gc2VuZCBhIHJlcXVlc3Qgb2YgdHlwZSBtdWx0aXBhcnQvZm9ybS1kYXRhLiBZb3UgbXVzdCBwcm92aWRlIHRoZSBgY2xpZW50X2lkYCBpbiB0aGUgYFBMQUlELUNMSUVOVC1JRGAgaGVhZGVyIGFuZCBgc2VjcmV0YCBpbiB0aGUgYFBMQUlELVNFQ1JFVGAgaGVhZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGxvYWQgdHJhbnNmZXIgZGlsaWdlbmNlIGRvY3VtZW50IG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdDogVHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRXZlbnRMaXN0KHRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFN5bmMgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3Q6IFRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyRXZlbnRTeW5jKHRyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAuIE9uZSBvZiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYCBtdXN0IGJlIHBvcHVsYXRlZCBidXQgbm90IGJvdGguXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckdldFJlcXVlc3R9IHRyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdDogVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyR2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVySW50ZW50Q3JlYXRlKHRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0fSB0cmFuc2ZlckludGVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckludGVudEdldCh0cmFuc2ZlckludGVudEdldFJlcXVlc3Q6IFRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVySW50ZW50R2V0KHRyYW5zZmVySW50ZW50R2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgICAgICogQHN1bW1hcnkgRGVwb3NpdCBmdW5kcyBpbnRvIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2Ugb24gdGhlIGxlZGdlciBoZWxkIHdpdGggUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlckxlZGdlckdldCh0cmFuc2ZlckxlZGdlckdldFJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvd2l0aGRyYXdgIGVuZHBvaW50IHRvIHdpdGhkcmF3IGZ1bmRzIGZyb20gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJMZWRnZXJXaXRoZHJhdyh0cmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1Jlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9tZXRyaWNzL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljcy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWV0cmljc0dldFJlcXVlc3R9IHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdDogVHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1ldHJpY3NHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck1ldHJpY3NHZXQodHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiBUaGlzIGVuZHBvaW50IGlzIGFsc28gcmVxdWlyZWQgd2hlbiBhZGRpbmcgYW4gSXRlbSBmb3IgdXNlIHdpdGggd2lyZSB0cmFuc2ZlcnM7IGlmIHlvdSBpbnRlbmQgdG8gY3JlYXRlIHdpcmUgdHJhbnNmZXJzIG9uIHRoaXMgYWNjb3VudCwgeW91IG11c3QgcHJvdmlkZSBgd2lyZV9yb3V0aW5nX251bWJlcmAuIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBUcmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gdHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBmdW5kaW5nIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlKHRyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nIHByb2Nlc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBUcmFuc2ZlciBwYWdlIG9uIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYW4gb3JpZ2luYXRvclxcJ3Mgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2Zlck9yaWdpbmF0b3JMaXN0KHRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IGFsbG93cyBnYXRoZXJpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3Igc3BlY2lmaWMgdG8gdGhlIFNjYWxlZCBQbGF0Zm9ybSBUcmFuc2ZlciBvZmZlcmluZywgaW5jbHVkaW5nIHRoZSBvcmlnaW5hdG9yXFwncyBhZ3JlZW1lbnQgdG8gbGVnYWwgdGVybXMgcmVxdWlyZWQgYmVmb3JlIGFjY2VwdGluZyBhbnkgZnVydGhlciBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBvcmlnaW5hdG9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gb3JpZ2luYXRvciBmb3Igc2NhbGVkIHBsYXRmb3JtIGN1c3RvbWVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIHJlY29yZCBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvciBhbmQgb3B0aW9uYWxseSBzdWJtaXQgcGVyc29uLXNwZWNpZmljIHJlcXVpcmVtZW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcGVyc29uIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9yZXF1aXJlbWVudC9zdWJtaXRgIGVuZHBvaW50IGFsbG93cyBwbGF0Zm9ybXMgdG8gc3VibWl0IG9uYm9hcmRpbmcgcmVxdWlyZW1lbnRzIGZvciBhbiBvcmlnaW5hdG9yIGFzIHBhcnQgb2YgdGhlIFNjYWxlZCBQbGF0Zm9ybSBUcmFuc2ZlciBvZmZlcmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IG9uYm9hcmRpbmcgcmVxdWlyZW1lbnRzIGZvciBTY2FsZWQgUGxhdGZvcm0gb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0KHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0KHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlk4oCZcyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZW5lcmF0ZSBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC5cbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLiAgU2NoZWR1bGVkIHRyYW5zZmVyIHRoYXQgaGFzblxcJ3QgYmVlbiBzdWJtaXR0ZWQgdG8gYmFuayB3aWxsIGJlIGNhbmNlbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgcmVjdXJyaW5nIHRyYW5zZmVyLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlY3VycmluZ190cmFuc2Zlcl9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVjdXJyaW5nIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciByZWN1cnJpbmcgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgcmVjdXJyaW5nIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmVjdXJyaW5nIHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcmVmdW5kIGZvciBhIHRyYW5zZmVyLiBBIHRyYW5zZmVyIGNhbiBiZSByZWZ1bmRlZCBpZiB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZCBpbiB0aGUgcGFzdCAxODAgZGF5cy4gIFJlZnVuZHMgY29tZSBvdXQgb2YgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9mIHRoZSBsZWRnZXIgdXNlZCBmb3IgdGhlIG9yaWdpbmFsIGRlYml0IHRyYW5zZmVyLiBJZiB0aGVyZSBhcmUgbm90IGVub3VnaCBmdW5kcyBpbiB0aGUgYXZhaWxhYmxlIGJhbGFuY2UgdG8gY292ZXIgdGhlIHJlZnVuZCBhbW91bnQsIHRoZSByZWZ1bmQgd2lsbCBiZSByZWplY3RlZC4gWW91IGNhbiBjcmVhdGUgYSByZWZ1bmQgYXQgYW55IHRpbWUuIFBsYWlkIGRvZXMgbm90IGltcG9zZSBhbnkgaG9sZCB0aW1lIG9uIHJlZnVuZHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZWZ1bmRDcmVhdGUodHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZWZ1bmQvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWZ1bmQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHJlZnVuZF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlZnVuZEdldCh0cmFuc2ZlclJlZnVuZEdldFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlZnVuZEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci50cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGhlIHJldHVybnMgaW5jbHVkZWQgaW4gYSByZXBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0fSB0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3Q6IFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgYSBzd2VlcCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgc3dlZXBfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VHJhbnNmZXJTd2VlcEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudHJhbnNmZXJTd2VlcExpc3QodHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyB1c2VyIHBlcm1pc3Npb25lZCBhY2NvdW50IGRhdGEgaW5jbHVkaW5nIGlkZW50aXR5IGFuZCBJdGVtIGFjY2VzcyB0b2tlbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFVzZXIgQWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3R9IHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyQWNjb3VudFNlc3Npb25HZXQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdDogVXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyQWNjb3VudFNlc3Npb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyQWNjb3VudFNlc3Npb25HZXQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgc2hvdWxkIGJlIGNhbGxlZCBmb3IgZWFjaCBvZiB5b3VyIGVuZCB1c2VycyBiZWZvcmUgdGhleSBiZWdpbiBhIFBsYWlkIENoZWNrIG9yIEluY29tZSBmbG93LCBvciBhIE11bHRpLUl0ZW0gTGluayBmbG93LiBUaGlzIHByb3ZpZGVzIHlvdSBhIHNpbmdsZSB0b2tlbiB0byBhY2Nlc3MgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBZb3Ugc2hvdWxkIG9ubHkgY3JlYXRlIG9uZSBwZXIgZW5kIHVzZXIuICBUaGUgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgbXVzdCBiZSBwcmVzZW50IGluIG9yZGVyIHRvIGNyZWF0ZSBhIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydCBmb3IgYSB1c2VyLiBJZiBpdCBpcyBub3QgcHJvdmlkZWQgZHVyaW5nIHRoZSBgL3VzZXIvY3JlYXRlYCBjYWxsLCBpdCBjYW4gYmUgYWRkZWQgbGF0ZXIgYnkgY2FsbGluZyBgL3VzZXIvdXBkYXRlYC4gUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0cyBjYW4gb25seSBiZSBjcmVhdGVkIGZvciBVUy1iYXNlZCB1c2VyczsgdGhlIHVzZXJcXCdzIGFkZHJlc3MgY291bnRyeSBtdXN0IGJlIGBVU2AuICBJZiB5b3UgY2FsbCB0aGUgZW5kcG9pbnQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSBgY2xpZW50X3VzZXJfaWRgLCB0aGUgZmlyc3QgY3JlYXRpb24gY2FsbCB3aWxsIHN1Y2NlZWQgYW5kIHRoZSByZXN0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiBgY2xpZW50X3VzZXJfaWRgLiAgRW5zdXJlIHRoYXQgeW91IHN0b3JlIHRoZSBgdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB5b3VyIHVzZXJcXCdzIGlkZW50aWZpZXIgaW4geW91ciBkYXRhYmFzZSwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB1c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxVc2VyQ3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3IudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlciBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zR2V0UmVxdWVzdH0gdXNlckl0ZW1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0OiBVc2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJJdGVtc0dldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC91c2VyL3JlbW92ZWAgZGVsZXRlcyBhIHVzZXIgdG9rZW4gYW5kIGFuZCBhc3NvY2lhdGVkIGluZm9ybWF0aW9uLCBpbmNsdWRpbmcgYW55IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdG9rZW4uICBBbnkgc3Vic2VxdWVudCBjYWxscyB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiB1c2luZyB0aGUgc2FtZSB1c2VyIHRva2VuIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yIHN0YXRpbmcgdGhlIHVzZXIgZG9lcyBub3QgZXhpc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclJlbW92ZVJlcXVlc3R9IHVzZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdDogVXNlclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJSZW1vdmUodXNlclJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gVGhpcyB0b2tlbiBjYW4gYmUgc2hhcmVkIHdpdGggYW5kIHVzZWQgYnkgYSBzcGVjaWZpZWQgdGhpcmQtcGFydHkgY2xpZW50IHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0aHJvdWdoIHN1cHBvcnRlZCBlbmRwb2ludHMuICBFbnN1cmUgeW91IHN0b3JlIHRoZSBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB0aGUgYHVzZXJfdG9rZW5gIGFuZCBgdGhpcmRfcGFydHlfY2xpZW50X2lkYCwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0fSB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGUodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci51c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGRlbGV0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIE9uY2UgcmVtb3ZlZCwgdGhlIHRva2VuIGNhbiBsb25nZXIgYmUgdXNlZCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuICAgQW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gdXNpbmcgdGhlIHNhbWUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBzdGF0aW5nIHRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGRvZXMgbm90IGV4aXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZSh1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gdXBkYXRlIHVzZXIgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYC4gSXQgY2FuIGFsc28gYmUgdXNlZCB0byBlbmFibGUgYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gIGZvciB1c2Ugd2l0aCBDb25zdW1lciBSZXBvcnRzIGJ5IFBsYWlkIENoZWNrLCBieSBhZGRpbmcgYSBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIG9iamVjdCB0byB0aGUgdXNlci4gUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0cyBjYW4gb25seSBiZSBjcmVhdGVkIGZvciBVUy1iYXNlZCB1c2VyczsgdGhlIHVzZXJcXCdzIGFkZHJlc3MgY291bnRyeSBtdXN0IGJlIGBVU2AuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclVwZGF0ZVJlcXVlc3R9IHVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8VXNlclVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLnVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpcyB0aGUgbmV3bHkgY3JlYXRlZCBlLXdhbGxldCBvYmplY3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBlLXdhbGxldFxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldENyZWF0ZVJlcXVlc3R9IHdhbGxldENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdDogV2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYWxsZXRDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIGFsbCBlLXdhbGxldHMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiBjcmVhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldExpc3RSZXF1ZXN0fSB3YWxsZXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3Q6IFdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFNwZWNpZnkgdGhlIGUtd2FsbGV0IHRvIGRlYml0IGZyb20sIHRoZSBjb3VudGVycGFydHkgdG8gY3JlZGl0IHRvLCB0aGUgaWRlbXBvdGVuY3kga2V5IHRvIHByZXZlbnQgZHVwbGljYXRlIHRyYW5zYWN0aW9ucywgdGhlIGFtb3VudCBhbmQgcmVmZXJlbmNlIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRyYW5zYWN0aW9ucyB3aWxsIHNldHRsZSBpbiBzZWNvbmRzIHRvIHNldmVyYWwgZGF5cywgZGVwZW5kaW5nIG9uIHRoZSB1bmRlcmx5aW5nIHBheW1lbnQgcmFpbC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhlY3V0ZSBhIHRyYW5zYWN0aW9uIHVzaW5nIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGxpc3RzIHRoZSBsYXRlc3QgdHJhbnNhY3Rpb25zIG9mIHRoZSBzcGVjaWZpZWQgZS13YWxsZXQuIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gZGVzY2VuZGluZyBvcmRlciBieSB0aGUgYGNyZWF0ZWRfYXRgIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhbGxldFRyYW5zYWN0aW9uTGlzdCh3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGZvciBhbiBlbnRpdHlcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgaGl0cyBmb3IgdGhlIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgcmV2aWV3cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCBUaGUgZW50aXR5IHNjcmVlbmluZyB3YXMgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQuXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBjaGFuZ2VzIHRvIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgcHJldmlvdXNseSBjcmVhdGVkIHdhdGNobGlzdCBzY3JlZW5pbmdzIGZvciBpbmRpdmlkdWFsc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2U+PiB7XG4gICAgICAgICAgICBjb25zdCBsb2NhbFZhckF4aW9zQXJncyA9IGF3YWl0IGxvY2FsVmFyQXhpb3NQYXJhbUNyZWF0b3Iud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgcmV2aWV3cyBmb3IgdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3luYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8KGF4aW9zPzogQXhpb3NJbnN0YW5jZSwgYmFzZVBhdGg/OiBzdHJpbmcpID0+IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlUmVxdWVzdEZ1bmN0aW9uKGxvY2FsVmFyQXhpb3NBcmdzLCBnbG9iYWxBeGlvcywgQkFTRV9QQVRILCBjb25maWd1cmF0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPChheGlvcz86IEF4aW9zSW5zdGFuY2UsIGJhc2VQYXRoPzogc3RyaW5nKSA9PiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlPj4ge1xuICAgICAgICAgICAgY29uc3QgbG9jYWxWYXJBeGlvc0FyZ3MgPSBhd2FpdCBsb2NhbFZhckF4aW9zUGFyYW1DcmVhdG9yLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlcXVlc3RGdW5jdGlvbihsb2NhbFZhckF4aW9zQXJncywgZ2xvYmFsQXhpb3MsIEJBU0VfUEFUSCwgY29uZmlndXJhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBzaWducyBhbGwgb3V0Z29pbmcgd2ViaG9va3MgYW5kIHByb3ZpZGVzIEpTT04gV2ViIFRva2VucyAoSldUcykgc28gdGhhdCB5b3UgY2FuIHZlcmlmeSB0aGUgYXV0aGVudGljaXR5IG9mIGFueSBpbmNvbWluZyB3ZWJob29rcyB0byB5b3VyIGFwcGxpY2F0aW9uLiBBIG1lc3NhZ2Ugc2lnbmF0dXJlIGlzIGluY2x1ZGVkIGluIHRoZSBgUGxhaWQtVmVyaWZpY2F0aW9uYCBoZWFkZXIuICBUaGUgYC93ZWJob29rX3ZlcmlmaWNhdGlvbl9rZXkvZ2V0YCBlbmRwb2ludCBwcm92aWRlcyBhIEpTT04gV2ViIEtleSAoSldLKSB0aGF0IGNhbiBiZSB1c2VkIHRvIHZlcmlmeSBhIEpXVC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHdlYmhvb2sgdmVyaWZpY2F0aW9uIGtleVxuICAgICAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzeW5jIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogUHJvbWlzZTwoYXhpb3M/OiBBeGlvc0luc3RhbmNlLCBiYXNlUGF0aD86IHN0cmluZykgPT4gQXhpb3NQcm9taXNlPFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXNwb25zZT4+IHtcbiAgICAgICAgICAgIGNvbnN0IGxvY2FsVmFyQXhpb3NBcmdzID0gYXdhaXQgbG9jYWxWYXJBeGlvc1BhcmFtQ3JlYXRvci53ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXF1ZXN0RnVuY3Rpb24obG9jYWxWYXJBeGlvc0FyZ3MsIGdsb2JhbEF4aW9zLCBCQVNFX1BBVEgsIGNvbmZpZ3VyYXRpb24pO1xuICAgICAgICB9LFxuICAgIH1cbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBmYWN0b3J5IGludGVyZmFjZVxuICogQGV4cG9ydFxuICovXG5leHBvcnQgY29uc3QgUGxhaWRBcGlGYWN0b3J5ID0gZnVuY3Rpb24gKGNvbmZpZ3VyYXRpb24/OiBDb25maWd1cmF0aW9uLCBiYXNlUGF0aD86IHN0cmluZywgYXhpb3M/OiBBeGlvc0luc3RhbmNlKSB7XG4gICAgY29uc3QgbG9jYWxWYXJGcCA9IFBsYWlkQXBpRnAoY29uZmlndXJhdGlvbilcbiAgICByZXR1cm4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciBlYWNoIG9mIGFuIEl0ZW1cXCdzIGFjY291bnRzLiBXaGlsZSBvdGhlciBlbmRwb2ludHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9nZXRgLCByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBmb3JjZXMgdGhlIGF2YWlsYWJsZSBhbmQgY3VycmVudCBiYWxhbmNlIGZpZWxkcyB0byBiZSByZWZyZXNoZWQgcmF0aGVyIHRoYW4gY2FjaGVkLiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciBleGlzdGluZyBJdGVtcyB0aGF0IHdlcmUgYWRkZWQgdmlhIGFueSBvZiBQbGFpZOKAmXMgb3RoZXIgcHJvZHVjdHMuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgYXMgbG9uZyBhcyBMaW5rIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggYW55IG90aGVyIHByb2R1Y3QsIGBiYWxhbmNlYCBpdHNlbGYgaXMgbm90IGEgcHJvZHVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgcmVhbC10aW1lIGJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBY2NvdW50c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBsaXN0IG9mIGFjY291bnRzIGFzc29jaWF0ZWQgd2l0aCBhbnkgbGlua2VkIEl0ZW0uIFBsYWlkIHdpbGwgb25seSByZXR1cm4gYWN0aXZlIGJhbmsgYWNjb3VudHMg4oCUIHRoYXQgaXMsIGFjY291bnRzIHRoYXQgYXJlIG5vdCBjbG9zZWQgYW5kIGFyZSBjYXBhYmxlIG9mIGNhcnJ5aW5nIGEgYmFsYW5jZS4gVG8gcmV0dXJuIG5ldyBhY2NvdW50cyB0aGF0IHdlcmUgY3JlYXRlZCBhZnRlciB0aGUgdXNlciBsaW5rZWQgdGhlaXIgSXRlbSwgeW91IGNhbiBsaXN0ZW4gZm9yIHRoZSBbYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jbmV3X2FjY291bnRzX2F2YWlsYWJsZSkgd2ViaG9vayBhbmQgdGhlbiB1c2UgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKSB0byByZXF1ZXN0IHRoYXQgdGhlIHVzZXIgc2hhcmUgdGhpcyBuZXcgYWNjb3VudCB3aXRoIHlvdS4gIGAvYWNjb3VudHMvZ2V0YCBpcyBmcmVlIHRvIHVzZSBhbmQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gVGhlIGJhbGFuY2UgcmV0dXJuZWQgd2lsbCByZWZsZWN0IHRoZSBiYWxhbmNlIGF0IHRoZSB0aW1lIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgSXRlbSB1cGRhdGUuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgZm9yIGEgcmVndWxhcmx5IHVwZGF0aW5nIHByb2R1Y3QsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBJbnZlc3RtZW50cywgb3IgTGlhYmlsaXRpZXMsIHRoZSBiYWxhbmNlIHdpbGwgdHlwaWNhbGx5IHVwZGF0ZSBhYm91dCBvbmNlIGEgZGF5LCBhcyBsb25nIGFzIHRoZSBJdGVtIGlzIGhlYWx0aHkuIElmIHRoZSBJdGVtIGlzIGVuYWJsZWQgb25seSBmb3IgcHJvZHVjdHMgdGhhdCBkbyBub3QgZnJlcXVlbnRseSB1cGRhdGUsIHN1Y2ggYXMgQXV0aCBvciBJZGVudGl0eSwgYmFsYW5jZSBkYXRhIG1heSBiZSBtdWNoIG9sZGVyLiAgRm9yIHJlYWx0aW1lIGJhbGFuY2UgaW5mb3JtYXRpb24sIHVzZSB0aGUgcGFpZCBlbmRwb2ludCBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAgICAgKiBAcGFyYW0ge0FjY291bnRzR2V0UmVxdWVzdH0gYWNjb3VudHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0OiBBY2NvdW50c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QWNjb3VudHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYWNjb3VudHNHZXQoYWNjb3VudHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIFBsYWlkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QXBwbGljYXRpb25HZXRSZXF1ZXN0fSBhcHBsaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3Q6IEFwcGxpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBcHBsaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBQbGFpZCBjYW4gcHJvdmlkZSBhbiBBdWRpdCBDb3B5IG9mIGFueSBBc3NldCBSZXBvcnQgZGlyZWN0bHkgdG8gYSBwYXJ0aWNpcGF0aW5nIHRoaXJkIHBhcnR5IG9uIHlvdXIgYmVoYWxmLiBGb3IgZXhhbXBsZSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYgaWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbS4gQW4gQXVkaXQgQ29weSBjb250YWlucyB0aGUgc2FtZSB1bmRlcmx5aW5nIGRhdGEgYXMgdGhlIEFzc2V0IFJlcG9ydC4gIFRvIGdyYW50IGFjY2VzcyB0byBhbiBBdWRpdCBDb3B5LCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgdGhpcmQgcGFydHkgd2hvIG5lZWRzIGFjY2Vzcy4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgYXVkaXRvcl9pZGAsIGZvciBleGFtcGxlIGBmYW5uaWVfbWFlYC4gWW914oCZbGwgbmVlZCB0byBjcmVhdGUgYSBzZXBhcmF0ZSBBdWRpdCBDb3B5IGZvciBlYWNoIHRoaXJkIHBhcnR5IHRvIHdob20geW91IHdhbnQgdG8gZ3JhbnQgYWNjZXNzIHRvIHRoZSBSZXBvcnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9nZXRgIGFsbG93cyBhdWRpdG9ycyB0byBnZXQgYSBjb3B5IG9mIGFuIEFzc2V0IFJlcG9ydCB0aGF0IHdhcyBwcmV2aW91c2x5IHNoYXJlZCB2aWEgdGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBlbmRwb2ludC4gIFRoZSBjYWxsZXIgb2YgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIG11c3QgcHJvdmlkZSB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gIHRvIHRoZSBhdWRpdG9yLiAgVGhpcyB0b2tlbiBjYW4gdGhlbiBiZSB1c2VkIHRvIGNhbGwgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlHZXQoYXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgaW5pdGlhdGVzIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nIGFuIEFzc2V0IFJlcG9ydCwgd2hpY2ggY2FuIHRoZW4gYmUgcmV0cmlldmVkIGJ5IHBhc3NpbmcgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIHJldHVybiB2YWx1ZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludHMuICBUaGUgQXNzZXQgUmVwb3J0IHRha2VzIHNvbWUgdGltZSB0byBiZSBjcmVhdGVkIGFuZCBpcyBub3QgYXZhaWxhYmxlIGltbWVkaWF0ZWx5IGFmdGVyIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gVGhlIGV4YWN0IGFtb3VudCBvZiB0aW1lIHRvIGNyZWF0ZSB0aGUgcmVwb3J0IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgZGF5cyBvZiBoaXN0b3J5IGFyZSByZXF1ZXN0ZWQgYW5kIHdpbGwgdHlwaWNhbGx5IHJhbmdlIGZyb20gYSBmZXcgc2Vjb25kcyB0byBhYm91dCBvbmUgbWludXRlLiBXaGVuIHRoZSBBc3NldCBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkIHVzaW5nIGAvYXNzZXRfcmVwb3J0L2dldGAgb3IgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIFBsYWlkIHdpbGwgZmlyZSBhIGBQUk9EVUNUX1JFQURZYCB3ZWJob29rLiBGb3IgZnVsbCBkZXRhaWxzIG9mIHRoZSB3ZWJob29rIHNjaGVtYSwgc2VlIFtBc3NldCBSZXBvcnQgd2ViaG9va3NdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jd2ViaG9va3MpLiAgVGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgY3JlYXRlcyBhbiBBc3NldCBSZXBvcnQgYXQgYSBtb21lbnQgaW4gdGltZS4gQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLiBUbyBnZXQgYW4gdXBkYXRlZCBBc3NldCBSZXBvcnQsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIGFuIEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gYWxsIG9mIHRoZSBhY2NvdW50cyBvbiBhIGdpdmVuIEl0ZW0uIEluIHNvbWUgY2FzZXMsIHlvdSBtYXkgbm90IHdhbnQgdGhlIEFzc2V0IFJlcG9ydCB0byBjb250YWluIGFsbCBhY2NvdW50cy4gRm9yIGV4YW1wbGUsIHlvdSBtaWdodCBoYXZlIHRoZSBlbmQgdXNlciBjaG9vc2Ugd2hpY2ggYWNjb3VudHMgYXJlIHJlbGV2YW50IGluIExpbmsgdXNpbmcgdGhlIEFjY291bnQgU2VsZWN0IHZpZXcsIHdoaWNoIHlvdSBjYW4gZW5hYmxlIGluIHRoZSBkYXNoYm9hcmQuIE9yLCB5b3UgbWlnaHQgYWx3YXlzIGV4Y2x1ZGUgY2VydGFpbiBhY2NvdW50IHR5cGVzIG9yIHN1YnR5cGVzLCB3aGljaCB5b3UgY2FuIGlkZW50aWZ5IGJ5IHVzaW5nIHRoZSBgL2FjY291bnRzL2dldGAgZW5kcG9pbnQuIFRvIG5hcnJvdyBhbiBBc3NldCBSZXBvcnQgdG8gb25seSBhIHN1YnNldCBvZiBhY2NvdW50cywgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LiAgVG8gZXhjbHVkZSBjZXJ0YWluIEFjY291bnRzIGZyb20gYW4gQXNzZXQgUmVwb3J0LCBmaXJzdCB1c2UgdGhlIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIHRoZSByZXBvcnQsIHRoZW4gc2VuZCB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgYWxvbmcgd2l0aCBhIGxpc3Qgb2YgYGFjY291bnRfaWRzYCB0byBleGNsdWRlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGVuZHBvaW50LCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IHdoaWNoIGNvbnRhaW5zIG9ubHkgYSBzdWJzZXQgb2YgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydFxcJ3MgZGF0YS4gIEJlY2F1c2UgQXNzZXQgUmVwb3J0cyBhcmUgaW1tdXRhYmxlLCBjYWxsaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG9lcyBub3QgYWx0ZXIgdGhlIG9yaWdpbmFsIEFzc2V0IFJlcG9ydCBpbiBhbnkgd2F5OyByYXRoZXIsIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgY3JlYXRlcyBhIG5ldyBBc3NldCBSZXBvcnQgd2l0aCBhIG5ldyB0b2tlbiBhbmQgaWQuIEFzc2V0IFJlcG9ydHMgY3JlYXRlZCB2aWEgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBkbyBub3QgY29udGFpbiBuZXcgQXNzZXQgZGF0YSwgYW5kIGFyZSBub3QgYmlsbGVkLiAgUGxhaWQgd2lsbCBmaXJlIGEgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIG9uY2UgZ2VuZXJhdGlvbiBvZiB0aGUgZmlsdGVyZWQgQXNzZXQgUmVwb3J0IGhhcyBjb21wbGV0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEZpbHRlclJlcXVlc3R9IGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdDogQXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0RmlsdGVyUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmFzc2V0UmVwb3J0RmlsdGVyKGFzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9hc3NldF9yZXBvcnQvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgKG9yIGZpbHRlciBhbiBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCkgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9hc3NldF9yZXBvcnQvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIFBERiBBc3NldCBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQW4gQXNzZXQgUmVwb3J0IGlzIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiBhIHVzZXJcXCdzIGFzc2V0cy4gSW4gb3JkZXIgdG8gXFxcInJlZnJlc2hcXFwiIGFuIEFzc2V0IFJlcG9ydCB5b3UgY3JlYXRlZCBwcmV2aW91c2x5LCB5b3UgY2FuIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCBiYXNlZCBvbiB0aGUgb2xkIG9uZSwgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlLiAgVGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIHRoZSBzYW1lIEl0ZW1zIGFzIHRoZSBvcmlnaW5hbCBSZXBvcnQsIGFzIHdlbGwgYXMgdGhlIHNhbWUgZmlsdGVycyBhcHBsaWVkIGJ5IGFueSBjYWxsIHRvIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAuIEJ5IGRlZmF1bHQsIHRoZSBuZXcgQXNzZXQgUmVwb3J0IHdpbGwgYWxzbyB1c2UgdGhlIHNhbWUgcGFyYW1ldGVycyB5b3Ugc3VibWl0dGVkIHdpdGggeW91ciBvcmlnaW5hbCBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIHJlcXVlc3QsIGJ1dCB0aGUgb3JpZ2luYWwgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBhbmQgdGhlIHZhbHVlcyBvZiBhbnkgcGFyYW1ldGVycyBpbiB0aGUgYG9wdGlvbnNgIG9iamVjdCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIG5ldyB2YWx1ZXMuIFRvIGNoYW5nZSB0aGVzZSBhcmd1bWVudHMsIHNpbXBseSBzdXBwbHkgbmV3IHZhbHVlcyBmb3IgdGhlbSBpbiB5b3VyIHJlcXVlc3QgdG8gYC9hc3NldF9yZXBvcnQvcmVmcmVzaGAuIFN1Ym1pdCBhbiBlbXB0eSBzdHJpbmcgKFxcXCJcXFwiKSBmb3IgYW55IHByZXZpb3VzbHktcG9wdWxhdGVkIGZpZWxkcyB5b3Ugd291bGQgbGlrZSBzZXQgYXMgZW1wdHkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggYW4gQXNzZXQgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEFzc2V0UmVwb3J0UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5hc3NldFJlcG9ydFJlZnJlc2goYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgICAgICogQHN1bW1hcnkgRGVsZXRlIGFuIEFzc2V0IFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdH0gYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0OiBBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXJzIChzdWNoIGFzIHJvdXRpbmcgbnVtYmVycywgZm9yIFVTIGFjY291bnRzKSBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbVxcJ3MgY2hlY2tpbmcsIHNhdmluZ3MsIGFuZCBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudHMsIGFsb25nIHdpdGggaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBJbiBBUEkgdmVyc2lvbiAyMDE3LTAzLTA4LCB0aGUgc2NoZW1hIG9mIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQgaXMgc3Vic3RhbnRpYWxseSBkaWZmZXJlbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTgtMDUtMjIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhdXRoIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBhdXRoR2V0KGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBdXRoR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmF1dGhHZXQoYXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gc2VlIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB5b3VyIGJhbmsgdHJhbnNmZXIgYWNjb3VudC4gRGViaXQgdHJhbnNmZXJzIGluY3JlYXNlIHRoaXMgYmFsYW5jZSBvbmNlIHRoZWlyIHN0YXR1cyBpcyBwb3N0ZWQuIENyZWRpdCB0cmFuc2ZlcnMgZGVjcmVhc2UgdGhpcyBiYWxhbmNlIHdoZW4gdGhleSBhcmUgY3JlYXRlZC4gIFRoZSB0cmFuc2FjdGFibGUgYmFsYW5jZSBzaG93cyB0aGUgYW1vdW50IGluIHlvdXIgYWNjb3VudCB0aGF0IHlvdSBhcmUgYWJsZSB0byB1c2UgZm9yIHRyYW5zZmVycywgYW5kIGlzIGVzc2VudGlhbGx5IHlvdXIgYXZhaWxhYmxlIGJhbGFuY2UgbWludXMgeW91ciBtaW5pbXVtIGJhbGFuY2UuICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBjYW4gb25seSBiZSB1c2VkIHdpdGggRkJPIGFjY291bnRzLCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBGdWxsIFNlcnZpY2UgY29uZmlndXJhdGlvbi4gSXQgY2Fubm90IGJlIHVzZWQgb24geW91ciBvd24gYWNjb3VudCB3aGVuIHVzaW5nIEJhbmsgVHJhbnNmZXJzIGluIHRoZSBCVFMgUGxhdGZvcm0gY29uZmlndXJhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGJhbGFuY2Ugb2YgeW91ciBCYW5rIFRyYW5zZmVyIGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9jYW5jZWxgIGVuZHBvaW50IHRvIGNhbmNlbCBhIGJhbmsgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxhdGlvbiBpZiB0aGUgYGNhbmNlbGxhYmxlYCBwcm9wZXJ0eSByZXR1cm5lZCBieSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBpcyBgdHJ1ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIGJhbmsgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlckNhbmNlbChiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgUGxhaWQtaW5pdGlhdGVkIEFDSCBvciBiYW5rIHRyYW5zZmVyIGV2ZW50cyBiYXNlZCBvbiBzcGVjaWZpZWQgZmlsdGVyIGNyaXRlcmlhLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hdXRoL2NvdmVyYWdlL21pY3JvZGVwb3NpdC1ldmVudHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJFdmVudExpc3QoYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJFdmVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2JhbmtfdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IFBsYWlkLWluaXRpYXRlZCBiYW5rIHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvbWljcm9kZXBvc2l0LWV2ZW50cy8pLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIGJhbmsgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckV2ZW50U3luY1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJFdmVudFN5bmMoYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBiYW5rIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgYmFuayB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCBiYW5rIHRyYW5zZmVycy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJMaXN0KGJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBcyBhbiBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgSXRlbXMgdmlhIExpbmssIHlvdSBjYW4gYWxzbyB1c2UgdGhlIGAvYmFua190cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiAgTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBCYW5rIFRyYW5zZmVyIGVuZHBvaW50cy4gIElmIHlvdSByZXF1aXJlIGFjY2VzcyB0byBvdGhlciBlbmRwb2ludHMsIGNyZWF0ZSB0aGUgSXRlbSB0aHJvdWdoIExpbmsgaW5zdGVhZC4gIEFjY2VzcyB0byBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdH0gYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnQoYmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvc3dlZXAvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3dlZXBzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCYW5rVHJhbnNmZXJTd2VlcExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmFua1RyYW5zZmVyU3dlZXBMaXN0KGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYCB0byBnZXQgcmlzayBpbnNpZ2h0cyBmb3IgYSBsaW5rZWQgYWNjb3VudC5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgcmlzayBvZiBhIGJhbmsgYWNjb3VudFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0fSBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3Q6IEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZShiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gRHVwbGljYXRlXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdH0gYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0OiBCZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvbkR1cGxpY2F0ZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIGZyYXVkIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gVXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3R9IGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRDcmVhdGUoYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdDogQmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIHJlcG9ydCBmb3IgYSBnaXZlbiBCZWFjb24gcmVwb3J0IGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRHZXQoYmVhY29uUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRMaXN0UmVxdWVzdH0gYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0OiBCZWFjb25SZXBvcnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydExpc3QoYmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvYmVhY29uL3JlcG9ydF9zeW5kaWNhdGlvbi9saXN0YCBlbmRwb2ludCB0byB2aWV3IGFsbCBCZWFjb24gUmVwb3J0cyB0aGF0IGhhdmUgYmVlbiBzeW5kaWNhdGVkIHRvIGEgc3BlY2lmaWMgQmVhY29uIFVzZXIuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyB3aGljaCBhcmUgcmVmZXJlbmNlcyB0byBCZWFjb24gUmVwb3J0cyBjcmVhdGVkIGVpdGhlciBieSB5b3UsIG9yIGFub3RoZXIgQmVhY29uIGN1c3RvbWVyLCB0aGF0IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBCZWFjb24gVXNlci4gQSBCZWFjb24gVXNlciBjYW4gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXQgb25jZS4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGFsbCBBY2NvdW50cyBsaW5rZWQgdG8gdGhpcyBCZWFjb24gVXNlci4gVGhlIGluc2lnaHRzIGZvciBlYWNoIGFjY291bnQgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBBY2NvdW50IEluc2lnaHRzIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3R9IGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdDogQmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0KGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdH0gYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0OiBCZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJDcmVhdGUoYmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckdldFJlcXVlc3R9IGJlYWNvblVzZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdDogQmVhY29uVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5iZWFjb25Vc2VyR2V0KGJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgQmVhY29uIFVzZXIgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgQmVhY29uIFVzZXJcXCdzIGhpc3RvcnlcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0fSBiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgYmVhY29uVXNlckhpc3RvcnlMaXN0KGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3Q6IEJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QmVhY29uVXNlckhpc3RvcnlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXBkYXRlIHRoZSBzdGF0dXMgb2YgYSBCZWFjb24gVXNlci4gIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHZpYSB0aGlzIGVuZHBvaW50LCBQbGFpZCB2YWxpZGF0ZXMgdGhhdCB0aGUgc3RhdHVzIGNoYW5nZSBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHJlbGF0ZWQgc3RhdGUgZm9yIHRoaXMgQmVhY29uIFVzZXIuIFNwZWNpZmljYWxseSwgd2Ugd2lsbCBjaGVjazogIDEuIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBhc3NvY2lhdGVkIEJlYWNvbiBSZXBvcnRzIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIsIGFuZCAyLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGNvbm5lY3RlZCB0byB0aGUgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwicmVqZWN0ZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgZWl0aGVyIGEgQmVhY29uIFJlcG9ydCBoYXMgYmVlbiBjcmVhdGVkIGZvciB0aGUgQmVhY29uIFVzZXIgb3IgYSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGhhcyBiZWVuIGNvbmZpcm1lZC4gV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcImNsZWFyZWRcXFwiLCB3ZSBlbmZvcmNlIHRoYXQgdGhlcmUgYXJlIG5vIGFjdGl2ZSBCZWFjb24gUmVwb3J0cyBvciBjb25maXJtZWQgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiBJZiB5b3UgcHJldmlvdXNseSBjcmVhdGVkIGEgQmVhY29uIFJlcG9ydCBmb3IgdGhpcyB1c2VyLCB5b3UgbXVzdCBkZWxldGUgaXQgYmVmb3JlIHVwZGF0aW5nIHRoZSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIi4gVGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInBlbmRpbmdfcmV2aWV3XFxcIi4gIElmIHRoZXNlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIHRoZSByZXF1ZXN0IHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCBhbiBlcnJvciBleHBsYWluaW5nIHRoZSBpc3N1ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgICAgICogQHBhcmFtIHtCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdH0gYmVhY29uVXNlclJldmlld1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBiZWFjb25Vc2VyUmV2aWV3KGJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0OiBCZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxCZWFjb25Vc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgZm9yIGEgQmVhY29uIFVzZXIgaW4geW91ciBCZWFjb24gUHJvZ3JhbSBvciBhZGQgbmV3IGFjY291bnRzIHRvIHRoZSBCZWFjb24gVXNlci4gIFNpbWlsYXIgdG8gYC9iZWFjb24vdXNlci9jcmVhdGVgLCBzZXZlcmFsIGNoZWNrcyBhcmUgcGVyZm9ybWVkIGltbWVkaWF0ZWx5IHdoZW4geW91IHN1Ym1pdCBhbiBpZGVudGl0eSBkYXRhIGNoYW5nZSB0byBgL2JlYWNvbi91c2VyL3VwZGF0ZWA6ICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgdXBkYXRlZCBQSUkgaXMgYWxzbyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnRzIGNyZWF0ZWQgYnkgeW91ciBvcmdhbml6YXRpb24gYWNyb3NzIGFsbCBvZiB5b3VyIEJlYWNvbiBQcm9ncmFtcy4gSWYgdGhlIHVzZXJcXCdzIGRhdGEgbWF0Y2hlcyBhIGZyYXVkIHJlcG9ydCB0aGF0IHlvdXIgdGVhbSBjcmVhdGVkLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHJlamVjdGVkYC4gICAgLSBGaW5hbGx5LCB0aGUgdXNlclxcJ3MgUElJIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIGZyYXVkIHJlcG9ydCBzaGFyZWQgd2l0aCB0aGUgQmVhY29uIE5ldHdvcmsgYnkgb3RoZXIgY29tcGFuaWVzLiBJZiBhIG1hdGNoaW5nIGZyYXVkIHJlcG9ydCBpcyBmb3VuZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgYHBlbmRpbmdfcmV2aWV3YCBzdGF0dXMgaWYgeW91ciBwcm9ncmFtIGhhcyBlbmFibGVkIGF1dG9tYXRpYyBmbGFnZ2luZyBiYXNlZCBvbiBuZXR3b3JrIGZyYXVkLiAgUGxhaWQgbWFpbnRhaW5zIGEgdmVyc2lvbiBoaXN0b3J5IGZvciBlYWNoIEJlYWNvbiBVc2VyLCBzbyB0aGUgQmVhY29uIFVzZXJcXCdzIGlkZW50aXR5IGRhdGEgYmVmb3JlIGFuZCBhZnRlciB0aGUgdXBkYXRlIGlzIHJldGFpbmVkIGFzIHNlcGFyYXRlIHZlcnNpb25zLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJVcGRhdGVSZXF1ZXN0fSBiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGJlYWNvblVzZXJVcGRhdGUoYmVhY29uVXNlclVwZGF0ZVJlcXVlc3Q6IEJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEJlYWNvblVzZXJVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNlbmQgYSByZXF1ZXN0IHRvIHRoZSBgL2NhdGVnb3JpZXMvZ2V0YCBlbmRwb2ludCB0byBnZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gY2F0ZWdvcmllcyByZXR1cm5lZCBieSBQbGFpZC4gVGhpcyBlbmRwb2ludCBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uLiAgQWxsIGltcGxlbWVudGF0aW9ucyBhcmUgcmVjb21tZW5kZWQgdG8gdXNlIHRoZSBuZXdlciBgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeWAgdGF4b25vbXkgaW5zdGVhZCBvZiB0aGUgb2xkZXIgYGNhdGVnb3J5YCB0YXhvbm9teSBzdXBwb3J0ZWQgYnkgdGhpcyBlbmRwb2ludC4gVGhlIFtgcGVyc29uYWxfZmluYW5jZV9jYXRlZ29yeSB0YXhvbm9teWAgQ1NWIGZpbGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy90cmFuc2FjdGlvbnMtcGVyc29uYWwtZmluYW5jZS1jYXRlZ29yeS10YXhvbm9teS5jc3YpIGlzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYW5kIGlzIG5vdCBhY2Nlc3NpYmxlIHZpYSBBUEkuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICAgICAqIEBwYXJhbSB7b2JqZWN0fSBib2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY2F0ZWdvcmllc0dldChib2R5OiBvYmplY3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q2F0ZWdvcmllc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jYXRlZ29yaWVzR2V0KGJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgSXRlbSBjb25zZW50IGV2ZW50cy4gQ29uc2VudCBsb2dzIGFyZSBvbmx5IGF2YWlsYWJsZSBmb3IgZXZlbnRzIG9jY3VycmluZyBvbiBvciBhZnRlciBOb3ZlbWJlciA3LCAyMDI0LiBVcCB0byB0aHJlZSB5ZWFycyBvZiBjb25zZW50IGxvZ3Mgd2lsbCBiZSBhdmFpbGFibGUgdmlhIHRoZSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtDb25zZW50RXZlbnRzR2V0UmVxdWVzdH0gY29uc2VudEV2ZW50c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjb25zZW50RXZlbnRzR2V0KGNvbnNlbnRFdmVudHNHZXRSZXF1ZXN0OiBDb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDb25zZW50RXZlbnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZXMgYWxsIGV4aXN0aW5nIENSQiBCYW5rIEluY29tZSBhbmQgQmFzZSByZXBvcnRzIGZvciB0aGUgY29uc3VtZXIgaW4gUERGIGZvcm1hdC4gIFJlc3BvbnNlIGlzIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgUmVwb3J0c1xuICAgICAgICAgKiBAcGFyYW0ge0NvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdH0gY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3VtZXJSZXBvcnRQZGZHZXQoY29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0OiBDb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jb25zdW1lclJlcG9ydFBkZkdldChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9iYW5rX2luY29tZS9jcmVhdGVgIGNyZWF0ZXMgYSBDUkEgcmVwb3J0IGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIENSQSByZXBvcnQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdH0gY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFCYW5rSW5jb21lQ3JlYXRlKGNyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0OiBDcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFCYW5rSW5jb21lQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUJhbmtJbmNvbWVDcmVhdGUoY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQmFua0luY29tZUdldFJlcXVlc3R9IGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhQmFua0luY29tZUdldChjcmFCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhQmFua0luY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBCYXNlIFJlcG9ydCBmb3IgeW91ciB1c2VyLCBhbGxvd2luZyB5b3UgdG8gcmVjZWl2ZSBjb21wcmVoZW5zaXZlIGJhbmsgYWNjb3VudCBhbmQgY2FzaCBmbG93IGRhdGEuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIGEgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNuXFwndCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgYmFzZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldChjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQ2FzaGZsb3cgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cywgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyYV9jYXNoZmxvd19pbnNpZ2h0c2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgd2Ugd2lsbCBnZW5lcmF0ZSB0aGUgaW5zaWdodHMgd2hlbiB5b3UgY2FsbCB0aGlzIGVuZHBvaW50LiBJbiB0aGlzIGNhc2UsIHlvdSBtYXkgb3B0aW9uYWxseSBwcm92aWRlIHBhcmFtZXRlcnMgdW5kZXIgYG9wdGlvbnNgIHRvIGNvbmZpZ3VyZSB3aGljaCBpbnNpZ2h0cyB5b3Ugd2FudCB0byByZWNlaXZlLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtpbmcgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjcmVhdGVzIGEgQ29uc3VtZXIgUmVwb3J0IHBvd2VyZWQgYnkgUGxhaWQgQ2hlY2suIFlvdSBjYW4gY2FsbCB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyByZXBvcnQgaWYgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCB3YXMgb21pdHRlZCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbi4gSWYgeW91IGRpZCBwcm92aWRlIGEgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbiwgdGhlbiBQbGFpZCBDaGVjayB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIExpbmsgcHJvY2VzcywgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBiZWZvcmUgcmV0cmlldmluZyB0aGUgcmVwb3J0LiAgIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQuIE5vdGUgdGhhdCByZWZyZXNoaW5nIG9yIHJlZ2VuZXJhdGluZyBhIHJlcG9ydCBpcyBhIGJpbGxhYmxlIGV2ZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBDb25zdW1lciBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBmb3IgeW91ciB1c2VyLiAgWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgYSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGNhc2ggZmxvdyBpbmZvcm1hdGlvbiBmcm9tIHlvdXIgdXNlclxcJ3MgYmFua3NcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgcHJvZHVjdCBmb3IgeW91ciB1c2VyLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCB0aGUgYENIRUNLX1JFUE9SVF9SRUFEWWAgd2ViaG9vaywgZWl0aGVyIGFmdGVyIHRoZSBMaW5rIHNlc3Npb24gZm9yIHRoZSB1c2VyIG9yIGFmdGVyIGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuIElmIHRoZSBtb3N0IHJlY2VudCBjb25zdW1lciByZXBvcnQgZm9yIHRoZSB1c2VyIGRvZXNu4oCZdCBoYXZlIHN1ZmZpY2llbnQgZGF0YSB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JhX25ldHdvcmtfYXR0cmlidXRlc2AgcHJvZHVjdCBvciBoYXZlIGdlbmVyYXRlZCBhIHJlcG9ydCB1c2luZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCwgd2Ugd2lsbCBnZW5lcmF0ZSB0aGUgYXR0cmlidXRlcyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG5ldHdvcmsgYXR0cmlidXRlcyBmb3IgdGhlIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgUGFydG5lciBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JlZGl0X3BhcnRuZXJfaW5zaWdodHNgIHByb2R1Y3Qgb3IgaGF2ZSBnZW5lcmF0ZWQgYSByZXBvcnQgdXNpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAsIHdlIHdpbGwgY2FsbCBvdXIgcGFydG5lcnMgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC4gSW4gdGhpcyBjYXNlLCB5b3UgbWF5IG9wdGlvbmFsbHkgcHJvdmlkZSBwYXJhbWV0ZXJzIHVuZGVyIGBvcHRpb25zYCB0byBjb25maWd1cmUgd2hpY2ggaW5zaWdodHMgeW91IHdhbnQgdG8gcmVjZWl2ZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gcGFydG5lcnNcbiAgICAgICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCeSBkZWZhdWx0LCB0aGUgbW9zdCByZWNlbnQgQmFzZSBSZXBvcnQgKGlmIGl0IGV4aXN0cykgZm9yIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHJlcXVlc3QgdGhhdCB0aGUgbW9zdCByZWNlbnQgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBiZSBpbmNsdWRlZCBpbiB0aGUgUERGIGFzIHdlbGwsIHVzZSB0aGUgYGFkZC1vbnNgIGZpZWxkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBDb25zdW1lciBSZXBvcnRzIGFzIGEgUERGXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUNoZWNrUmVwb3J0UGRmR2V0KGNyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZ2lzdGVyIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyKGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zIHRvIHRoZWlyIGFwcGxpY2FudHMuXG4gICAgICAgICAqIEBwYXJhbSB7Q1JBTG9hbnNSZWdpc3RlclJlcXVlc3R9IGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTG9hbnNSZWdpc3RlcihjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdDogQ1JBTG9hbnNSZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTG9hbnNSZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc1JlZ2lzdGVyKGNSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmAgaW5kaWNhdGVzIHRoZSBsb2FucyBoYXZlIHJlYWNoZWQgYSBmaW5hbCBzdGF0dXMgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVucmVnaXN0ZXIgYSBsaXN0IG9mIGxvYW5zLlxuICAgICAgICAgKiBAcGFyYW0ge0NyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3R9IGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdDogQ3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmFMb2FuVW5yZWdpc3RlclJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvY3JhL2xvYW5zL3VwZGF0ZWAgdXBkYXRlcyBsb2FuIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIHN0YXR1cyBhbmQgcGF5bWVudCBoaXN0b3J5LlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGVzIGxvYW4gZGF0YS5cbiAgICAgICAgICogQHBhcmFtIHtDcmFMb2Fuc1VwZGF0ZVJlcXVlc3R9IGNyYUxvYW5zVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdDogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYUxvYW5zVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSBhIE1vbml0b3JpbmcgSW5zaWdodHMgcmVwb3J0IGJ5IHBhc3NpbmcgaW4gdGhlIGB1c2VyX3Rva2VuYCByZWZlcnJlZCB0byBpbiB0aGUgd2ViaG9vayB5b3UgcmVjZWl2ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0KGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSB0byBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBsaW5rZWQgQ1JBIGl0ZW1zLCB3aGljaCBhcmUgdXBkYXRlZCBldmVyeSBkYXkgKGJlc3QtZWZmb3J0KS5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIE1vbml0b3JpbmcgSW5zaWdodHNcbiAgICAgICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZShjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXNseSBzdWJzY3JpYmVkIE1vbml0b3JpbmcgSW5zaWdodHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVuc3Vic2NyaWJlIGZyb20gTW9uaXRvcmluZyBJbnNpZ2h0c1xuICAgICAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdH0gY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0OiBDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmEvcGFydG5lcl9pbnNpZ2h0cy9nZXRgIHJldHVybnMgY2FzaCBmbG93IGluc2lnaHRzIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5zaWdodHMgZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyYVBhcnRuZXJJbnNpZ2h0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmFQYXJ0bmVySW5zaWdodHNHZXQoY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWF0ZVBheW1lbnRUb2tlbihwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGBjcmVkaXQvYXNzZXRfcmVwb3J0L2ZyZWRkaWVfbWFjL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gRnJlZGRpZSBNYWNcXCdzIEpTT04gZm9ybWF0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQuIE9ubHkgRnJlZGRpZSBNYWMgY2FuIHVzZSB0aGlzIGVuZHBvaW50LlxuICAgICAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8QXNzZXRSZXBvcnRGcmVkZGllR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBc3NldCBvciBJbmNvbWUgUmVwb3J0IEF1ZGl0IENvcHkgVG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3R9IGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2NyZWRpdC9hdWRpdF9jb3B5X3Rva2VuL3VwZGF0ZWAgZW5kcG9pbnQgdXBkYXRlcyBhbiBleGlzdGluZyAgQXVkaXQgQ29weSBUb2tlbiBieSBhZGRpbmcgdGhlIHJlcG9ydCB0b2tlbnMgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZCB0byB0aGUgYGF1ZGl0X2NvcHlfdG9rZW5gLiBJZiB0aGUgQXVkaXQgQ29weSBUb2tlbiBhbHJlYWR5IGNvbnRhaW5zIGEgcmVwb3J0IG9mIGEgY2VydGFpbiB0eXBlLCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIHRva2VuIHByb3ZpZGVkIGluIHRoZSBgcmVwb3J0X3Rva2Vuc2AgZmllbGQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBBdWRpdCBDb3B5IFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2VtcGxveW1lbnQvZ2V0YCByZXR1cm5zIHRoZSBlbXBsb3ltZW50IHJlcG9ydChzKSBkZXJpdmVkIGZyb20gYmFuayB0cmFuc2FjdGlvbiBkYXRhIGZvciBhIHNwZWNpZmllZCB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3Q6IENyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rRW1wbG95bWVudEdldChjcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci4gQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuIFRvIHJldHVybiBvbGRlciByZXBvcnRzLCB1c2UgdGhlIGBvcHRpb25zLmNvdW50YCBmaWVsZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZUdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua0luY29tZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lR2V0KGNyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuICBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uIGluIFBERiBmb3JtYXRcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtJbmNvbWVQZGZHZXQoY3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBkYXRhIGZvciBhIHNwZWNpZmljIHVzZXIuIElmIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpLmUuIGRlbGV0ZWQpLCB0aGUgZW5kcG9pbnQgd2lsbCByZWZyZXNoIHRoZSBtb3N0IHJlY2VudCB2YWxpZCByZXBvcnQgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHVzZXJcXCdzIGJhbmsgaW5jb21lIGluZm9ybWF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS93ZWJob29rL3VwZGF0ZWAgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgb3IgdW5zdWJzY3JpYmUgYSB1c2VyIGZvciBpbmNvbWUgd2ViaG9vayBub3RpZmljYXRpb25zLiBCeSBkZWZhdWx0LCBhbGwgdXNlcnMgc3RhcnQgb3V0IHVuc3Vic2NyaWJlZC4gIElmIGEgdXNlciBpcyBzdWJzY3JpYmVkLCBvbiBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZSwgeW91IHdpbGwgcmVjZWl2ZSBhIGBCQU5LX0lOQ09NRV9SRUZSRVNIX1VQREFURWAgd2ViaG9vaywgcHJvbXB0aW5nIHlvdSB0byByZWZyZXNoIGJhbmsgaW5jb21lIGRhdGEgZm9yIHRoZSB1c2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJzY3JpYmUgYW5kIHVuc3Vic2NyaWJlIHRvIHByb2FjdGl2ZSBub3RpZmljYXRpb25zIGZvciBhIHVzZXJcXCdzIGluY29tZSBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9iYW5rX3N0YXRlbWVudHMvdXBsb2Fkcy9nZXRgIHJldHVybnMgcGFyc2VkIGRhdGEgZnJvbSBiYW5rIHN0YXRlbWVudHMgdXBsb2FkZWQgYnkgdXNlcnMgYXMgcGFydCBvZiB0aGUgRG9jdW1lbnQgSW5jb21lIGZsb3cuIElmIHlvdXIgYWNjb3VudCBpcyBub3QgZW5hYmxlZCBmb3IgRG9jdW1lbnQgUGFyc2luZywgY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byByZXF1ZXN0IGFjY2Vzcy5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0KGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3Q6IENyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvZW1wbG95bWVudC9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zIHdpdGggZW1wbG95bWVudCBpbmZvcm1hdGlvbiBmcm9tIGEgdXNlclxcJ3MgcGF5cm9sbCBwcm92aWRlciB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRFbXBsb3ltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIFZlcmlmaWNhdGlvbiBvZiBBc3NldHMgYW5kIFZlcmlmaWNhdGlvbiBvZiBFbXBsb3ltZW50IHJlcG9ydHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEZyZWRkaWUgTWFjIGZvcm1hdCAoYWthIFZPQSAtIFZlcmlmaWNhdGlvbiBPZiBBc3NldHMpLCBhbmQgYSBWZXJpZmljYXRpb24gT2YgRW1wbG95bWVudCAoVk9FKSByZXBvcnQgaWYgdGhpcyBvbmUgaXMgYXZhaWxhYmxlLiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgZ2V0cyBwYXlyb2xsIGluY29tZSBpbmZvcm1hdGlvbiBmb3IgYSBzcGVjaWZpYyB1c2VyLCBlaXRoZXIgYXMgYSByZXN1bHQgb2YgdGhlIHVzZXIgY29ubmVjdGluZyB0byB0aGVpciBwYXlyb2xsIHByb3ZpZGVyIG9yIHVwbG9hZGluZyBhIHBheSByZWxhdGVkIGRvY3VtZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wYXJzaW5nX2NvbmZpZy91cGRhdGVgIHVwZGF0ZXMgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH19IHJlcXVlc3RCb2R5IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVBhcnNpbmdDb25maWdVcGRhdGUocmVxdWVzdEJvZHk6IHsgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVQYXJzaW5nQ29uZmlnVXBkYXRlKHJlcXVlc3RCb2R5LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgYSBnaXZlbiBkaWdpdGFsIHBheXJvbGwgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaChjcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBhc3Nlc3MgYSB1c2VyLXVwbG9hZGVkIGRvY3VtZW50IGZvciBzaWducyBvZiBwb3RlbnRpYWwgZnJhdWQgb3IgdGFtcGVyaW5nLiBJdCByZXR1cm5zIGEgcmlzayBzY29yZSBmb3IgZWFjaCB1cGxvYWRlZCBkb2N1bWVudCB0aGF0IGluZGljYXRlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgZnJhdWR1bGVudCwgaW4gYWRkaXRpb24gdG8gZGV0YWlscyBvbiB0aGUgaW5kaXZpZHVhbCByaXNrIHNpZ25hbHMgY29udHJpYnV0aW5nIHRvIHRoZSBzY29yZS4gIFRvIHRyaWdnZXIgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBmb3IgYW4gSXRlbSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGBwYXJzaW5nX2NvbmZpZ2Agc2V0IHRvIGluY2x1ZGUgYHJpc2tfc2lnbmFsc2AsIG9yIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC4gT25jZSByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYCB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLiAgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gRG9jdW1lbnQgSW5jb21lIGFuZCBpcyBiaWxsZWQgc2VwYXJhdGVseS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBmcmF1ZCBpbnNpZ2h0cyBmb3IgYSB1c2VyXFwncyBtYW51YWxseSB1cGxvYWRlZCBkb2N1bWVudChzKS5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgY2FuIHNoYXJlIGFuIEFzc2V0IFJlcG9ydCBkaXJlY3RseSB3aXRoIGEgcGFydGljaXBhdGluZyB0aGlyZCBwYXJ0eSBvbiB5b3VyIGJlaGFsZi4gVGhlIHNoYXJlZCBBc3NldCBSZXBvcnQgaXMgdGhlIGV4YWN0IHNhbWUgQXNzZXQgUmVwb3J0IG9yaWdpbmFsbHkgY3JlYXRlZCBpbiBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiAgVG8gZ3JhbnQgYSB0aGlyZCBwYXJ0eSBhY2Nlc3MgdG8gYW4gQXNzZXQgUmVwb3J0LCB1c2UgdGhlIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgYHJlbGF5X3Rva2VuYCBhbmQgdGhlbiBwYXNzIHRoYXQgdG9rZW4gdG8geW91ciB0aGlyZCBwYXJ0eS4gRWFjaCB0aGlyZCBwYXJ0eSBoYXMgaXRzIG93biBgc2Vjb25kYXJ5X2NsaWVudF9pZGA7IGZvciBleGFtcGxlLCBgY2U1YmQzMjhkY2QzNDEyMzQ1NmAuIFlvdVxcJ2xsIG5lZWQgdG8gY3JlYXRlIGEgc2VwYXJhdGUgYHJlbGF5X3Rva2VuYCBmb3IgZWFjaCB0aGlyZCBwYXJ0eSB0aGF0IG5lZWRzIGFjY2VzcyB0byB0aGUgcmVwb3J0IG9uIHlvdXIgYmVoYWxmLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0fSBjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3Q6IENyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRSZWxheUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheUNyZWF0ZShjcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91XG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0UmVsYXlHZXRSZXF1ZXN0fSBjcmVkaXRSZWxheUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3Q6IENyZWRpdFJlbGF5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxBc3NldFJlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2NyZWRpdC9yZWxheS9wZGYvZ2V0YCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWNlaXZlIGEgcGRmIHJlcG9ydCB0aGF0IHdhcyBzaGFyZWQgd2l0aCB0aGVtLCB1c2luZyBhIGByZWxheV90b2tlbmAgdGhhdCB3YXMgY3JlYXRlZCBieSB0aGUgcmVwb3J0IG93bmVyLiAgVGhlIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIFBERiBmb3JtYXQuIEJlZm9yZSBjYWxsaW5nIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgVGhlIHJlc3BvbnNlIHRvIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGlzIHRoZSBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuICBbVmlldyBhIHNhbXBsZSBQREYgQXNzZXQgUmVwb3J0XShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvc2FtcGxlLWFzc2V0LXJlcG9ydC5wZGYpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcGRmIHJlcG9ydHMgYXNzb2NpYXRlZCB3aXRoIGEgcmVsYXkgdG9rZW4gdGhhdCB3YXMgc2hhcmVkIHdpdGggeW91IChiZXRhKVxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8YW55PiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9jcmVkaXQvcmVsYXkvcmVmcmVzaGAgZW5kcG9pbnQgYWxsb3dzIHRoaXJkIHBhcnRpZXMgdG8gcmVmcmVzaCBhIHJlcG9ydCB0aGF0IHdhcyByZWxheWVkIHRvIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuIEEgbmV3IHJlcG9ydCB3aWxsIGJlIGNyZWF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgcmVwb3J0IHBhcmFtZXRlcnMsIGJ1dCB3aXRoIHRoZSBtb3N0IHJlY2VudCBkYXRhIGF2YWlsYWJsZSBiYXNlZCBvbiB0aGUgYGRheXNfcmVxdWVzdGVkYCB2YWx1ZSBvZiB0aGUgb3JpZ2luYWwgcmVwb3J0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgcmVwb3J0IG9mIGEgcmVsYXkgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlbGF5UmVmcmVzaChjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSByZWxheSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdH0gY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0OiBDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8Q3JlZGl0UmVsYXlSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgUmVwb3J0IGRhdGEgYW5kIG90aGVyIEF1ZGl0IENvcGllcyBvZiBpdCBhcmUgbm90IGFmZmVjdGVkIGFuZCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIGFmdGVyIHJlbW92aW5nIHRoZSBnaXZlbiBBdWRpdCBDb3B5LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYW4gQXVkaXQgQ29weSB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPENyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmNyZWRpdFJlcG9ydEF1ZGl0Q29weVJlbW92ZShjcmVkaXRBdWRpdENvcHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIGZvciB5b3VyIGVuZCB1c2VycyBhZnRlciB0aGV5IGNvbXBsZXRlIHRoZSBMaW5rIGZsb3cuIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBhIGxpc3Qgb2YgTGluayBzZXNzaW9ucyB0aGF0IHlvdXIgdXNlciBjb21wbGV0ZWQsIHdoZXJlIGVhY2ggc2Vzc2lvbiBpbmNsdWRlcyB0aGUgcmVzdWx0cyBmcm9tIHRoZSBMaW5rIGZsb3cuICBUaGVzZSByZXN1bHRzIGluY2x1ZGUgZGV0YWlscyBhYm91dCB0aGUgSXRlbSB0aGF0IHdhcyBjcmVhdGVkIGFuZCBzb21lIHByb2R1Y3QgcmVsYXRlZCBtZXRhZGF0YSAoc2hvd2luZywgZm9yIGV4YW1wbGUsIHdoZXRoZXIgdGhlIHVzZXIgZmluaXNoZWQgdGhlIGJhbmsgaW5jb21lIHZlcmlmaWNhdGlvbiBzdGVwKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICAgICAqIEBwYXJhbSB7Q3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0fSBjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBjcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3Q6IENyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxDcmVkaXRTZXNzaW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5jcmVkaXRTZXNzaW9uc0dldChjcmVkaXRTZXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgZGFzaGJvYXJkIHVzZXJcbiAgICAgICAgICogQHBhcmFtIHtEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRhc2hib2FyZFVzZXJHZXQoZGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9saXN0YCBlbmRwb2ludCBwcm92aWRlcyBkZXRhaWxzIChzdWNoIGFzIGVtYWlsIGFkZHJlc3MpIGFsbCBEYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC4gVGhpcyBjYW4gdXNlIHVzZWQgdG8gYXVkaXQgb3IgdHJhY2sgdGhlIGxpc3Qgb2YgcmV2aWV3ZXJzIGZvciBNb25pdG9yLCBCZWFjb24sIGFuZCBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZGFzaGJvYXJkIHVzZXJzXG4gICAgICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0fSBkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3Q6IERhc2hib2FyZFVzZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEYXNoYm9hcmRVc2VyTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCBmb3IgY3VzdG9tZXJzIHdobyBoYXZlIG5vdCB5ZXQgZnVsbHkgaW50ZWdyYXRlZCB3aXRoIFBsYWlkIEV4Y2hhbmdlLiBMaWtlIGAvZGVwb3NpdF9zd2l0Y2gvY3JlYXRlYCwgaXQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggd2l0aG91dCB1c2luZyBQbGFpZCBFeGNoYW5nZVxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgY3JlYXRlcyBhIGRlcG9zaXQgc3dpdGNoIGVudGl0eSB0aGF0IHdpbGwgYmUgcGVyc2lzdGVkIHRocm91Z2hvdXQgdGhlIGxpZmVjeWNsZSBvZiB0aGUgc3dpdGNoLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxEZXBvc2l0U3dpdGNoQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBob3cgdGhlIHVzZXIgaGFzIGNvbmZpZ3VyZWQgdGhlaXIgcGF5cm9sbCBhbGxvY2F0aW9uIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHN3aXRjaC4gWW91IGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBidWlsZCBsb2dpYyByZWxhdGVkIHRvIHRoZSB1c2VyXFwncyBkaXJlY3QgZGVwb3NpdCBhbGxvY2F0aW9uIHByZWZlcmVuY2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBkZXBvc2l0IHN3aXRjaFxuICAgICAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPERlcG9zaXRTd2l0Y2hHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEluIG9yZGVyIGZvciB0aGUgZW5kIHVzZXIgdG8gdGFrZSBhY3Rpb24sIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgcHVibGljIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZGVwb3NpdCBzd2l0Y2guIFRoaXMgdG9rZW4gaXMgdXNlZCB0byBpbml0aWFsaXplIExpbmsuIEl0IGNhbiBiZSB1c2VkIG9uZSB0aW1lIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgQ3JlYXRlIGEgZGVwb3NpdCBzd2l0Y2ggdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8RGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZShkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNlYXJjaCBlbXBsb3llciBkYXRhYmFzZVxuICAgICAgICAgKiBAcGFyYW0ge0VtcGxveWVyc1NlYXJjaFJlcXVlc3R9IGVtcGxveWVyc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBlbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdDogRW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxFbXBsb3llcnNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2VtcGxveW1lbnQvdmVyaWZpY2F0aW9uL2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgZW1wbG95bWVudHMgdGhyb3VnaCBhIHVzZXIgcGF5cm9sbCB0aGF0IHdhcyB2ZXJpZmllZCBieSBhbiBlbmQgdXNlci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L2VtcGxveW1lbnQvZ2V0YCBpbnN0ZWFkLlxuICAgICAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0KGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxFbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBIGdlbmVyaWMgd2ViaG9vayByZWNlaXZlciBlbmRwb2ludCBmb3IgRkRYIEV2ZW50IE5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtGRFhOb3RpZmljYXRpb259IGZEWE5vdGlmaWNhdGlvbiBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uOiBGRFhOb3RpZmljYXRpb24sIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8dm9pZD4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb24sIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYSBzcGVjaWZpYyByZWNpcGllbnRcbiAgICAgICAgICogQHN1bW1hcnkgR2V0IFJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcmVjaXBpZW50SWQgUmVjaXBpZW50IElkZW50aWZpZXIuIFVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIHJlY2lwaWVudFxuICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29BVVRIU1RBVEVJRF0gVGhlIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIE9BdXRoIFVSSSBcXCYjMzk7c3RhdGVcXCYjMzk7IHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGdldFJlY2lwaWVudChyZWNpcGllbnRJZDogc3RyaW5nLCBvQVVUSFNUQVRFSUQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8R2V0UmVjaXBpZW50UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmdldFJlY2lwaWVudChyZWNpcGllbnRJZCwgb0FVVEhTVEFURUlELCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50c1xuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgZ2V0UmVjaXBpZW50cyhvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEdldFJlY2lwaWVudHNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuZ2V0UmVjaXBpZW50cyhvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvaWRlbnRpdHkvZG9jdW1lbnRzL3VwbG9hZHMvZ2V0YCB0byByZXRyaWV2ZSBpZGVudGl0eSBkZXRhaWxzIHdoZW4gdXNpbmcgW0lkZW50aXR5IERvY3VtZW50IFVwbG9hZF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9pZGVudGl0eS9pZGVudGl0eS1kb2N1bWVudC11cGxvYWQvKS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyB1cGxvYWRlZCBkb2N1bWVudCBpZGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXQoaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdDogSWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuIE9ubHkgbmFtZSBkYXRhIGlzIGd1YXJhbnRlZWQgdG8gYmUgcmV0dXJuZWQ7IG90aGVyIGZpZWxkcyB3aWxsIGJlIGVtcHR5IGFycmF5cyBpZiBub3QgcHJvdmlkZWQgYnkgdGhlIGluc3RpdHV0aW9uLiAgTm90ZTogSW4gQVBJIHZlcnNpb25zIDIwMTgtMDUtMjIgYW5kIGVhcmxpZXIsIHRoZSBgb3duZXJzYCBvYmplY3QgaXMgbm90IHJldHVybmVkLCBhbmQgaW5zdGVhZCBpZGVudGl0eSBpbmZvcm1hdGlvbiBpcyByZXR1cm5lZCBpbiB0aGUgdG9wIGxldmVsIGBpZGVudGl0eWAgb2JqZWN0LiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMTktMDUtMjkpLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5TWF0Y2hSZXF1ZXN0fSBpZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5TWF0Y2goaWRlbnRpdHlNYXRjaFJlcXVlc3Q6IElkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBJZGVudGl0eSBwcm9kdWN0LiBJdCBpbml0aWF0ZXMgYW4gb24tZGVtYW5kIGV4dHJhY3Rpb24gdG8gZmV0Y2ggdGhlIG1vc3QgdXAgdG8gZGF0ZSBJZGVudGl0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBGaW5hbmNpYWwgSW5zdGl0dXRpb24uIFRoaXMgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBmb3IgYW55IElkZW50aXR5LWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBJZGVudGl0eSBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaWRlbnRpdHkvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSBhIHdlYmhvb2sgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2lkZW50aXR5LyNkZWZhdWx0X3VwZGF0ZSkuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pZGVudGl0eS9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJZGVudGl0eSBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpZGVudGl0eSBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlSZWZyZXNoUmVxdWVzdH0gaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5UmVmcmVzaChpZGVudGl0eVJlZnJlc2hSZXF1ZXN0OiBJZGVudGl0eVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5UmVmcmVzaFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRyeSB0byBhdXRvZmlsbCBhbiBJZGVudGl0eSBWZXJpZmljYXRpb24gYmFzZWQgb2YgdGhlIHByb3ZpZGVkIHBob25lIG51bWJlciwgZGF0ZSBvZiBiaXJ0aCBhbmQgY291bnRyeSBvZiByZXNpZGVuY2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhdXRvZmlsbCBmb3IgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiBmb3IgdGhlIHVzZXIgc3BlY2lmaWVkIGJ5IHRoZSBgY2xpZW50X3VzZXJfaWRgIGZpZWxkLiBUaGUgcmVxdWlyZW1lbnRzIGFuZCBiZWhhdmlvciBvZiB0aGUgdmVyaWZpY2F0aW9uIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBgdGVtcGxhdGVfaWRgIHByb3ZpZGVkLiBJZiB5b3UgZG9uXFwndCBrbm93IHdoZXRoZXIgdGhlIGFzc29jaWF0ZWQgdXNlciBhbHJlYWR5IGhhcyBhbiBhY3RpdmUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLCB5b3UgY2FuIHNwZWNpZnkgYFxcXCJpc19pZGVtcG90ZW50XFxcIjogdHJ1ZWAgaW4gdGhlIHJlcXVlc3QgYm9keS4gV2l0aCBpZGVtcG90ZW5jeSBlbmFibGVkLCBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb24gd2lsbCBvbmx5IGJlIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgZm9yIHRoZSBhc3NvY2lhdGVkIGBjbGllbnRfdXNlcl9pZGAgYW5kIGB0ZW1wbGF0ZV9pZGAuIElmIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBpcyBmb3VuZCwgaXQgd2lsbCBiZSByZXR1cm5lZCB1bm1vZGlmaWVkIHdpdGggYW4gYDIwMCBPS2AgSFRUUCBzdGF0dXMgY29kZS4gIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyBlbmRwb2ludCB0byBzdXBwbHkgaW5mb3JtYXRpb24geW91IGFscmVhZHkgaGF2ZSBjb2xsZWN0ZWQgYWJvdXQgdGhlIHVzZXI7IGlmIGFueSBvZiB0aGVzZSBmaWVsZHMgYXJlIHNwZWNpZmllZCwgdGhlIHNjcmVlbnMgcHJvbXB0aW5nIHRoZSB1c2VyIHRvIGVudGVyIHRoZW0gd2lsbCBiZSBza2lwcGVkIGR1cmluZyB0aGUgTGluayBmbG93LiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgSWRlbnRpdHkgVmVyaWZpY2F0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uR2V0KGlkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgSWRlbnRpdHkgVmVyaWZpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvdyBhIGN1c3RvbWVyIHRvIHJldHJ5IHRoZWlyIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5KGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vY3JlYXRlYCBiZWdpbnMgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gcHJvY2VzcyBieSByZXR1cm5pbmcgYW4gYGluY29tZV92ZXJpZmljYXRpb25faWRgLiBZb3UgY2FuIHRoZW4gcHJvdmlkZSB0aGUgYGluY29tZV92ZXJpZmljYXRpb25faWRgIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIHVuZGVyIHRoZSBgaW5jb21lX3ZlcmlmaWNhdGlvbmAgcGFyYW1ldGVyIGluIG9yZGVyIHRvIGNyZWF0ZSBhIExpbmsgaW5zdGFuY2UgdGhhdCB3aWxsIHByb21wdCB0aGUgdXNlciB0byBnbyB0aHJvdWdoIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3cuIFBsYWlkIHdpbGwgZmlyZSBhbiBgSU5DT01FYCB3ZWJob29rIG9uY2UgdGhlIHVzZXIgY29tcGxldGVzIHRoZSBQYXlyb2xsIEluY29tZSBmbG93LCBvciB3aGVuIHRoZSB1cGxvYWRlZCBkb2N1bWVudHMgaW4gdGhlIERvY3VtZW50IEluY29tZSBmbG93IGhhdmUgZmluaXNoZWQgcHJvY2Vzc2luZy4gXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25DcmVhdGUoaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBwcm92aWRlcyB0aGUgYWJpbGl0eSB0byBkb3dubG9hZCB0aGUgc291cmNlIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIElmIERvY3VtZW50IEluY29tZSB3YXMgdXNlZCwgdGhlIGRvY3VtZW50cyB3aWxsIGJlIHRob3NlIHRoZSB1c2VyIHByb3ZpZGVkIGluIExpbmsuIEZvciBQYXlyb2xsIEluY29tZSwgdGhlIG1vc3QgcmVjZW50IGZpbGVzIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgZnJvbSB0aGUgcGF5cm9sbCBwcm92aWRlciB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgZW5kcG9pbnQuICBUaGUgcmVzcG9uc2UgdG8gYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2RvY3VtZW50cy9kb3dubG9hZGAgaXMgYSBaSVAgZmlsZSBpbiBiaW5hcnkgZGF0YS4gSWYgYSBgZG9jdW1lbnRfaWRgIGlzIHBhc3NlZCwgYSBzaW5nbGUgZG9jdW1lbnQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhpcyBmaWxlLiBJZiBub3QsIHRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYWxsIGRvY3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHZlcmlmaWNhdGlvbi4gIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBEb3dubG9hZCB0aGUgb3JpZ2luYWwgZG9jdW1lbnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPGFueT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3BheXN0dWJzL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gdGhlIHBheXN0dWJzIHRoYXQgd2VyZSB1c2VkIHRvIHZlcmlmeSBhbiBlbmQgdXNlclxcJ3MgaW5jb21lLiBJdCBjYW4gYmUgY2FsbGVkIG9uY2UgdGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIHNldCB0byBgVkVSSUZJQ0FUSU9OX1NUQVRVU19QUk9DRVNTSU5HX0NPTVBMRVRFYCwgYXMgcmVwb3J0ZWQgYnkgdGhlIGBJTkNPTUU6IHZlcmlmaWNhdGlvbl9zdGF0dXNgIHdlYmhvb2suIEF0dGVtcHRpbmcgdG8gY2FsbCB0aGUgZW5kcG9pbnQgYmVmb3JlIHZlcmlmaWNhdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQgd2lsbCByZXN1bHQgaW4gYW4gZXJyb3IuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9nZXRgIGluc3RlYWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBwYXlzdHVicyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uIGFuZCByZXR1cm5zIGEgYHByZWNoZWNrX2lkYCB0aGF0IGNhbiBiZSBwcm92aWRlZCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYC4gSWYgdGhlIHVzZXIgaXMgZWxpZ2libGUgZm9yIGRpZ2l0YWwgdmVyaWZpY2F0aW9uLCBwcm92aWRpbmcgdGhlIGBwcmVjaGVja19pZGAgaW4gdGhpcyB3YXkgd2lsbCBnZW5lcmF0ZSBhIExpbmsgVUkgb3B0aW1pemVkIGZvciB0aGUgZW5kIHVzZXIgYW5kIHRoZWlyIHNwZWNpZmljIGVtcGxveWVyLiBJZiB0aGUgdXNlciBjYW5ub3QgYmUgY29uZmlybWVkIGFzIGVsaWdpYmxlLCB0aGUgYHByZWNoZWNrX2lkYCBjYW4gc3RpbGwgYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBlaXRoZXIgYGVtcGxveWVyYCBvciBgdHJhbnNhY3Rpb25zX2FjY2Vzc190b2tlbnNgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9wcmVjaGVja2AgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2soaW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGluZm9ybWF0aW9uIGZyb20gdGhlIHRheCBkb2N1bWVudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge0luY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIG9uIGFsbCBmaW5hbmNpYWwgaW5zdGl0dXRpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgUGxhaWQuIEJlY2F1c2UgUGxhaWQgc3VwcG9ydHMgdGhvdXNhbmRzIG9mIGluc3RpdHV0aW9ucywgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiAgSWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIGFuIGluc3RpdHV0aW9u4oCZcyBlbmFibGVkIHByb2R1Y3RzIGFuZCBhIGNsaWVudOKAmXMgZW5hYmxlZCBwcm9kdWN0cywgdGhlbiB0aGUgaW5zdGl0dXRpb24gd2lsbCBiZSBmaWx0ZXJlZCBvdXQgZnJvbSB0aGUgcmVzcG9uc2UuIEFzIGEgcmVzdWx0LCB0aGUgbnVtYmVyIG9mIGluc3RpdHV0aW9ucyByZXR1cm5lZCBtYXkgbm90IG1hdGNoIHRoZSBjb3VudCBzcGVjaWZpZWQgaW4gdGhlIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFsbCBzdXBwb3J0ZWQgaW5zdGl0dXRpb25zXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEluc3RpdHV0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNHZXQoaW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBkZXRhaWxzIG9mIGFuIGluc3RpdHV0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3R9IGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdDogSW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW5zdGl0dXRpb25zR2V0QnlJZFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnN0aXR1dGlvbnNHZXRCeUlkKGluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGluc3RpdHV0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3R9IGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdDogSW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJbnN0aXR1dGlvbnNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9pbnZlc3RtZW50cy9hdXRoL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgZGF0YSB0byBmYWNpbGl0YXRlIHRoZSB0cmFuc2ZlciBvZiBob2xkaW5nc1xuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdH0gaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzQXV0aEdldChpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0OiBJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzQXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgc3RvY2sgcG9zaXRpb24gZGF0YSBmb3IgYGludmVzdG1lbnRgLXR5cGUgYWNjb3VudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJbnZlc3RtZW50IGhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCBmb3IgdXNlcnMgb2YgdGhlIEludmVzdG1lbnRzIHByb2R1Y3QuIEl0IGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgbmV3ZXN0IGludmVzdG1lbnQgaG9sZGluZ3MgYW5kIHRyYW5zYWN0aW9ucyBmb3IgYW4gSXRlbS4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBJbnZlc3RtZW50cy1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gaW52ZXN0bWVudHMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2ludmVzdG1lbnRzL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgd2ViaG9va3M6IFtgSE9MRElOR1M6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2hvbGRpbmdzLWRlZmF1bHRfdXBkYXRlKSBpZiBhbnkgbmV3IGhvbGRpbmdzIGFyZSBkZXRlY3RlZCwgYW5kIFtgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TOiBERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2ludmVzdG1lbnRzLyNpbnZlc3RtZW50c190cmFuc2FjdGlvbnMtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBUaGlzIHdlYmhvb2sgd2lsbCB0eXBpY2FsbHkgbm90IGZpcmUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGR1ZSB0byB0aGUgbGFjayBvZiBkeW5hbWljIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFuZCBob2xkaW5ncyBkYXRhLiBUbyB0ZXN0IHRoaXMgd2ViaG9vayBpbiBTYW5kYm94LCBjYWxsIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AuIFVwZGF0ZWQgaG9sZGluZ3MgYW5kIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC9pbnZlc3RtZW50cy9ob2xkaW5ncy9nZXRgIGFuZCBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgLiBOb3RlIHRoYXQgdGhlIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgaW5zdGl0dXRpb25zLiBJZiBjYWxsZWQgb24gYW4gSXRlbSBmcm9tIGFuIGluc3RpdHV0aW9uIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGZ1bmN0aW9uYWxpdHksIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1NVUFBPUlRFRGAgZXJyb3IuICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBJbnZlc3RtZW50cyBhbmQgaGFzIGEgc2VwYXJhdGUgW2ZlZSBtb2RlbF0oL2RvY3MvYWNjb3VudC9iaWxsaW5nLyNwZXItcmVxdWVzdC1mbGF0LWZlZSkuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci5cbiAgICAgICAgICogQHN1bW1hcnkgUmVmcmVzaCBpbnZlc3RtZW50IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SW52ZXN0bWVudHNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzUmVmcmVzaChpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnNcbiAgICAgICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogSW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHJpZXZlIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgYElzc3VlYC4gVGhpcyBlbmRwb2ludCByZXR1cm5zIGEgc2luZ2xlIGBJc3N1ZWAgb2JqZWN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgYW4gSXNzdWVcbiAgICAgICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3Q6IElzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXNzdWVzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmlzc3Vlc0dldChpc3N1ZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuICBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIGBJc3N1ZWAgb2JqZWN0cywgd2l0aCBhbiBlbXB0eSBsaXN0IGluZGljYXRpbmcgdGhhdCBubyBpc3N1ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpZGVudGlmaWVycyBtdXN0IGJlIHByb3ZpZGVkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC5cbiAgICAgICAgICogQHN1bW1hcnkgU2VhcmNoIGZvciBhbiBJc3N1ZVxuICAgICAgICAgKiBAcGFyYW0ge0lzc3Vlc1NlYXJjaFJlcXVlc3R9IGlzc3Vlc1NlYXJjaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdDogSXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJc3N1ZXNTZWFyY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXNzdWVzU2VhcmNoKGlzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbGxvd3MgYSB1c2VyIHRvIHN1YnNjcmliZSB0byB1cGRhdGVzIG9uIGEgc3BlY2lmaWMgYElzc3VlYCB1c2luZyBhIFBPU1QgbWV0aG9kLiBTdWJzY3JpYmVycyB3aWxsIHJlY2VpdmUgd2ViaG9vayBub3RpZmljYXRpb25zIHdoZW4gdGhlIGlzc3VlIHN0YXR1cyBjaGFuZ2VzLCBwYXJ0aWN1bGFybHkgd2hlbiByZXNvbHZlZC5cbiAgICAgICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIGFuIElzc3VlXG4gICAgICAgICAqIEBwYXJhbSB7SXNzdWVzU3Vic2NyaWJlUmVxdWVzdH0gaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGlzc3Vlc1N1YnNjcmliZShpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0OiBJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPElzc3Vlc1N1YnNjcmliZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBkb2VzIG5vdCBleHBpcmUgYW5kIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBwZXJzaXN0ZW50LCBzZWN1cmUgbWFubmVyLiAgWW91IGNhbiB1c2UgdGhlIGAvaXRlbS9hY2Nlc3NfdG9rZW4vaW52YWxpZGF0ZWAgZW5kcG9pbnQgdG8gcm90YXRlIHRoZSBgYWNjZXNzX3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhlIGVuZHBvaW50IHJldHVybnMgYSBuZXcgYGFjY2Vzc190b2tlbmAgYW5kIGltbWVkaWF0ZWx5IGludmFsaWRhdGVzIHRoZSBwcmV2aW91cyBgYWNjZXNzX3Rva2VuYC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IEludmFsaWRhdGUgYWNjZXNzX3Rva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIHVzZXIgY29uc2VudCBldmVudHNcbiAgICAgICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtQWN0aXZpdHlMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEVuYWJsZSBjb25zdW1lcnMgdG8gdXBkYXRlIHByb2R1Y3QgYWNjZXNzIG9uIHNlbGVjdGVkIGFjY291bnRzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIHRoZSBzY29wZXMgb2YgYWNjZXNzIGZvciBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb25cbiAgICAgICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZShpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgICAgICogQHN1bW1hcnkgVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdH0gaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0OiBJdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1BcHBsaWNhdGlvblVubGlua1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIE5vdGU6IEFzIG9mIEp1bHkgMjAyMCwgdGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgYC9saW5rL3Rva2VuL2NyZWF0ZWAgd2l0aCBhbiBgYWNjZXNzX3Rva2VuYCB0byBjcmVhdGUgYSBMaW5rIHRva2VuIGZvciB1c2Ugd2l0aCBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkuICBJZiB5b3UgbmVlZCB5b3VyIHVzZXIgdG8gdGFrZSBhY3Rpb24gdG8gcmVzdG9yZSBvciByZXNvbHZlIGFuIGVycm9yIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCBnZW5lcmF0ZSBhIHB1YmxpYyB0b2tlbiB3aXRoIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgYW5kIHRoZW4gaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhhdCBgcHVibGljX3Rva2VuYC4gIEEgYHB1YmxpY190b2tlbmAgaXMgb25lLXRpbWUgdXNlIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIFlvdSB1c2UgYSBgcHVibGljX3Rva2VuYCB0byBpbml0aWFsaXplIExpbmsgaW4gW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZvciBhIHBhcnRpY3VsYXIgSXRlbS4gWW91IGNhbiBnZW5lcmF0ZSBhIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBJdGVtIGV2ZW4gaWYgeW91IGRpZCBub3QgdXNlIExpbmsgdG8gY3JlYXRlIHRoZSBJdGVtIG9yaWdpbmFsbHkuICBUaGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGlzICoqbm90KiogdXNlZCB0byBjcmVhdGUgeW91ciBpbml0aWFsIGBwdWJsaWNfdG9rZW5gLiBJZiB5b3UgaGF2ZSBub3QgYWxyZWFkeSByZWNlaXZlZCBhbiBgYWNjZXNzX3Rva2VuYCBmb3IgYSBzcGVjaWZpYyBJdGVtLCB1c2UgTGluayB0byBvYnRhaW4geW91ciBgcHVibGljX3Rva2VuYCBpbnN0ZWFkLiBTZWUgdGhlIFtRdWlja3N0YXJ0XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3F1aWNrc3RhcnQpIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1DcmVhdGVQdWJsaWNUb2tlbihpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiBhbiBJdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogYC9pdGVtL2ltcG9ydGAgY3JlYXRlcyBhbiBJdGVtIHZpYSB5b3VyIFBsYWlkIEV4Y2hhbmdlIEludGVncmF0aW9uIGFuZCByZXR1cm5zIGFuIGBhY2Nlc3NfdG9rZW5gLiBBcyBwYXJ0IG9mIGFuIGAvaXRlbS9pbXBvcnRgIHJlcXVlc3QsIHlvdSB3aWxsIGluY2x1ZGUgYSBVc2VyIElEIChgdXNlcl9hdXRoLnVzZXJfaWRgKSBhbmQgQXV0aGVudGljYXRpb24gVG9rZW4gKGB1c2VyX2F1dGguYXV0aF90b2tlbmApIHRoYXQgZW5hYmxlIGRhdGEgYWdncmVnYXRpb24gdGhyb3VnaCB5b3VyIFBsYWlkIEV4Y2hhbmdlIEFQSSBlbmRwb2ludHMuIFRoZXNlIGF1dGhlbnRpY2F0aW9uIHByaW5jaXBhbHMgYXJlIHRvIGJlIGNob3NlbiBieSB5b3UuICBVcG9uIGNyZWF0aW5nIGFuIEl0ZW0gdmlhIGAvaXRlbS9pbXBvcnRgLCBQbGFpZCB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gYW4gZXh0cmFjdGlvbiBvZiB0aGF0IEl0ZW0gdGhyb3VnaCB0aGUgUGxhaWQgRXhjaGFuZ2UgaW5mcmFzdHJ1Y3R1cmUgeW91IGhhdmUgYWxyZWFkeSBpbnRlZ3JhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBJbXBvcnQgSXRlbVxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1JbXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEV4Y2hhbmdlIGEgTGluayBgcHVibGljX3Rva2VuYCBmb3IgYW4gQVBJIGBhY2Nlc3NfdG9rZW5gLiBMaW5rIGhhbmRzIG9mZiB0aGUgYHB1YmxpY190b2tlbmAgY2xpZW50LXNpZGUgdmlhIHRoZSBgb25TdWNjZXNzYCBjYWxsYmFjayBvbmNlIGEgdXNlciBoYXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgYW4gSXRlbS4gVGhlIGBwdWJsaWNfdG9rZW5gIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBBbiBgYWNjZXNzX3Rva2VuYCBkb2VzIG5vdCBleHBpcmUsIGJ1dCBjYW4gYmUgcmV2b2tlZCBieSBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgLiAgVGhlIHJlc3BvbnNlIGFsc28gaW5jbHVkZXMgYW4gYGl0ZW1faWRgIHRoYXQgc2hvdWxkIGJlIHN0b3JlZCB3aXRoIHRoZSBgYWNjZXNzX3Rva2VuYC4gVGhlIGBpdGVtX2lkYCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuIEl0ZW0gaW4gYSB3ZWJob29rLiBUaGUgYGl0ZW1faWRgIGNhbiBhbHNvIGJlIHJldHJpZXZlZCBieSBtYWtpbmcgYW4gYC9pdGVtL2dldGAgcmVxdWVzdC5cbiAgICAgICAgICogQHN1bW1hcnkgRXhjaGFuZ2UgcHVibGljIHRva2VuIGZvciBhbiBhY2Nlc3MgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPEl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBJdGVtLiBPbmNlIHJlbW92ZWQsIHRoZSBgYWNjZXNzX3Rva2VuYCwgYXMgd2VsbCBhcyBhbnkgcHJvY2Vzc29yIHRva2VucyBvciBiYW5rIGFjY291bnQgdG9rZW5zIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbSwgaXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCBjYW5ub3QgYmUgdXNlZCB0byBhY2Nlc3MgYW55IGRhdGEgdGhhdCB3YXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIENhbGxpbmcgYC9pdGVtL3JlbW92ZWAgaXMgYSByZWNvbW1lbmRlZCBiZXN0IHByYWN0aWNlIHdoZW4gb2ZmYm9hcmRpbmcgdXNlcnMgb3IgaWYgYSB1c2VyIGNob29zZXMgdG8gZGlzY29ubmVjdCBhbiBhY2NvdW50IGxpbmtlZCB2aWEgUGxhaWQuIEZvciBzdWJzY3JpcHRpb24gcHJvZHVjdHMsIHN1Y2ggYXMgVHJhbnNhY3Rpb25zLCBMaWFiaWxpdGllcywgYW5kIEludmVzdG1lbnRzLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIHJlcXVpcmVkIHRvIGVuZCBzdWJzY3JpcHRpb24gYmlsbGluZyBmb3IgdGhlIEl0ZW0uIEZvciBtb25leSBtb3ZlbWVudCBwcm9kdWN0cyBzdWNoIGFzIEF1dGggYW5kIFRyYW5zZmVyLCBpZiB0aGUgSXRlbSBpcyBhdCBhbiBpbnN0aXR1dGlvbiB0aGF0IHVzZXMgVG9rZW5pemVkIEFjY291bnQgTnVtYmVycyAoVEFOcyksIHN1Y2ggYXMgQ2hhc2Ugb3IgUE5DLCBjYWxsaW5nIGAvaXRlbS9yZW1vdmVgIHdpbGwgaW52YWxpZGF0ZSB0aGUgVEFOLCBhbmQgc3Vic2VxdWVudCBBQ0ggdHJhbnNmZXIgYXR0ZW1wdHMgdXNpbmcgdGhhdCBUQU4gd2lsbCBiZSByZXR1cm5lZC4gIEluIExpbWl0ZWQgUHJvZHVjdGlvbiwgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBkb2VzIG5vdCBpbXBhY3QgdGhlIG51bWJlciBvZiByZW1haW5pbmcgTGltaXRlZCBQcm9kdWN0aW9uIEl0ZW1zIHlvdSBoYXZlIGF2YWlsYWJsZS4gIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSBhY2Nlc3MgdG8gdGhlbSBzcGVjaWZpY2FsbHkgdXNpbmcgdGhlIGAvYXNzZXRfcmVwb3J0L3JlbW92ZWAgZW5kcG9pbnQuICBBbHNvIG5vdGUgdGhhdCBmb3IgY2VydGFpbiBPQXV0aC1iYXNlZCBpbnN0aXR1dGlvbnMsIGFuIEl0ZW0gcmVtb3ZlZCB2aWEgYC9pdGVtL3JlbW92ZWAgbWF5IHN0aWxsIHNob3cgYXMgYW4gYWN0aXZlIGNvbm5lY3Rpb24gaW4gdGhlIGluc3RpdHV0aW9uXFwncyBPQXV0aCBwZXJtaXNzaW9uIG1hbmFnZXIuICBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciByZXR1cm4gYSBgcmVtb3ZlZGAgYm9vbGVhbiBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZS5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgICAgICogQHBhcmFtIHtJdGVtUmVtb3ZlUmVxdWVzdH0gaXRlbVJlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBpdGVtUmVtb3ZlKGl0ZW1SZW1vdmVSZXF1ZXN0OiBJdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxJdGVtUmVtb3ZlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLml0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgUE9TVCBgL2l0ZW0vd2ViaG9vay91cGRhdGVgIGFsbG93cyB5b3UgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbS4gVGhpcyByZXF1ZXN0IHRyaWdnZXJzIGEgW2BXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9pdGVtcy8jd2ViaG9va191cGRhdGVfYWNrbm93bGVkZ2VkKSB3ZWJob29rIHRvIHRoZSBuZXdseSBzcGVjaWZpZWQgd2ViaG9vayBVUkwuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge0l0ZW1XZWJob29rVXBkYXRlUmVxdWVzdH0gaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0OiBJdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8SXRlbVdlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuaXRlbVdlYmhvb2tVcGRhdGUoaXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge0xpYWJpbGl0aWVzR2V0UmVxdWVzdH0gbGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL2xpbmtfZGVsaXZlcnkvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBIb3N0ZWQgTGluayBzZXNzaW9uLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rRGVsaXZlcnlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua0RlbGl2ZXJ5Q3JlYXRlKGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgICAgICogQHBhcmFtIHtMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0fSBsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3Q6IExpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TGlua0RlbGl2ZXJ5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLmxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRXhjaGFuZ2UgYW4gT0F1dGggYGxpbmtfY29ycmVsYXRpb25faWRgIGZvciB0aGUgY29ycmVzcG9uZGluZyBgbGlua190b2tlbmAuIFRoZSBgbGlua19jb3JyZWxhdGlvbl9pZGAgaXMgb25seSBhdmFpbGFibGUgZm9yIFxcJ3BheW1lbnRfaW5pdGlhdGlvblxcJyBwcm9kdWN0cyBhbmQgaXMgcHJvdmlkZWQgdG8gdGhlIGNsaWVudCB2aWEgdGhlIE9BdXRoIGByZWRpcmVjdF91cmlgIGFzIGEgcXVlcnkgcGFyYW1ldGVyLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIGVwaGVtZXJhbCBhbmQgZXhwaXJlcyBpbiBhIGJyaWVmIHBlcmlvZCwgYWZ0ZXIgd2hpY2ggaXQgY2FuIG5vIGxvbmdlciBiZSBleGNoYW5nZWQgZm9yIHRoZSBcXCdsaW5rX3Rva2VuXFwnLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJZCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdH0gbGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtPYXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZShsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0OiBMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGEgYGxpbmtfdG9rZW5gLCB3aGljaCBpcyByZXF1aXJlZCBhcyBhIHBhcmFtZXRlciB3aGVuIGluaXRpYWxpemluZyBMaW5rLiBPbmNlIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGl0IHJldHVybnMgYSBgcHVibGljX3Rva2VuYC4gRm9yIG1vc3QgUGxhaWQgcHJvZHVjdHMsIHRoZSBgcHVibGljX3Rva2VuYCBpcyBzYXZlZCBhbmQgZXhjaGFuZ2VkIGZvciBhbiBgYWNjZXNzX3Rva2VuYCB2aWEgYC9pdGVtL3B1YmxpY190b2tlbi9leGNoYW5nZWAgYXMgcGFydCBvZiB0aGUgbWFpbiBMaW5rIGZsb3cuIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgW0xpbmsgZmxvdyBvdmVydmlld10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rLyNsaW5rLWZsb3ctb3ZlcnZpZXcpLiAgQSBgbGlua190b2tlbmAgZ2VuZXJhdGVkIGJ5IGAvbGluay90b2tlbi9jcmVhdGVgIGlzIGFsc28gdXNlZCB0byBpbml0aWFsaXplIG90aGVyIExpbmsgZmxvd3MsIHN1Y2ggYXMgdGhlIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGZvciB0b2tlbnMgd2l0aCBleHBpcmVkIGNyZWRlbnRpYWxzLCBvciB0aGUgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZsb3cuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBMaW5rIFRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPExpbmtUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5saW5rVG9rZW5DcmVhdGUobGlua1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgTGluayBzZXNzaW9uLCBpbmNsdWRpbmcgYWxsIGNhbGxiYWNrcyBmaXJlZCBkdXJpbmcgdGhlIHNlc3Npb24gYWxvbmcgd2l0aCB0aGVpciBtZXRhZGF0YSwgaW5jbHVkaW5nIHRoZSBwdWJsaWMgdG9rZW4uIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB3aXRoIExpbmsgZmxvd3MgdGhhdCBkb25cXCd0IHByb3ZpZGUgYSBwdWJsaWMgdG9rZW4gdmlhIGZyb250ZW5kIGNhbGxiYWNrcywgc3VjaCBhcyB0aGUgW0hvc3RlZCBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pIGFuZCB0aGUgW011bHRpLUl0ZW0gTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rLykuIEl0IGFsc28gY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgTGluayBUb2tlblxuICAgICAgICAgKiBAcGFyYW0ge0xpbmtUb2tlbkdldFJlcXVlc3R9IGxpbmtUb2tlbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBsaW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdDogTGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxMaW5rVG9rZW5HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAubGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIE5ldHdvcmsgSW5zaWdodHMgZnJvbSBhIGxpc3Qgb2YgYGFjY2Vzc190b2tlbnNgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGluc2lnaHRzIGZvciB0aGUgcHJvdmlkZWQgYGFjY2Vzc190b2tlbnNgXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdH0gbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldChuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0OiBOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5uZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL25ldHdvcmsvc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGEgdXNlciBpcyBlbGlnaWJsZSBmb3IgYSBzdHJlYW1saW5lZCBleHBlcmllbmNlLCBzdWNoIGFzIExheWVyLiAgTm90ZTogaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgZm9yIExheWVyIGVsaWdpYmlsaXR5IGluIHRoZSBmcm9udGVuZC4gYC9uZXR3b3JrL3N0YXR1cy9nZXRgIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNoZWNraW5nIExheWVyIGVsaWdpYmlsaXR5IGlmIGEgZnJvbnRlbmQgY2hlY2sgaXMgbm90IHBvc3NpYmxlIGZvciB5b3VyIHVzZSBjYXNlLiBGb3IgaW5zdHJ1Y3Rpb25zIG9uIHBlcmZvcm1pbmcgYSBmcm9udGVuZCBlbGlnaWJpbGl0eSBjaGVjaywgc2VlIHRoZSBbTGF5ZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9sYXllci8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLlxuICAgICAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgbmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8TmV0d29ya1N0YXR1c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5uZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9jcmVhdGVgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gY3JlYXRlIGVuZCBjdXN0b21lcnMuIFRvIGNyZWF0ZSBlbmQgY3VzdG9tZXJzLCBpdCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50IG9ubHksIGV2ZW4gd2hlbiBjcmVhdGluZyBTYW5kYm94IEFQSSBrZXlzLiBJZiBjYWxsZWQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGl0IHdpbGwgcmV0dXJuIGEgc2FtcGxlIHJlc3BvbnNlLCBidXQgbm8gY3VzdG9tZXIgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgQVBJIGtleXMgd2lsbCBub3QgYmUgdmFsaWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZXMgYSBuZXcgZW5kIGN1c3RvbWVyIGZvciBhIFBsYWlkIHJlc2VsbGVyLlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyQ3JlYXRlKHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVuYWJsZXMgYSBQbGFpZCByZXNlbGxlclxcJ3MgZW5kIGN1c3RvbWVyIGluIHRoZSBQcm9kdWN0aW9uIGVudmlyb25tZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBkYXRhIGFib3V0IGEgc2luZ2xlIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdH0gcGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lckdldChwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvb2F1dGhfaW5zdGl0dXRpb25zL2dldGAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZXRyaWV2ZSBPQXV0aC1pbnN0aXR1dGlvbiByZWdpc3RyYXRpb24gaW5mb3JtYXRpb24gYWJvdXQgYSBzaW5nbGUgZW5kIGN1c3RvbWVyLiBUbyBsZWFybiBob3cgdG8gc2V0IHVwIGEgd2ViaG9vayB0byBsaXN0ZW4gdG8gc3RhdHVzIHVwZGF0ZSBldmVudHMsIHZpc2l0IHRoZSBbcmVzZWxsZXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L3Jlc2VsbGVycy8jZW5hYmxpbmctZW5kLWN1c3RvbWVycykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHVybnMgT0F1dGgtaW5zdGl0dXRpb24gcmVnaXN0cmF0aW9uIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIGVuZCBjdXN0b21lci5cbiAgICAgICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BhcnRuZXIvY3VzdG9tZXIvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJlbW92ZSBhbiBlbmQgY3VzdG9tZXIuIFJlbW92aW5nIGFuIGVuZCBjdXN0b21lciB3aWxsIHJlbW92ZSBpdCBmcm9tIHZpZXcgaW4gdGhlIFBsYWlkIERhc2hib2FyZCBhbmQgZGVhY3RpdmF0ZSBpdHMgQVBJIGtleXMuIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgdXNlZCB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyIHRoYXQgaGFzIG5vdCB5ZXQgYmVlbiBlbmFibGVkIGluIGZ1bGwgUHJvZHVjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICAgICAqIEBwYXJhbSB7UGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdH0gcGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBhcnRuZXJDdXN0b21lclJlbW92ZShwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0OiBQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBhcnRuZXJDdXN0b21lclJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXltZW50IGNvbnNlbnQsIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluaXRpYXRlIHBheW1lbnRzIG9uIGJlaGFsZiBvZiB0aGUgdXNlci4gUGF5bWVudCBjb25zZW50cyBhcmUgY3JlYXRlZCB3aXRoIGBVTkFVVEhPUklTRURgIHN0YXR1cyBieSBkZWZhdWx0IGFuZCBtdXN0IGJlIGF1dGhvcmlzZWQgYnkgdGhlIHVzZXIgYmVmb3JlIHBheW1lbnRzIGNhbiBiZSBpbml0aWF0ZWQuICBDb25zZW50cyBjYW4gYmUgbGltaXRlZCBpbiB0aW1lIGFuZCBzY29wZSwgYW5kIGhhdmUgY29uc3RyYWludHMgdGhhdCBkZXNjcmliZSBsaW1pdGF0aW9ucyBmb3IgcGF5bWVudHMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IGNvbnNlbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9jb25zZW50L3BheW1lbnQvZXhlY3V0ZWAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gZXhlY3V0ZSBwYXltZW50cyB1c2luZyBwYXltZW50IGNvbnNlbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZShwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV2b2tlIHBheW1lbnQgY29uc2VudFxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjcmVhdGluZyBhIHBheW1lbnQgcmVjaXBpZW50LCB5b3UgY2FuIHVzZSB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHBheW1lbnQgdG8gdGhhdCByZWNpcGllbnQuICBQYXltZW50cyBjYW4gYmUgb25lLXRpbWUgb3Igc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgYW5kIGNhbiBiZSBkZW5vbWluYXRlZCBpbiBlaXRoZXIgRVVSLCBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLiAgSWYgbWFraW5nIGRvbWVzdGljIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cywgeW91ciByZWNpcGllbnQgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCB3aXRoIEJBQ1MgbnVtYmVycy4gSW4gZ2VuZXJhbCwgRVVSLWRlbm9taW5hdGVkIHBheW1lbnRzIHdpbGwgYmUgc2VudCB2aWEgU0VQQSBDcmVkaXQgVHJhbnNmZXIsIEdCUC1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIHRoZSBGYXN0ZXIgUGF5bWVudHMgbmV0d29yayBhbmQgZm9yIG5vbi1FdXJvem9uZSBtYXJrZXRzIHR5cGljYWxseSB2aWEgdGhlIGxvY2FsIHBheW1lbnQgc2NoZW1lLCBidXQgdGhlIHBheW1lbnQgbmV0d29yayB1c2VkIHdpbGwgYmUgZGV0ZXJtaW5lZCBieSB0aGUgaW5zdGl0dXRpb24uIFBheW1lbnRzIHNlbnQgdmlhIEZhc3RlciBQYXltZW50cyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW1tZWRpYXRlbHksIHdoaWxlIHBheW1lbnRzIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyIG9yIG90aGVyIGxvY2FsIHBheW1lbnQgc2NoZW1lcyB3aWxsIHR5cGljYWxseSBhcnJpdmUgaW4gb25lIGJ1c2luZXNzIGRheS4gIFN0YW5kaW5nIG9yZGVycyAocmVjdXJyaW5nIHBheW1lbnRzKSBtdXN0IGJlIGRlbm9taW5hdGVkIGluIEdCUCBhbmQgY2FuIG9ubHkgYmUgc2VudCB0byByZWNpcGllbnRzIGluIHRoZSBVSy4gT25jZSBjcmVhdGVkLCBzdGFuZGluZyBvcmRlciBwYXltZW50cyBjYW5ub3QgYmUgbW9kaWZpZWQgb3IgY2FuY2VsZWQgdmlhIHRoZSBBUEkuIEFuIGVuZCB1c2VyIGNhbiBjYW5jZWwgb3IgbW9kaWZ5IGEgc3RhbmRpbmcgb3JkZXIgZGlyZWN0bHkgb24gdGhlaXIgYmFua2luZyBhcHBsaWNhdGlvbiBvciB3ZWJzaXRlLCBvciBieSBjb250YWN0aW5nIHRoZSBiYW5rLiBTdGFuZGluZyBvcmRlcnMgd2lsbCBmb2xsb3cgdGhlIHBheW1lbnQgcnVsZXMgb2YgdGhlIHVuZGVybHlpbmcgcmFpbHMgKEZhc3RlciBQYXltZW50cyBpbiBVSykuIFBheW1lbnRzIGNhbiBiZSBzZW50IE1vbmRheSB0byBGcmlkYXksIGV4Y2x1ZGluZyBiYW5rIGhvbGlkYXlzLiBJZiB0aGUgcHJlLWFycmFuZ2VkIGRhdGUgZmFsbHMgb24gYSB3ZWVrZW5kIG9yIGJhbmsgaG9saWRheSwgdGhlIHBheW1lbnQgaXMgbWFkZSBvbiB0aGUgbmV4dCB3b3JraW5nIGRheS4gSXQgaXMgbm90IHBvc3NpYmxlIHRvIGd1YXJhbnRlZSB0aGUgZXhhY3QgdGltZSB0aGUgcGF5bWVudCB3aWxsIHJlYWNoIHRoZSByZWNpcGllbnTigJlzIGFjY291bnQsIGFsdGhvdWdoIGF0IGxlYXN0IDkwJSBvZiBzdGFuZGluZyBvcmRlciBwYXltZW50cyBhcmUgc2VudCBieSA2YW0uICBJbiBMaW1pdGVkIFByb2R1Y3Rpb24sIHBheW1lbnRzIG11c3QgYmUgYmVsb3cgNSBHQlAgb3Igb3RoZXIgY2hvc2VuIFtjdXJyZW5jeV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvcGF5bWVudC1pbml0aWF0aW9uLyNwYXltZW50X2luaXRpYXRpb24tcGF5bWVudC1jcmVhdGUtcmVxdWVzdC1hbW91bnQtY3VycmVuY3kpLCBhbmQgc3RhbmRpbmcgb3JkZXJzLCB2YXJpYWJsZSByZWN1cnJpbmcgcGF5bWVudHMsIGFuZCBWaXJ0dWFsIEFjY291bnRzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhIHBheW1lbnQsIGFzIHdlbGwgYXMgdG8gcmVjZWl2ZSBiYXNpYyBpbmZvcm1hdGlvbiBzdWNoIGFzIHJlY2lwaWVudCBhbmQgcGF5bWVudCBhbW91bnQuIEluIHRoZSBjYXNlIG9mIHN0YW5kaW5nIG9yZGVycywgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCB3aWxsIHByb3ZpZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN0YXR1cyBvZiB0aGUgb3ZlcmFsbCBzdGFuZGluZyBvcmRlciBpdHNlbGY7IHRoZSBBUEkgY2Fubm90IGJlIHVzZWQgdG8gcmV0cmlldmUgcGF5bWVudCBzdGF0dXMgZm9yIGluZGl2aWR1YWwgcGF5bWVudHMgd2l0aGluIGEgc3RhbmRpbmcgb3JkZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGRldGFpbHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldChwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHBheW1lbnRzXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gIFByb3ZpZGluZyBjb3VudGVycGFydHkgaW5mb3JtYXRpb24gc3VjaCBhcyBkYXRlIG9mIGJpcnRoIGFuZCBhZGRyZXNzIGluY3JlYXNlcyAgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXZlcnNlIGFuIGV4aXN0aW5nIHBheW1lbnRcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2UocGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgZGV0YWlscyBhYm91dCBhIHBheW1lbnQgcmVjaXBpZW50IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHBheW1lbnQgcmVjaXBpZW50XG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vcmVjaXBpZW50L2xpc3RgIGVuZHBvaW50IGxpc3QgdGhlIHBheW1lbnQgcmVjaXBpZW50cyB0aGF0IHlvdSBoYXZlIHByZXZpb3VzbHkgY3JlYXRlZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvcGF5bWVudF9wcm9maWxlL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgcHJvZmlsZS4gVG8gaW5pdGlhdGUgdGhlIGFjY291bnQgbGlua2luZyBleHBlcmllbmNlLCBjYWxsIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCBwcm92aWRlIHRoZSBgcGF5bWVudF9wcm9maWxlX3Rva2VuYCBpbiB0aGUgYHRyYW5zZmVyLnBheW1lbnRfcHJvZmlsZV90b2tlbmAgZmllbGQuIFlvdSBjYW4gdGhlbiB1c2UgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIHdoZW4gY3JlYXRpbmcgdHJhbnNmZXJzIHVzaW5nIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGFuZCBgL3RyYW5zZmVyL2NyZWF0ZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBwYXltZW50IHByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFBheW1lbnRQcm9maWxlQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3BheW1lbnRfcHJvZmlsZS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICAgICAqIEBwYXJhbSB7UGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0fSBwYXltZW50UHJvZmlsZUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3Q6IFBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQYXltZW50UHJvZmlsZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wYXltZW50UHJvZmlsZUdldChwYXltZW50UHJvZmlsZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgICAgICogQHN1bW1hcnkgUmVtb3ZlIHBheW1lbnQgcHJvZmlsZVxuICAgICAgICAgKiBAcGFyYW0ge1BheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdH0gcGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0OiBQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UGF5bWVudFByb2ZpbGVSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCByZXR1cm5zIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gIFRoaXMgZW5kcG9pbnQgcmV0cmlldmVzIGNhY2hlZCBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXh0cmFjdGluZyBmcmVzaCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBpbnN0aXR1dGlvbi4gQXMgYSByZXN1bHQsIHRoZSBhY2NvdW50IGJhbGFuY2UgcmV0dXJuZWQgbWF5IG5vdCBiZSB1cC10by1kYXRlOyBmb3IgcmVhbHRpbWUgYmFsYW5jZSBpbmZvcm1hdGlvbiwgdXNlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBpbnN0ZWFkLiBOb3RlIHRoYXQgc29tZSBpbmZvcm1hdGlvbiBpcyBudWxsYWJsZS4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHRoZSBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckFjY291bnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZWQgdG8gY3JlYXRlIGEgdG9rZW4gc3VpdGFibGUgZm9yIHNlbmRpbmcgdG8gQXBleCB0byBlbmFibGUgUGxhaWQtQXBleCBpbnRlZ3JhdGlvbnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBBcGV4IGJhbmsgYWNjb3VudCB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlciAoc3VjaCBhcyB0aGUgcm91dGluZyBudW1iZXIsIGZvciBVUyBhY2NvdW50cyksIGZvciBhIGNoZWNraW5nLCBzYXZpbmdzLCBvciBjYXNoIG1hbmFnZW1lbnQgYWNjb3VudCB0aGF0XFwnXFwncyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBgcHJvY2Vzc29yX3Rva2VuYC4gVGhlIGVuZHBvaW50IGFsc28gcmV0dXJucyBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEFQSSB2ZXJzaW9ucyAyMDE5LTA1LTI5IGFuZCBlYXJsaWVyIHVzZSBhIGRpZmZlcmVudCBzY2hlbWEgZm9yIHRoZSBgbnVtYmVyc2Agb2JqZWN0IHJldHVybmVkIGJ5IHRoaXMgZW5kcG9pbnQuIEZvciBkZXRhaWxzLCBzZWUgW1BsYWlkIEFQSSB2ZXJzaW9uaW5nXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS92ZXJzaW9uaW5nLyN2ZXJzaW9uLTIwMjAtMDktMTQpLiBcbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQXV0aEdldFJlcXVlc3R9IHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQXV0aEdldChwcm9jZXNzb3JBdXRoR2V0UmVxdWVzdDogUHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQXV0aEdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgZWFjaCBvZiBhbiBJdGVtXFwncyBhY2NvdW50cy4gV2hpbGUgb3RoZXIgZW5kcG9pbnRzIG1heSByZXR1cm4gYSBiYWxhbmNlIG9iamVjdCwgb25seSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZm9yY2VzIHRoZSBhdmFpbGFibGUgYW5kIGN1cnJlbnQgYmFsYW5jZSBmaWVsZHMgdG8gYmUgcmVmcmVzaGVkIHJhdGhlciB0aGFuIGNhY2hlZC4gXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0fSBwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCBUaGUgJiN4NjA7L3Byb2Nlc3Nvci9iYWxhbmNlL2dldCYjeDYwOyBlbmRwb2ludCByZXR1cm5zIHRoZSByZWFsLXRpbWUgYmFsYW5jZSBmb3IgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gJiN4NjA7cHJvY2Vzc29yX3Rva2VuJiN4NjA7LiAgVGhlIGN1cnJlbnQgYmFsYW5jZSBpcyB0aGUgdG90YWwgYW1vdW50IG9mIGZ1bmRzIGluIHRoZSBhY2NvdW50LiBUaGUgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdGhlIGN1cnJlbnQgYmFsYW5jZSBsZXNzIGFueSBvdXRzdGFuZGluZyBob2xkcyBvciBkZWJpdHMgdGhhdCBoYXZlIG5vdCB5ZXQgcG9zdGVkIHRvIHRoZSBhY2NvdW50LiAgTm90ZSB0aGF0IG5vdCBhbGwgaW5zdGl0dXRpb25zIGNhbGN1bGF0ZSB0aGUgYXZhaWxhYmxlIGJhbGFuY2UuIEluIHRoZSBldmVudCB0aGF0IGF2YWlsYWJsZSBiYWxhbmNlIGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIGluc3RpdHV0aW9uLCBQbGFpZCB3aWxsIHJldHVybiBhbiBhdmFpbGFibGUgYmFsYW5jZSB2YWx1ZSBvZiAmI3g2MDtudWxsJiN4NjA7LlxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yQmFsYW5jZUdldChwcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdDogUHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yQmFsYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3Byb2Nlc3Nvci9iYW5rX3RyYW5zZmVyL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgYmFuayB0cmFuc2ZlciBhcyBhIHByb2Nlc3NvclxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZShwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9nZXRgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdmFyaW91cyBhY2NvdW50IGhvbGRlciBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGZpbmFuY2lhbCBpbnN0aXR1dGlvbiwgaW5jbHVkaW5nIG5hbWVzLCBlbWFpbHMsIHBob25lIG51bWJlcnMsIGFuZCBhZGRyZXNzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIElkZW50aXR5IGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pZGVudGl0eS9tYXRjaGAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgbWF0Y2ggc2NvcmUsIHdoaWNoIGluZGljYXRlcyBob3cgd2VsbCB0aGUgcHJvdmlkZWQgaWRlbnRpdHkgZGF0YSBtYXRjaGVzIHRoZSBpZGVudGl0eSBpbmZvcm1hdGlvbiBvbiBmaWxlIHdpdGggdGhlIGFjY291bnQgaG9sZGVyXFwncyBmaW5hbmNpYWwgaW5zdGl0dXRpb24uICBGaWVsZHMgd2l0aGluIHRoZSBgYmFsYW5jZXNgIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBudWxsIHdoZW4gcmV0cmlldmVkIGJ5IGAvaWRlbnRpdHkvbWF0Y2hgLiBJbnN0ZWFkLCB1c2UgdGhlIGZyZWUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IHRvIHJlcXVlc3QgYmFsYW5jZSBjYWNoZWQgZGF0YSwgb3IgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZm9yIHJlYWwtdGltZSBkYXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0fSBwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvcklkZW50aXR5TWF0Y2gocHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3Q6IFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyB0aGUgc3RvY2sgcG9zaXRpb24gZGF0YSBvZiB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBwcm9jZXNzb3IgdG9rZW4uIFxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogUHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJldHJpZXZlIHVwIHRvIDI0IG1vbnRocyBvZiB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgdGhlIGludmVzdG1lbnQgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3NvciB0b2tlbi4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY291bnQsIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgY291bnQgYW5kIG9mZnNldCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF9pbnZlc3RtZW50X3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zLiAgTm90ZSB0aGF0IEludmVzdG1lbnRzIGRvZXMgbm90IGhhdmUgYSB3ZWJob29rIHRvIGluZGljYXRlIHdoZW4gaW5pdGlhbCB0cmFuc2FjdGlvbiBkYXRhIGhhcyBsb2FkZWQgKHVubGVzcyB5b3UgdXNlIHRoZSBgYXN5bmNfdXBkYXRlYCBvcHRpb24pLiBJbnN0ZWFkLCBpZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbW1lZGlhdGVseSBhZnRlciBMaW5rIG1heSB0YWtlIHVwIHRvIG9uZSB0byB0d28gbWludXRlcyB0byByZXR1cm4uICBEYXRhIHJldHVybmVkIGJ5IHRoZSBhc3luY2hyb25vdXMgaW52ZXN0bWVudHMgZXh0cmFjdGlvbiBmbG93ICh3aGVuIGBhc3luY191cGRhdGVgIGlzIHNldCB0byB0cnVlKSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRoZSBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIGBISVNUT1JJQ0FMX1VQREFURWAgd2ViaG9vay4gSWYgbm8gaW52ZXN0bWVudHMgaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBJbnZlc3RtZW50cyBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYSBsb2FuIG9yIGNyZWRpdCBhY2NvdW50LiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGlhYmlsaXRpZXMgZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdH0gcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQWZ0ZXIgY2FsbGluZyBgL3Byb2Nlc3Nvci9zaWduYWwvZXZhbHVhdGVgLCBjYWxsIGAvcHJvY2Vzc29yL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgW1BsYWlkIFRyYW5zZmVyIHByb2R1Y3RdKGh0dHBzOi8vd3d3LnBsYWlkLmNvbS9kb2NzL3RyYW5zZmVyKSB0byBjcmVhdGUgdHJhbnNmZXJzLCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGVuZHBvaW50LCBhcyBQbGFpZCBhbHJlYWR5IGtub3dzIHdoZXRoZXIgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCB3aGV0aGVyIHlvdSBpbml0aWF0ZWQgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIGFzIGEgcHJvY2Vzc29yIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBpcyBjYWxsZWQgb24gdGhlIHNhbWUgdHJhbnNhY3Rpb24gbXVsdGlwbGUgdGltZXMgd2l0aGluIGEgMjQtaG91ciBwZXJpb2QsIGNhY2hlZCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHJlZmVyIHRvIG91ciBlcnJvciBkb2N1bWVudGF0aW9uIG9uIFtpdGVtIGVycm9yc10oL2RvY3MvZXJyb3JzL2l0ZW0vKSBhbmQgW0xpbmsgaW4gVXBkYXRlIE1vZGVdKC9kb2NzL2xpbmsvdXBkYXRlLW1vZGUvKS4gIE5vdGU6IFRoaXMgcmVxdWVzdCBtYXkgdGFrZSBzb21lIHRpbWUgdG8gY29tcGxldGUgaWYgU2lnbmFsIGlzIGJlaW5nIGFkZGVkIHRvIGFuIGV4aXN0aW5nIEl0ZW0uIFRoaXMgaXMgYmVjYXVzZSBQbGFpZCBtdXN0IGNvbW11bmljYXRlIGRpcmVjdGx5IHdpdGggdGhlIGluc3RpdHV0aW9uIHdoZW4gcmV0cmlldmluZyB0aGUgZGF0YSBmb3IgdGhlIGZpcnN0IHRpbWUuIFRvIHJlZHVjZSB0aGlzIGxhdGVuY3ksIHlvdSBjYW4gY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCBvbiB0aGUgSXRlbSBiZWZvcmUgeW91IG5lZWQgdG8gcmVxdWVzdCBTaWduYWwgZGF0YS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yU2lnbmFsRXZhbHVhdGUocHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBPcHQtaW4gYSBwcm9jZXNzb3IgdG9rZW4gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxQcmVwYXJlKHByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gcHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBQcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqICBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIFN0cmlwZSB0byBlbmFibGUgUGxhaWQtU3RyaXBlIGludGVncmF0aW9ucy4gRm9yIGEgZGV0YWlsZWQgZ3VpZGUgb24gaW50ZWdyYXRpbmcgU3RyaXBlLCBzZWUgW0FkZCBTdHJpcGUgdG8geW91ciBhcHBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9wYXJ0bmVyc2hpcHMvc3RyaXBlLykuICBOb3RlIHRoYXQgdGhlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW4gaXMgYSBvbmUtdGltZSB1c2UgdG9rZW4uIFRvIHN0b3JlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBmb3IgbGF0ZXIgdXNlLCB5b3UgY2FuIHVzZSBhIFN0cmlwZSBjdXN0b21lciBvYmplY3QgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbiwgb3IgeW91IGNhbiB1c2UgYSBTdHJpcGUgQ3VzdG9tIGFjY291bnQgYW5kIGNyZWF0ZSBhbiBhc3NvY2lhdGVkIGV4dGVybmFsIGJhbmsgYWNjb3VudCBmcm9tIHRoZSB0b2tlbi4gVGhpcyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gc2hvdWxkIHdvcmsgaW5kZWZpbml0ZWx5LCB1bmxlc3MgdGhlIHVzZXJcXCdzIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjaGFuZ2VzIG9yIHRoZXkgcmV2b2tlIFBsYWlkXFwncyBwZXJtaXNzaW9ucyB0byBhY2Nlc3MgdGhlaXIgYWNjb3VudC4gU3RyaXBlIGJhbmsgYWNjb3VudCBpbmZvcm1hdGlvbiBjYW5ub3QgYmUgbW9kaWZpZWQgb25jZSB0aGUgYmFuayBhY2NvdW50IHRva2VuIGhhcyBiZWVuIGNyZWF0ZWQuIElmIHlvdSBldmVyIG5lZWQgdG8gY2hhbmdlIHRoZSBiYW5rIGFjY291bnQgZGV0YWlscyB1c2VkIGJ5IFN0cmlwZSBmb3IgYSBzcGVjaWZpYyBjdXN0b21lciwgaGF2ZSB0aGUgdXNlciBnbyB0aHJvdWdoIExpbmsgYWdhaW4gYW5kIGNyZWF0ZSBhIG5ldyBiYW5rIGFjY291bnQgdG9rZW4gZnJvbSB0aGUgbmV3IGBhY2Nlc3NfdG9rZW5gLiAgVG8gcmV2b2tlIGEgYmFuayBhY2NvdW50IHRva2VuLCB0aGUgZW50aXJlIHVuZGVybHlpbmcgYWNjZXNzIHRva2VuIG11c3QgYmUgcmV2b2tlZCB1c2luZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlKHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2VkIHRvIGNyZWF0ZSBhIHRva2VuIHN1aXRhYmxlIGZvciBzZW5kaW5nIHRvIG9uZSBvZiBQbGFpZFxcJ3MgcGFydG5lcnMgdG8gZW5hYmxlIGludGVncmF0aW9ucy4gTm90ZSB0aGF0IFN0cmlwZSBwYXJ0bmVyc2hpcHMgdXNlIGJhbmsgYWNjb3VudCB0b2tlbnMgaW5zdGVhZDsgc2VlIGAvcHJvY2Vzc29yL3N0cmlwZS9iYW5rX2FjY291bnRfdG9rZW4vY3JlYXRlYCBmb3IgY3JlYXRpbmcgdG9rZW5zIGZvciB1c2Ugd2l0aCBTdHJpcGUgaW50ZWdyYXRpb25zLiBJZiB1c2luZyBtdWx0aXBsZSBwcm9jZXNzb3JzLCBtdWx0aXBsZSBkaWZmZXJlbnQgcHJvY2Vzc29yIHRva2VucyBjYW4gYmUgY3JlYXRlZCBmb3IgYSBzaW5nbGUgYWNjZXNzIHRva2VuLiBPbmNlIGNyZWF0ZWQsIGEgcHJvY2Vzc29yIHRva2VuIGZvciBhIGdpdmVuIEl0ZW0gY2Fubm90IGJlIG1vZGlmaWVkIG9yIHVwZGF0ZWQuIFRvIHJldm9rZSB0aGUgcHJvY2Vzc29yXFwncyBhY2Nlc3MsIHRoZSBlbnRpcmUgSXRlbSBtdXN0IGJlIGRlbGV0ZWQgYnkgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgcHJvY2Vzc29yIHRva2VuXFwncyBwcm9kdWN0IHBlcm1pc3Npb25zXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3R9IHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdDogUHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICAgICAqIEBzdW1tYXJ5IENvbnRyb2wgYSBwcm9jZXNzb3JcXCdzIGFjY2VzcyB0byBwcm9kdWN0c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGEgcHJvY2Vzc29yIHRva2VuXFwncyB3ZWJob29rIFVSTFxuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3R9IHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdDogUHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4sIHJlc3VsdHMgYXJlIHBhZ2luYXRlZC4gTWFuaXB1bGF0ZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfdHJhbnNhY3Rpb25zYCByZXNwb25zZSBib2R5IGZpZWxkIHRvIGZldGNoIGFsbCBhdmFpbGFibGUgdHJhbnNhY3Rpb25zLiAgRGF0YSByZXR1cm5lZCBieSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIHByb2Nlc3NvciB0b2tlbiBhcyBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucy4gUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IGRhdGEgbXVsdGlwbGUgdGltZXMgYSBkYXksIGJ1dCB0aGVzZSBjaGVja3MgbWF5IG9jY3VyIGxlc3MgZnJlcXVlbnRseSwgc3VjaCBhcyBvbmNlIGEgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmb3JjZSBQbGFpZCB0byBjaGVjayBmb3IgbmV3IHRyYW5zYWN0aW9ucywgeW91IGNhbiB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGlmIGl0IHdhc25cXCd0LiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgaXMgY2FsbGVkLCBpdCB3aWxsIHJldHVybiBhIGBQUk9EVUNUX05PVF9SRUFEWWAgZXJyb3IuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhIHByb2Nlc3NvciB0b2tlbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBUcmFuc2FjdGlvbnMgKGVpdGhlciBkdXJpbmcgTGluaywgYnkgc3BlY2lmeWluZyBpdCBpbiBgL2xpbmsvdG9rZW4vY3JlYXRlYDsgb3IgYWZ0ZXIgTGluaywgYnkgY2FsbGluZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2ApLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgdG8gcmVjZWl2ZSB0aGUgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyBzdHJlYW1zIGFuZCBzdWJzY3JpYmUgdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rLiBUbyBrbm93IHdoZW4gaGlzdG9yaWNhbCB0cmFuc2FjdGlvbnMgaGF2ZSBiZWVuIGZldGNoZWQsIGlmIHlvdSBhcmUgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhdCBhbnkgcG9pbnQgaW4gdGhlIGZ1dHVyZSB0byByZXRyaWV2ZSB0aGUgbGF0ZXN0IHN1bW1hcnkgb2YgcmVjdXJyaW5nIHN0cmVhbXMuIExpc3RlbiB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2sgdG8gYmUgbm90aWZpZWQgd2hlbiBuZXcgdXBkYXRlcyBhcmUgYXZhaWxhYmxlLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2gocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcgZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdH0gcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0OiBQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxQcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmMocHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci5cbiAgICAgICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAgICAgKiBAcGFyYW0ge1Byb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdH0gcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgcHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0OiBQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8UHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAucHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua19pbmNvbWUvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBJbmNvbWUgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIGJhbmsgaW5jb21lIHdlYmhvb2sgaW4gc2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2JhbmtfdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgQmFuayBUcmFuc2ZlcnMgd2ViaG9vayBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIEJhbmsgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rKHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBiYW5rIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvY3JhL2Nhc2hmbG93X3VwZGF0ZXMvdXBkYXRlYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGFuIHVwZGF0ZSBmb3IgY2FzaGZsb3cgdXBkYXRlcyAoTW9uaXRvcmluZykgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgYW4gdXBkYXRlIGZvciBDYXNoZmxvdyBVcGRhdGVzXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3R9IHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZShzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdDogU2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvaW5jb21lL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIFBheXJvbGwgb3IgRG9jdW1lbnQgSW5jb21lIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEluY29tZUZpcmVXZWJob29rKHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEluY29tZUZpcmVXZWJob29rUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgaXMgdXNlZCB0byB0ZXN0IHRoYXQgY29kZSBjb3JyZWN0bHkgaGFuZGxlcyB3ZWJob29rcy4gVGhpcyBlbmRwb2ludCBjYW4gdHJpZ2dlciB0aGUgZm9sbG93aW5nIHdlYmhvb2tzOiAgYERFRkFVTFRfVVBEQVRFYDogV2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0gc2ltdWxhdGluZyBhIGRlZmF1bHQgdXBkYXRlIGV2ZW50IGZvciB0aGUgcmVzcGVjdGl2ZSBwcm9kdWN0IGFzIHNwZWNpZmllZCB3aXRoIHRoZSBgd2ViaG9va190eXBlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBWYWxpZCBTYW5kYm94IGBERUZBVUxUX1VQREFURWAgd2ViaG9vayB0eXBlcyBpbmNsdWRlOiBgQVVUSGAsIGBJREVOVElUWWAsIGBUUkFOU0FDVElPTlNgLCBgSU5WRVNUTUVOVFNfVFJBTlNBQ1RJT05TYCwgYExJQUJJTElUSUVTYCwgYEhPTERJTkdTYC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgcHJvZHVjdCwgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBORVdfQUNDT1VOVFNfQVZBSUxBQkxFYDogRmlyZWQgdG8gaW5kaWNhdGUgdGhhdCBhIG5ldyBhY2NvdW50IGlzIGF2YWlsYWJsZSBvbiB0aGUgSXRlbSBhbmQgeW91IGNhbiBsYXVuY2ggdXBkYXRlIG1vZGUgdG8gcmVxdWVzdCBhY2Nlc3MgdG8gaXQuICBgU01TX01JQ1JPREVQT1NJVFNfVkVSSUZJQ0FUSU9OYDogRmlyZWQgd2hlbiBhIGdpdmVuIHNhbWUgZGF5IG1pY3JvLWRlcG9zaXQgaXRlbSBpcyB2ZXJpZmllZCB2aWEgU01TIHZlcmlmaWNhdGlvbi4gIGBMT0dJTl9SRVBBSVJFRGA6IEZpcmVkIHdoZW4gYW4gSXRlbSByZWNvdmVycyBmcm9tIHRoZSBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2l0aG91dCB0aGUgdXNlciBnb2luZyB0aHJvdWdoIHVwZGF0ZSBtb2RlIGluIHlvdXIgYXBwLiAgYFBFTkRJTkdfRElTQ09OTkVDVGA6IEZpcmVkIHdoZW4gYW4gSXRlbSB3aWxsIHN0b3Agd29ya2luZyBpbiB0aGUgbmVhciBmdXR1cmUgKGUuZy4gZHVlIHRvIGEgcGxhbm5lZCBiYW5rIG1pZ3JhdGlvbikgYW5kIG11c3QgYmUgc2VudCB0aHJvdWdoIHVwZGF0ZSBtb2RlIHRvIGNvbnRpbnVlIHdvcmtpbmcuICAgYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYDogUmVjdXJyaW5nIFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgOiBUcmFuc2FjdGlvbnMgd2ViaG9vayB0byBiZSBmaXJlZCBmb3IgYSBnaXZlbiBTYW5kYm94IEl0ZW0uICBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFRyYW5zYWN0aW9ucywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBQUk9EVUNUX1JFQURZYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhIGdpdmVuIGFzc2V0IHJlcG9ydCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBFUlJPUmA6IEFzc2V0cyB3ZWJob29rIHRvIGJlIGZpcmVkIHdoZW4gYXNzZXQgcmVwb3J0IGdlbmVyYXRpb24gaGFzIGZhaWxlZC4gSWYgdGhlIEl0ZW0gZG9lcyBub3Qgc3VwcG9ydCBBc3NldHMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgVVNFUl9QRVJNSVNTSU9OX1JFVk9LRURgOiBJbmRpY2F0ZXMgYW4gZW5kIHVzZXIgaGFzIHJldm9rZWQgdGhlIHBlcm1pc3Npb24gdGhhdCB0aGV5IHByZXZpb3VzbHkgZ3JhbnRlZCB0byBhY2Nlc3MgYW4gSXRlbS4gTWF5IG5vdCBhbHdheXMgZmlyZSB1cG9uIHJldm9jYXRpb24sIGFzIHNvbWUgaW5zdGl0dXRpb25z4oCZIGNvbnNlbnQgcG9ydGFscyBkbyBub3QgdHJpZ2dlciB0aGlzIHdlYmhvb2suIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgYFVTRVJfQUNDT1VOVF9SRVZPS0VEYDogRmlyZWQgd2hlbiBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCBhY2Nlc3MgdG8gdGhlaXIgYWNjb3VudCBvbiB0aGUgRGF0YSBQcm92aWRlclxcJ3MgcG9ydGFsLiBUaGlzIHdlYmhvb2sgaXMgY3VycmVudGx5IHNlbnQgb25seSBmb3IgQ2hhc2UgYW5kIFBOQyBJdGVtcywgYnV0IG1heSBiZSBzZW50IGluIHRoZSBmdXR1cmUgZm9yIG90aGVyIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMuIFVwb24gcmVjZWl2aW5nIHRoaXMgd2ViaG9vaywgaXQgaXMgcmVjb21tZW5kZWQgdG8gZGVsZXRlIGFueSBzdG9yZWQgZGF0YSBmcm9tIFBsYWlkIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjb3VudCBvciBJdGVtLiAgTm90ZSB0aGF0IHRoaXMgZW5kcG9pbnQgaXMgcHJvdmlkZWQgZm9yIGRldmVsb3BlciBlYXNlLW9mLXVzZSBhbmQgaXMgbm90IHJlcXVpcmVkIGZvciB0ZXN0aW5nIHdlYmhvb2tzOyB3ZWJob29rcyB3aWxsIGFsc28gZmlyZSBpbiBTYW5kYm94IHVuZGVyIHRoZSBzYW1lIGNvbmRpdGlvbnMgdGhhdCB0aGV5IHdvdWxkIGluIFByb2R1Y3Rpb24gKGV4Y2VwdCBmb3Igd2ViaG9va3Mgb2YgdHlwZSBgVFJBTlNGRVJgKS5cbiAgICAgICAgICogQHN1bW1hcnkgRmlyZSBhIHRlc3Qgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luL2AgZm9yY2VzIGFuIEl0ZW0gaW50byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgc3RhdGUgaW4gb3JkZXIgdG8gc2ltdWxhdGUgYW4gSXRlbSB3aG9zZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmbG93IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIFlvdSBjYW4gdGhlbiB1c2UgUGxhaWQgTGluayB1cGRhdGUgbW9kZSB0byByZXN0b3JlIHRoZSBJdGVtIHRvIGEgZ29vZCBzdGF0ZS4gQW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHdlYmhvb2sgd2lsbCBhbHNvIGJlIGZpcmVkIGFmdGVyIGEgY2FsbCB0byB0aGlzIGVuZHBvaW50LCBpZiBvbmUgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJdGVtLiAgIEluIHRoZSBTYW5kYm94LCBJdGVtcyB3aWxsIHRyYW5zaXRpb24gdG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIGVycm9yIHN0YXRlIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgMzAgZGF5cywgZXZlbiBpZiB0aGlzIGVuZHBvaW50IGlzIG5vdCBjYWxsZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZvcmNlIGEgU2FuZGJveCBJdGVtIGludG8gYW4gZXJyb3Igc3RhdGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveEl0ZW1SZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtUmVzZXRMb2dpbihzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNldCB2ZXJpZmljYXRpb24gc3RhdHVzIGZvciBTYW5kYm94IGFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3R9IHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdDogU2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgICAgICogQHN1bW1hcnkgU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8eyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzKHNhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXNldCB0aGUgbG9naW4gb2YgYSBQYXltZW50IFByb2ZpbGVcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdH0gc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0OiBTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW4oc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHBheW1lbnQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQYXltZW50U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFBheW1lbnRTaW11bGF0ZShzYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgSXRlbSBhbmQgcHJvY2Vzc29yIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwdWJsaWNfdG9rZW5gICBmb3IgYW4gYXJiaXRyYXJ5IGluc3RpdHV0aW9uIElELCBpbml0aWFsIHByb2R1Y3RzLCBhbmQgdGVzdCBjcmVkZW50aWFscy4gVGhlIGNyZWF0ZWQgYHB1YmxpY190b2tlbmAgbWFwcyB0byBhIG5ldyBTYW5kYm94IEl0ZW0uIFlvdSBjYW4gdGhlbiBjYWxsIGAvaXRlbS9wdWJsaWNfdG9rZW4vZXhjaGFuZ2VgIHRvIGV4Y2hhbmdlIHRoZSBgcHVibGljX3Rva2VuYCBmb3IgYW4gYGFjY2Vzc190b2tlbmAgYW5kIHBlcmZvcm0gYWxsIEFQSSBhY3Rpb25zLiBgL3NhbmRib3gvcHVibGljX3Rva2VuL2NyZWF0ZWAgY2FuIGFsc28gYmUgdXNlZCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEsIG9yIHdpdGggUGxhaWRcXCdzIFtwcmUtcG9wdWxhdGVkIFNhbmRib3ggdGVzdCBhY2NvdW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3Rlc3QtY3JlZGVudGlhbHMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdH0gc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZShzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0OiBTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2ZpcmVfd2ViaG9va2AgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhIGBUUkFOU0ZFUl9FVkVOVFNfVVBEQVRFYCB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBNYW51YWxseSBmaXJlIGEgVHJhbnNmZXIgd2ViaG9va1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL2RlcG9zaXQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9sZWRnZXIvc2ltdWxhdGVfYXZhaWxhYmxlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZSBmb3IgYWxsIG9yaWdpbmF0b3JzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjb252ZXJ0aW5nIHBlbmRpbmcgYmFsYW5jZSB0byBhdmFpbGFibGUgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciB3aXRoZHJhdyBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3JlZnVuZC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSByZWZ1bmQgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBUcmlnZ2VyIHRoZSBjcmVhdGlvbiBvZiBhIHJlcGF5bWVudFxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBvciBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgLCBubyB0cmFuc2FjdGlvbnMgd2lsbCBhY3R1YWxseSB0YWtlIHBsYWNlIGFuZCBmdW5kcyB3aWxsIG5vdCBtb3ZlIGJldHdlZW4gYWNjb3VudHMsIGV2ZW4gd2l0aGluIHRoZSBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHRyYW5zZmVyIGV2ZW50IGluIFNhbmRib3hcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3N3ZWVwL3NpbXVsYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBzd2VlcCBhbmQgYXNzb2NpYXRlZCBldmVudHMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuIFVwb24gY2FsbGluZyB0aGlzIGVuZHBvaW50LCBhbGwgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRfc2V0dGxlZGAsIGFsbCBgcG9zdGVkYCBvciBgcGVuZGluZ2AgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHVuc3dlcHRgIHdpbGwgYmVjb21lIGBzd2VwdGAsIGFuZCBhbGwgYHJldHVybmVkYCB0cmFuc2ZlcnMgd2l0aCBhIHN3ZWVwIHN0YXR1cyBvZiBgc3dlcHRgIHdpbGwgYmVjb21lIGByZXR1cm5fc3dlcHRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9hZHZhbmNlYCBlbmRwb2ludCB0byBhZHZhbmNlIGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgQSB0ZXN0IGNsb2NrIG9iamVjdCByZXByZXNlbnRzIGFuIGluZGVwZW5kZW50IHRpbWVsaW5lIGFuZCBoYXMgYSBgdmlydHVhbF90aW1lYCBmaWVsZCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBvZiB0aGUgdGltZWxpbmUuIEEgdGVzdCBjbG9jayBjYW4gYmUgYWR2YW5jZWQgYnkgaW5jcmVtZW50aW5nIGB2aXJ0dWFsX3RpbWVgLCBidXQgbWF5IG5ldmVyIGdvIGJhY2sgdG8gYSBsb3dlciBgdmlydHVhbF90aW1lYC4gIElmIGEgdGVzdCBjbG9jayBpcyBhZHZhbmNlZCwgd2Ugd2lsbCBzaW11bGF0ZSB0aGUgY2hhbmdlcyB0aGF0IG91Z2h0IHRvIG9jY3VyIGR1cmluZyB0aGUgdGltZSB0aGF0IGVsYXBzZWQuICBGb3IgZXhhbXBsZSwgYSBjbGllbnQgY3JlYXRlcyBhIHdlZWtseSByZWN1cnJpbmcgdHJhbnNmZXIgd2l0aCBhIHRlc3QgY2xvY2sgc2V0IGF0IHQuIFdoZW4gdGhlIGNsaWVudCBhZHZhbmNlcyB0aGUgdGVzdCBjbG9jayBieSBzZXR0aW5nIGB2aXJ0dWFsX3RpbWVgID0gdCArIDE1IGRheXMsIDIgbmV3IG9yaWdpbmF0aW9ucyBzaG91bGQgYmUgY3JlYXRlZCwgYWxvbmcgd2l0aCB0aGUgd2ViaG9vayBldmVudHMuICBUaGUgYWR2YW5jZW1lbnQgb2YgdGhlIHRlc3QgY2xvY2sgZnJvbSBpdHMgY3VycmVudCBgdmlydHVhbF90aW1lYCBzaG91bGQgYmUgbGltaXRlZCBzdWNoIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgdGhhbiAyMCBvcmlnaW5hdGlvbnMgcmVzdWx0aW5nIGZyb20gdGhlIGFkdmFuY2Ugb3BlcmF0aW9uIG9uIGVhY2ggYHJlY3VycmluZ190cmFuc2ZlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBgdGVzdF9jbG9ja2AuICBGb3IgZXhhbXBsZSwgaWYgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZXN0IGNsb2NrIG9yaWdpbmF0ZXMgb25jZSBldmVyeSA0IHdlZWtzLCB5b3UgY2FuIGFkdmFuY2UgdGhlIGB2aXJ0dWFsX3RpbWVgIHVwIHRvIDgwIHdlZWtzIG9uIGVhY2ggQVBJIGNhbGwuXG4gICAgICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBUZXN0IGNsb2NrcyBhcmUgdXNlZCBmb3IgdGVzdGluZyByZWN1cnJpbmcgdHJhbnNmZXJzIGluIFNhbmRib3guICBBIHRlc3QgY2xvY2sgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCB1cCB0byA1IHJlY3VycmluZyB0cmFuc2ZlcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0fSBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3Q6IFNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvdGVzdF9jbG9jay9nZXRgIGVuZHBvaW50IHRvIGdldCBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGEgdGVzdCBjbG9ja1xuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdGVzdCBjbG9ja3NcbiAgICAgICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3Qoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbi9gIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIGJ1dCB3aWxsIG1vZGlmeSBJdGVtcyByZWxhdGVkIHRvIGEgVXNlci4gVGhpcyBlbmRwb2ludCBmb3JjZXMgZWFjaCBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgICAgICogQHN1bW1hcnkgRm9yY2UgaXRlbShzKSBmb3IgYSBTYW5kYm94IFVzZXIgaW50byBhbiBlcnJvciBzdGF0ZVxuICAgICAgICAgKiBAcGFyYW0ge1NhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTYW5kYm94VXNlclJlc2V0TG9naW5SZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBZnRlciBjYWxsaW5nIGAvc2lnbmFsL2V2YWx1YXRlYCwgY2FsbCBgL3NpZ25hbC9kZWNpc2lvbi9yZXBvcnRgIHRvIHJlcG9ydCB3aGV0aGVyIHRoZSB0cmFuc2FjdGlvbiB3YXMgaW5pdGlhdGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdH0gc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0OiBTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsRGVjaXNpb25SZXBvcnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsRGVjaXNpb25SZXBvcnQoc2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gdGhlIGVycm9yIGRvY3VtZW50YXRpb24gb24gW0l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbEV2YWx1YXRlUmVxdWVzdH0gc2lnbmFsRXZhbHVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0OiBTaWduYWxFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsRXZhbHVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogV2hlbiBhbiBJdGVtIGlzIG5vdCBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgY2FsbCBgL3NpZ25hbC9wcmVwYXJlYCB0byBvcHQtaW4gdGhhdCBJdGVtIHRvIHRoZSBTaWduYWwgZGF0YSBjb2xsZWN0aW9uIHByb2Nlc3MsIGRldmVsb3BpbmcgYSBTaWduYWwgc2NvcmUuIFRoaXMgc2hvdWxkIGJlIGRvbmUgb24gSXRlbXMgd2hlcmUgU2lnbmFsIHdhcyBhZGRlZCBpbiB0aGUgYGFkZGl0aW9uYWxfY29uc2VudGVkX3Byb2R1Y3RzYCBhcnJheSBidXQgbm90IGluIHRoZSBgcHJvZHVjdHNgLCBgb3B0aW9uYWxfcHJvZHVjdHNgLCBvciBgcmVxdWlyZWRfaWZfc3VwcG9ydGVkX3Byb2R1Y3RzYCBhcnJheS4gSWYgYC9zaWduYWwvcHJlcGFyZWAgaXMgc2tpcHBlZCBvbiBhbiBJdGVtIHRoYXQgaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCB0aGUgaW5pdGlhbCBjYWxsIHRvIGAvc2lnbmFsL2V2YWx1YXRlYCBvbiB0aGF0IEl0ZW0gd2lsbCBiZSBsZXNzIGFjY3VyYXRlLCBiZWNhdXNlIFNpZ25hbCB3aWxsIGhhdmUgYWNjZXNzIHRvIGxlc3MgZGF0YSBmb3IgY29tcHV0aW5nIHRoZSBTaWduYWwgc2NvcmUuICBJZiBydW4gb24gYW4gSXRlbSB0aGF0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIHRoaXMgZW5kcG9pbnQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgSXRlbS5cbiAgICAgICAgICogQHN1bW1hcnkgT3B0LWluIGFuIEl0ZW0gdG8gU2lnbmFsXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsUHJlcGFyZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ2FsbCB0aGUgYC9zaWduYWwvcmV0dXJuL3JlcG9ydGAgZW5kcG9pbnQgdG8gcmVwb3J0IGEgcmV0dXJuZWQgdHJhbnNhY3Rpb24gdGhhdCB3YXMgcHJldmlvdXNseSBzZW50IHRvIHRoZSBgL3NpZ25hbC9ldmFsdWF0ZWAgZW5kcG9pbnQuIFlvdXIgZmVlZGJhY2sgd2lsbCBiZSB1c2VkIGJ5IHRoZSBtb2RlbCB0byBpbmNvcnBvcmF0ZSB0aGUgbGF0ZXN0IHJpc2sgdHJlbmQgaW4geW91ciBwb3J0Zm9saW8uXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlcG9ydCBhIHJldHVybiBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFNpZ25hbFJldHVyblJlcG9ydFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zaWduYWxSZXR1cm5SZXBvcnQoc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSBgL3NpZ25hbC9zY2hlZHVsZWAgdG8gc2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbi5cbiAgICAgICAgICogQHN1bW1hcnkgU2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1NpZ25hbFNjaGVkdWxlUmVxdWVzdH0gc2lnbmFsU2NoZWR1bGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc2lnbmFsU2NoZWR1bGUoc2lnbmFsU2NoZWR1bGVSZXF1ZXN0OiBTaWduYWxTY2hlZHVsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U2lnbmFsU2NoZWR1bGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc2lnbmFsU2NoZWR1bGUoc2lnbmFsU2NoZWR1bGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9kb3dubG9hZGAgZW5kcG9pbnQgcmV0cmlldmVzIGEgc2luZ2xlIHN0YXRlbWVudCBQREYgaW4gYmluYXJ5IGZvcm1hdC4gIFRoZSByZXNwb25zZSB3aWxsIGNvbnRhaW4gYSBgUGxhaWQtQ29udGVudC1IYXNoYCBoZWFkZXIgY29udGFpbmluZyBhIFNIQSAyNTYgY2hlY2tzdW0gb2YgdGhlIHN0YXRlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCB0aGUgZmlsZSBiZWluZyBzZW50IGJ5IFBsYWlkIGlzIHRoZSBzYW1lIGZpbGUgdGhhdCB3YXMgZG93bmxvYWRlZCB0byB5b3VyIHN5c3RlbS5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzaW5nbGUgc3RhdGVtZW50LlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3R9IHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvc3RhdGVtZW50cy9saXN0YCBlbmRwb2ludCByZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0uXG4gICAgICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICBzdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxTdGF0ZW1lbnRzTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC5zdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3N0YXRlbWVudHMvcmVmcmVzaGAgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBzdGF0ZW1lbnRzIGZvciB0aGUgcHJvdmlkZWQgZGF0ZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNSZWZyZXNoUmVxdWVzdH0gc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0OiBTdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8U3RhdGVtZW50c1JlZnJlc2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAuc3RhdGVtZW50c1JlZnJlc2goc3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBlbmhhbmNlIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNFbmhhbmNlKHRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEVucmljaCBsb2NhbGx5LWhlbGQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VucmljaFJlcXVlc3R9IHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdDogVHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNFbnJpY2hSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBOb3RlOiBBbGwgbmV3IGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byB1c2UgYC90cmFuc2FjdGlvbnMvc3luY2AgcmF0aGVyIHRoYW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gYC90cmFuc2FjdGlvbnMvc3luY2AgcHJvdmlkZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBgL3RyYW5zYWN0aW9ucy9nZXRgIGFuZCBpbXByb3ZlcyBkZXZlbG9wZXIgZWFzZS1vZi11c2UgZm9yIGhhbmRsaW5nIHRyYW5zYWN0aW9ucyB1cGRhdGVzLiAgVGhlIGAvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSB1c2VyLWF1dGhvcml6ZWQgdHJhbnNhY3Rpb24gZGF0YSBmb3IgY3JlZGl0LCBkZXBvc2l0b3J5LCBhbmQgc29tZSBsb2FuLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgOyBjb3ZlcmFnZSBtYXkgYmUgbGltaXRlZCkuIEZvciB0cmFuc2FjdGlvbiBoaXN0b3J5IGZyb20gaW52ZXN0bWVudHMgYWNjb3VudHMsIHVzZSB0aGUgW0ludmVzdG1lbnRzIGVuZHBvaW50XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8pIGluc3RlYWQuIFRyYW5zYWN0aW9uIGRhdGEgaXMgc3RhbmRhcmRpemVkIGFjcm9zcyBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCBhbmQgaW4gbWFueSBjYXNlcyB0cmFuc2FjdGlvbnMgYXJlIGxpbmtlZCB0byBhIGNsZWFuIG5hbWUsIGVudGl0eSB0eXBlLCBsb2NhdGlvbiwgYW5kIGNhdGVnb3J5LiBTaW1pbGFybHksIGFjY291bnQgZGF0YSBpcyBzdGFuZGFyZGl6ZWQgYW5kIHJldHVybmVkIHdpdGggYSBjbGVhbiBuYW1lLCBudW1iZXIsIGJhbGFuY2UsIGFuZCBvdGhlciBtZXRhIGluZm9ybWF0aW9uIHdoZXJlIGF2YWlsYWJsZS4gIFRyYW5zYWN0aW9ucyBhcmUgcmV0dXJuZWQgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLCBhbmQgdGhlIHNlcXVlbmNlIG9mIHRyYW5zYWN0aW9uIG9yZGVyaW5nIGlzIHN0YWJsZSBhbmQgd2lsbCBub3Qgc2hpZnQuICBUcmFuc2FjdGlvbnMgYXJlIG5vdCBpbW11dGFibGUgYW5kIGNhbiBhbHNvIGJlIHJlbW92ZWQgYWx0b2dldGhlciBieSB0aGUgaW5zdGl0dXRpb247IGEgcmVtb3ZlZCB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhcHBlYXIgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YC4gIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGVuZGluZyBhbmQgcG9zdGVkIHRyYW5zYWN0aW9uc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvdHJhbnNhY3Rpb25zLWRhdGEvI3BlbmRpbmctYW5kLXBvc3RlZC10cmFuc2FjdGlvbnMpLiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC90cmFuc2FjdGlvbnMvZ2V0YCB3aWxsIGJlIHRoZSBkYXRhIGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZmluZCBvdXQgd2hlbiB0aGUgSXRlbSB3YXMgbGFzdCB1cGRhdGVkLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIE5vdGUgdGhhdCBkYXRhIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvdHJhbnNhY3Rpb25zL2dldGAuIFBsYWlkIHdpbGwgYmVnaW4gdG8gcHJlcGFyZSB0cmFuc2FjdGlvbnMgZGF0YSB1cG9uIEl0ZW0gbGluaywgaWYgTGluayB3YXMgaW5pdGlhbGl6ZWQgd2l0aCBgdHJhbnNhY3Rpb25zYCwgb3IgdXBvbiB0aGUgZmlyc3QgY2FsbCB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gVG8gYmUgYWxlcnRlZCB3aGVuIHRyYW5zYWN0aW9uIGRhdGEgaXMgcmVhZHkgdG8gYmUgZmV0Y2hlZCwgbGlzdGVuIGZvciB0aGUgW2BJTklUSUFMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaW5pdGlhbF91cGRhdGUpIGFuZCBbYEhJU1RPUklDQUxfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNoaXN0b3JpY2FsX3VwZGF0ZSkgd2ViaG9va3MuIElmIG5vIHRyYW5zYWN0aW9uIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0dldFJlcXVlc3R9IHRyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNHZXQodHJhbnNhY3Rpb25zR2V0UmVxdWVzdDogVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmVjZWl2ZSBhIHN1bW1hcnkgb2YgdGhlIHJlY3VycmluZyBvdXRmbG93IGFuZCBpbmZsb3cgc3RyZWFtcyAoZXhwZW5zZXMgYW5kIGRlcG9zaXRzKSBmcm9tIGEgdXNlcuKAmXMgY2hlY2tpbmcsIHNhdmluZ3Mgb3IgY3JlZGl0IGNhcmQgYWNjb3VudHMuIEFkZGl0aW9uYWxseSwgUGxhaWQgcHJvdmlkZXMga2V5IGluc2lnaHRzIGFib3V0IGVhY2ggcmVjdXJyaW5nIHN0cmVhbSBpbmNsdWRpbmcgdGhlIGNhdGVnb3J5LCBtZXJjaGFudCwgbGFzdCBhbW91bnQsIGFuZCBtb3JlLiBEZXZlbG9wZXJzIGNhbiB1c2UgdGhlc2UgaW5zaWdodHMgdG8gYnVpbGQgdG9vbHMgYW5kIGV4cGVyaWVuY2VzIHRoYXQgaGVscCB0aGVpciB1c2VycyBiZXR0ZXIgbWFuYWdlIGNhc2ggZmxvdywgbW9uaXRvciBzdWJzY3JpcHRpb25zLCByZWR1Y2Ugc3BlbmQsIGFuZCBzdGF5IG9uIHRyYWNrIHdpdGggYmlsbCBwYXltZW50cy4gIFRoaXMgZW5kcG9pbnQgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuICBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAgb3IgYC90cmFuc2FjdGlvbnMvc3luY2ApLiAgIFdoZW4gdXNpbmcgUmVjdXJyaW5nIFRyYW5zYWN0aW9ucywgZm9yIGJlc3QgcmVzdWx0cywgbWFrZSBzdXJlIHRvIHVzZSB0aGUgW2BkYXlzX3JlcXVlc3RlZGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmstdG9rZW4tY3JlYXRlLXJlcXVlc3QtdHJhbnNhY3Rpb25zLWRheXMtcmVxdWVzdGVkKSBwYXJhbWV0ZXIgdG8gcmVxdWVzdCBhdCBsZWFzdCAxODAgZGF5cyBvZiBoaXN0b3J5IHdoZW4gaW5pdGlhbGl6aW5nIEl0ZW1zIHdpdGggVHJhbnNhY3Rpb25zLiBPbmNlIGFsbCBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgY2FsbCBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3RyYW5zYWN0aW9ucy9zeW5jYCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI1N5bmNVcGRhdGVzQXZhaWxhYmxlV2ViaG9vay1oaXN0b3JpY2FsLXVwZGF0ZS1jb21wbGV0ZSkgd2ViaG9vayBhbmQgY2hlY2sgdGhhdCB0aGUgYGhpc3RvcmljYWxfdXBkYXRlX2NvbXBsZXRlYCBmaWVsZCBpbiB0aGUgcGF5bG9hZCBpcyBgdHJ1ZWAuIElmIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIGxpc3RlbiBmb3IgdGhlIFtgSElTVE9SSUNBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2hpc3RvcmljYWxfdXBkYXRlKSB3ZWJob29rLiAgQWZ0ZXIgdGhlIGluaXRpYWwgY2FsbCwgeW91IGNhbiBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIHJlY3VycmluZyB0cmFuc2FjdGlvbiBzdHJlYW1zXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQodHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGUgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgVHJhbnNhY3Rpb25zIGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLiAgSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBvcHRpb25hbCBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSZWZyZXNoUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zYWN0aW9uc1JlZnJlc2godHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdHJhbnNhY3Rpb24gY2F0ZWdvcnkgcnVsZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL3J1bGVzL3YxL2xpc3RgIHJldHVybnMgYSBsaXN0IG9mIHRyYW5zYWN0aW9uIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXR1cm4gYSBsaXN0IG9mIHJ1bGVzIGNyZWF0ZWQgZm9yIHRoZSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgYWNjZXNzIHRva2VuLlxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNhY3Rpb25zUnVsZXNMaXN0KHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJlbW92ZSB0cmFuc2FjdGlvbiBydWxlXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0fSB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3Q6IFRyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvc3luY2AgZW5kcG9pbnQgcmV0cmlldmVzIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSBhbmQgY2FuIGZldGNoIHVwZGF0ZXMgdXNpbmcgYSBjdXJzb3IgdG8gdHJhY2sgd2hpY2ggdXBkYXRlcyBoYXZlIGFscmVhZHkgYmVlbiBzZWVuLiAgRm9yIGltcG9ydGFudCBpbnN0cnVjdGlvbnMgb24gaW50ZWdyYXRpbmcgd2l0aCBgL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvdHJhbnNhY3Rpb25zL2dldGAsIHNlZSB0aGUgW1RyYW5zYWN0aW9ucyBTeW5jIG1pZ3JhdGlvbiBndWlkZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2FjdGlvbnMvc3luYy1taWdyYXRpb24vKS4gIFRoaXMgZW5kcG9pbnQgc3VwcG9ydHMgYGNyZWRpdGAsIGBkZXBvc2l0b3J5YCwgYW5kIHNvbWUgYGxvYW5gLXR5cGUgYWNjb3VudHMgKG9ubHkgdGhvc2Ugd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgKS4gRm9yIGBpbnZlc3RtZW50c2AgYWNjb3VudHMsIHVzZSBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGluc3RlYWQuICAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGZhaWxzIHdoZW4gcmV0cmlldmluZyBhIHBhZ2luYXRlZCB1cGRhdGUgKGUuZyBkdWUgdG8gdGhlIFtgVFJBTlNBQ1RJT05TX1NZTkNfTVVUQVRJT05fRFVSSU5HX1BBR0lOQVRJT05gXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2Vycm9ycy90cmFuc2FjdGlvbnMvI3RyYW5zYWN0aW9uc19zeW5jX211dGF0aW9uX2R1cmluZ19wYWdpbmF0aW9uKSBlcnJvciksIHRoZSBlbnRpcmUgcGFnaW5hdGlvbiByZXF1ZXN0IGxvb3AgbXVzdCBiZSByZXN0YXJ0ZWQgYmVnaW5uaW5nIHdpdGggdGhlIGN1cnNvciBmb3IgdGhlIGZpcnN0IHBhZ2Ugb2YgdGhlIHVwZGF0ZSwgcmF0aGVyIHRoYW4gcmV0cnlpbmcgb25seSB0aGUgc2luZ2xlIHJlcXVlc3QgdGhhdCBmYWlsZWQuICBJZiB0cmFuc2FjdGlvbnMgZGF0YSBpcyBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIEl0ZW0sIHdoaWNoIGNhbiBoYXBwZW4gaWYgdGhlIEl0ZW0gd2FzIG5vdCBpbml0aWFsaXplZCB3aXRoIHRyYW5zYWN0aW9ucyBkdXJpbmcgdGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGNhbGwgb3IgaWYgYC90cmFuc2FjdGlvbnMvc3luY2Agd2FzIGNhbGxlZCB3aXRoaW4gYSBmZXcgc2Vjb25kcyBvZiBJdGVtIGNyZWF0aW9uLCBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGVuZHBvaW50LiAgVG8gYmUgYWxlcnRlZCB3aGVuIG5ldyB0cmFuc2FjdGlvbnMgYXJlIGF2YWlsYWJsZSwgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNzeW5jX3VwZGF0ZXNfYXZhaWxhYmxlKSB3ZWJob29rLlxuICAgICAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhbiBJdGVtXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNhY3Rpb25zU3luY1Jlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdXNlcl9pbnNpZ2h0cy92MS9nZXRgIGdldHMgdXNlciBpbnNpZ2h0cyBmb3IgY2xpZW50cyB3aG8gaGF2ZSBlbnJpY2hlZCBkYXRhIHdpdGggYC90cmFuc2FjdGlvbnMvZW5yaWNoYC4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAgICAgKiBAc3VtbWFyeSBPYnRhaW4gdXNlciBpbnNpZ2h0cyBiYXNlZCBvbiB0cmFuc2FjdGlvbnMgc2VudCB0aHJvdWdoIC90cmFuc2FjdGlvbnMvZW5yaWNoXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXQodHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gQSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIHRvIGNyZWF0ZSBhIHRyYW5zZmVyLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWwodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gYXV0aG9yaXplIGEgdHJhbnNmZXIuIFRoaXMgZW5kcG9pbnQgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyBgL3RyYW5zZmVyL2NyZWF0ZWAuIFRoZSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIHdpbGwgZXhwaXJlIGlmIG5vdCB1c2VkIGFmdGVyIG9uZSBob3VyLiAoWW91IGNhbiBjb250YWN0IHlvdXIgYWNjb3VudCBtYW5hZ2VyIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhdXRob3JpemF0aW9uIGxpZmV0aW1lLikgICBUaGVyZSBhcmUgZm91ciBwb3NzaWJsZSBvdXRjb21lcyB0byBjYWxsaW5nIHRoaXMgZW5kcG9pbnQ6ICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaW4gdGhlIHJlc3BvbnNlIGlzIGBkZWNsaW5lZGAsIHRoZSBwcm9wb3NlZCB0cmFuc2ZlciBoYXMgZmFpbGVkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2Fubm90IHByb2NlZWQgd2l0aCB0aGUgdHJhbnNmZXIuICAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgYWRkaXRpb25hbCB1c2VyIGlucHV0IGlzIG5lZWRlZCwgdXN1YWxseSB0byBmaXggYSBicm9rZW4gYmFuayBjb25uZWN0aW9uLCBiZWZvcmUgUGxhaWQgY2FuIHByb3Blcmx5IGFzc2VzcyB0aGUgcmlzay4gWW91IG5lZWQgdG8gbGF1bmNoIExpbmsgaW4gdXBkYXRlIG1vZGUgdG8gY29tcGxldGUgdGhlIHJlcXVpcmVkIHVzZXIgYWN0aW9uLiBXaGVuIGNhbGxpbmcgYC9saW5rL3Rva2VuL2NyZWF0ZWAgdG8gZ2V0IGEgbmV3IExpbmsgdG9rZW4sIGluc3RlYWQgb2YgcHJvdmlkaW5nIGBhY2Nlc3NfdG9rZW5gIGluIHRoZSByZXF1ZXN0LCB5b3Ugc2hvdWxkIHNldCBbYHRyYW5zZmVyLmF1dGhvcml6YXRpb25faWRgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9saW5rLyNsaW5rLXRva2VuLWNyZWF0ZS1yZXF1ZXN0LXRyYW5zZmVyLWF1dGhvcml6YXRpb24taWQpIGFzIHRoZSBgYXV0aG9yaXphdGlvbi5pZGAuIEFmdGVyIHRoZSBMaW5rIGZsb3cgaXMgY29tcGxldGVkLCB5b3UgbWF5IHJlLWF0dGVtcHQgdGhlIGF1dGhvcml6YXRpb24uICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgLCBhbmQgdGhlIGBhdXRob3JpemF0aW9uLnJhdGlvbmFsZV9jb2RlYCBpcyBgbnVsbGAsIHRoZSB0cmFuc2ZlciBoYXMgcGFzc2VkIHRoZSByaXNrIGNoZWNrIGFuZCB5b3UgY2FuIHByb2NlZWQgdG8gY2FsbCBgL3RyYW5zZmVyL2NyZWF0ZWAuICAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGBhcHByb3ZlZGAgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgbm9uLWBudWxsYCwgdGhlIHJpc2sgY2hlY2sgY291bGQgbm90IGJlIHJ1bjogeW91IG1heSBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLCBidXQgc2hvdWxkIHBlcmZvcm0geW91ciBvd24gcmlzayBldmFsdWF0aW9uLiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIHJlc3BvbnNlIHNjaGVtYS4gIEluIFBsYWlkXFwncyBTYW5kYm94IGVudmlyb25tZW50IHRoZSBkZWNpc2lvbnMgd2lsbCBiZSByZXR1cm5lZCBhcyBmb2xsb3dzOiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIGBudWxsYCByYXRpb25hbGUgY29kZSwgbWFrZSBhbiBhdXRob3JpemF0aW9uIHJlcXVlc3Qgd2l0aCBhbiBgYW1vdW50YCBsZXNzIHRoYW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHRoZSBhY2NvdW50LiAgICAtIFRvIGFwcHJvdmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTUFOVUFMTFlfVkVSSUZJRURfSVRFTWAsIGNyZWF0ZSBhbiBJdGVtIGluIExpbmsgdGhyb3VnaCB0aGUgW1NhbWUgRGF5IE1pY3JvLWRlcG9zaXRzIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nLyN0ZXN0aW5nLXNhbWUtZGF5LW1pY3JvLWRlcG9zaXRzKS4gICAgLSBUbyBnZXQgYW4gYXV0aG9yaXphdGlvbiBkZWNpc2lvbiBvZiBgdXNlcl9hY3Rpb25fcmVxdWlyZWRgLCBbcmVzZXQgdGhlIGxvZ2luIGZvciBhbiBJdGVtXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvI2l0ZW1fbG9naW5fcmVxdWlyZWQpLiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgTlNGYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgbGVzcyB0aGFuIHRoZSBhdXRob3JpemF0aW9uIGBhbW91bnRgLiBTZWUgW0NyZWF0ZSBTYW5kYm94IHRlc3QgZGF0YV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tLykgZm9yIGRldGFpbHMgb24gaG93IHRvIGN1c3RvbWl6ZSBkYXRhIGluIFNhbmRib3guICAgIC0gVG8gZGVjbGluZSBhIHRyYW5zZmVyIHdpdGggdGhlIHJhdGlvbmFsZSBjb2RlIGBSSVNLYCwgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIG9uIHRoZSBhY2NvdW50IG11c3QgYmUgZXhhY3RseSAkMC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZSh0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIChEZXByZWNhdGVkKSBVc2UgdGhlIGAvdHJhbnNmZXIvYmFsYW5jZS9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIGhlbGQgd2l0aCBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgYmFsYW5jZSBoZWxkIHdpdGggUGxhaWRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJCYWxhbmNlR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQmFsYW5jZUdldCh0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgICAgICogQHN1bW1hcnkgQ2FuY2VsIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJDYW5jZWxSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ2FuY2VsUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jYXBhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCB0byBkZXRlcm1pbmUgdGhlIFJUUCBlbGlnaWJpbGl0eSBpbmZvcm1hdGlvbiBvZiBhbiBhY2NvdW50IHRvIGJlIHVzZWQgd2l0aCBUcmFuc2Zlci4gVGhpcyBlbmRwb2ludCB3b3JrcyBvbiBhbGwgVHJhbnNmZXItY2FwYWJsZSBJdGVtcywgaW5jbHVkaW5nIHRob3NlIGNyZWF0ZWQgYnkgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgLiBUbyBzaW11bGF0ZSBSVFAgZWxpZ2liaWxpdHkgaW4gU2FuZGJveCwgbG9nIGluIHVzaW5nIHRoZSB1c2VybmFtZSBgdXNlcl9nb29kYCBhbmQgcGFzc3dvcmQgYHBhc3NfZ29vZGAgYW5kIHVzZSB0aGUgZmlyc3QgdHdvIGNoZWNraW5nIGFuZCBzYXZpbmdzIGFjY291bnRzIGluIHRoZSBcXFwiRmlyc3QgUGxhdHlwdXMgQmFua1xcXCIgaW5zdGl0dXRpb24gKGVuZGluZyBpbiAwMDAwIG9yIDExMTEpLCB3aGljaCB3aWxsIHJldHVybiBgdHJ1ZWAuIEFueSBvdGhlciBhY2NvdW50IHdpbGwgcmV0dXJuIGBmYWxzZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBSVFAgZWxpZ2liaWxpdHkgaW5mb3JtYXRpb24gb2YgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NvbmZpZ3VyYXRpb24vZ2V0YCBlbmRwb2ludCB0byB2aWV3IHlvdXIgdHJhbnNmZXIgcHJvZHVjdCBjb25maWd1cmF0aW9ucy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3R9IHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXQodHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdDogVHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyB0cmFuc2Zlci4gVGhpcyBlbmRwb2ludCBpcyByZXRyeWFibGUgYW5kIGlkZW1wb3RlbnQ7IGlmIGEgdHJhbnNmZXIgd2l0aCB0aGUgcHJvdmlkZWQgYHRyYW5zZmVyX2lkYCBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQsIGl0IHdpbGwgcmV0dXJuIHRoZSB0cmFuc2ZlciBkZXRhaWxzIHdpdGhvdXQgY3JlYXRpbmcgYSBuZXcgdHJhbnNmZXIuIEEgdHJhbnNmZXIgbWF5IHN0aWxsIGJlIGNyZWF0ZWQgaWYgYSA1MDAgZXJyb3IgaXMgcmV0dXJuZWQ7IHRvIGRldGVjdCB0aGlzIHNjZW5hcmlvLCB1c2UgW1RyYW5zZmVyIGV2ZW50c10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9yZWNvbmNpbGluZy10cmFuc2ZlcnMvKS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXJcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXJkLXBhcnR5IHNlbmRlciBjdXN0b21lcnMgY2FuIHVzZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9kb2N1bWVudC91cGxvYWRgIGVuZHBvaW50IHRvIHVwbG9hZCBhIGRvY3VtZW50IG9uIGJlaGFsZiBvZiBpdHMgZW5kIGN1c3RvbWVyIChpLmUuIG9yaWdpbmF0b3IpIHRvIFBsYWlkLiBZb3XigJlsbCBuZWVkIHRvIHNlbmQgYSByZXF1ZXN0IG9mIHR5cGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YS4gWW91IG11c3QgcHJvdmlkZSB0aGUgYGNsaWVudF9pZGAgaW4gdGhlIGBQTEFJRC1DTElFTlQtSURgIGhlYWRlciBhbmQgYHNlY3JldGAgaW4gdGhlIGBQTEFJRC1TRUNSRVRgIGhlYWRlci5cbiAgICAgICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkKHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvZGlsaWdlbmNlL3N1Ym1pdGAgZW5kcG9pbnQgdG8gc3VibWl0IHRyYW5zZmVyIGRpbGlnZW5jZSBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3IgKGkuZS4sIHRoZSBlbmQgY3VzdG9tZXIpLlxuICAgICAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdH0gdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0OiBUcmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXQodHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgdHJhbnNmZXIgZXZlbnRzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0fSB0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3Q6IFRyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckV2ZW50TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGFsbG93cyB5b3UgdG8gcmVxdWVzdCB1cCB0byB0aGUgbmV4dCAyNSB0cmFuc2ZlciBldmVudHMgdGhhdCBoYXBwZW5lZCBhZnRlciBhIHNwZWNpZmljIGBldmVudF9pZGAuIFVzZSB0aGUgYC90cmFuc2Zlci9ldmVudC9zeW5jYCBlbmRwb2ludCB0byBndWFyYW50ZWUgeW91IGhhdmUgc2VlbiBhbGwgdHJhbnNmZXIgZXZlbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBTeW5jIHRyYW5zZmVyIGV2ZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJFdmVudFN5bmNSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvZ2V0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYC4gT25lIG9mIGB0cmFuc2Zlcl9pZGAgb3IgYGF1dGhvcml6YXRpb25faWRgIG11c3QgYmUgcG9wdWxhdGVkIGJ1dCBub3QgYm90aC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyR2V0UmVxdWVzdH0gdHJhbnNmZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJHZXQodHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCB0byBpbnZva2UgdGhlIFRyYW5zZmVyIFVJXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckludGVudENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvaW50ZW50L2dldGAgZW5kcG9pbnQgdG8gcmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhIHRyYW5zZmVyIGludGVudFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50R2V0UmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJJbnRlbnRHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0YCBlbmRwb2ludCB0byBkZXBvc2l0IGZ1bmRzIGludG8gUGxhaWQgTGVkZ2VyLlxuICAgICAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlckRlcG9zaXQodHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL2Rpc3RyaWJ1dGVgIGVuZHBvaW50IHRvIG1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1vdmUgYXZhaWxhYmxlIGJhbGFuY2UgYmV0d2VlbiB0aGUgbGVkZ2VycyBvZiB0aGUgcGxhdGZvcm0gYW5kIG9uZSBvZiBpdHMgb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZSh0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJMZWRnZXJHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci93aXRoZHJhd2AgZW5kcG9pbnQgdG8gd2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlLlxuICAgICAgICAgKiBAc3VtbWFyeSBXaXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2VcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGlzdGAgZW5kcG9pbnQgdG8gc2VlIGEgbGlzdCBvZiBhbGwgeW91ciB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCB0cmFuc2ZlcnMuIFxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJMaXN0KHRyYW5zZmVyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3NcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0fSB0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3Q6IFRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJNZXRyaWNzR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgZW5kcG9pbnQgdG8gbWlncmF0ZSBrbm93biBhY2NvdW50IGFuZCByb3V0aW5nIG51bWJlcnMgdG8gUGxhaWQgSXRlbXMuIFRoaXMgZW5kcG9pbnQgaXMgYWxzbyByZXF1aXJlZCB3aGVuIGFkZGluZyBhbiBJdGVtIGZvciB1c2Ugd2l0aCB3aXJlIHRyYW5zZmVyczsgaWYgeW91IGludGVuZCB0byBjcmVhdGUgd2lyZSB0cmFuc2ZlcnMgb24gdGhpcyBhY2NvdW50LCB5b3UgbXVzdCBwcm92aWRlIGB3aXJlX3JvdXRpbmdfbnVtYmVyYC4gTm90ZSB0aGF0IEl0ZW1zIGNyZWF0ZWQgaW4gdGhpcyB3YXkgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggZW5kcG9pbnRzIGZvciBvdGhlciBwcm9kdWN0cywgc3VjaCBhcyBgL2FjY291bnRzL2JhbGFuY2UvZ2V0YCwgYW5kIGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGlzIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQ7IHRvIG9idGFpbiBhY2Nlc3MsIGNvbnRhY3QgeW91ciBQbGFpZCBBY2NvdW50IE1hbmFnZXIuXG4gICAgICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSB0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyTWlncmF0ZUFjY291bnQodHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgbmV3IG9yaWdpbmF0b3IgYW5kIHJldHVybiBhbiBgb3JpZ2luYXRvcl9jbGllbnRfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9mdW5kaW5nX2FjY291bnQvdXBkYXRlYCBlbmRwb2ludCB0byB1cGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3IuXG4gICAgICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9nZXRgIGVuZHBvaW50IGdldHMgc3RhdHVzIHVwZGF0ZXMgZm9yIGFuIG9yaWdpbmF0b3JcXCdzIG9uYm9hcmRpbmcgcHJvY2Vzcy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFRyYW5zZmVyIHBhZ2Ugb24gdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckdldCh0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvbGlzdGAgZW5kcG9pbnQgZ2V0cyBzdGF0dXMgdXBkYXRlcyBmb3IgYWxsIG9mIHlvdXIgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgdGhlIFBsYWlkIGRhc2hib2FyZC5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbGwgb3JpZ2luYXRvcnNcXCcgb25ib2FyZGluZ1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3BsYXRmb3JtL29yaWdpbmF0b3IvY3JlYXRlYCBlbmRwb2ludCBhbGxvd3MgZ2F0aGVyaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hdG9yIHNwZWNpZmljIHRvIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcsIGluY2x1ZGluZyB0aGUgb3JpZ2luYXRvclxcJ3MgYWdyZWVtZW50IHRvIGxlZ2FsIHRlcm1zIHJlcXVpcmVkIGJlZm9yZSBhY2NlcHRpbmcgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgb3JpZ2luYXRvci5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIG9yaWdpbmF0b3IgZm9yIHNjYWxlZCBwbGF0Zm9ybSBjdXN0b21lcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9wZXJzb24vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwZXJzb24gcmVjb3JkIGFzc29jaWF0ZWQgd2l0aCBhbiBvcmlnaW5hdG9yIGFuZCBvcHRpb25hbGx5IHN1Ym1pdCBwZXJzb24tc3BlY2lmaWMgcmVxdWlyZW1lbnRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3JcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9wbGF0Zm9ybS9yZXF1aXJlbWVudC9zdWJtaXRgIGVuZHBvaW50IGFsbG93cyBwbGF0Zm9ybXMgdG8gc3VibWl0IG9uYm9hcmRpbmcgcmVxdWlyZW1lbnRzIGZvciBhbiBvcmlnaW5hdG9yIGFzIHBhcnQgb2YgdGhlIFNjYWxlZCBQbGF0Zm9ybSBUcmFuc2ZlciBvZmZlcmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgU3VibWl0IG9uYm9hcmRpbmcgcmVxdWlyZW1lbnRzIGZvciBTY2FsZWQgUGxhdGZvcm0gb3JpZ2luYXRvcnNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0KHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcXVlc3Rpb25uYWlyZS9jcmVhdGVgIGVuZHBvaW50IGdlbmVyYXRlcyBhIFBsYWlkLWhvc3RlZCBvbmJvYXJkaW5nIFVJIFVSTC4gUmVkaXJlY3QgdGhlIG9yaWdpbmF0b3IgdG8gdGhpcyBVUkwgdG8gcHJvdmlkZSB0aGVpciBkdWUgZGlsaWdlbmNlIGluZm9ybWF0aW9uIGFuZCBhZ3JlZSB0byBQbGFpZOKAmXMgdGVybXMgZm9yIEFDSCBtb25leSBtb3ZlbWVudC5cbiAgICAgICAgICogQHN1bW1hcnkgR2VuZXJhdGUgYSBQbGFpZC1ob3N0ZWQgb25ib2FyZGluZyBVSSBVUkwuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGUodHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2NyZWF0ZWAgZW5kcG9pbnQgdG8gaW5pdGlhdGUgYSBuZXcgcmVjdXJyaW5nIHRyYW5zZmVyLiBUaGlzIGNhcGFiaWxpdHkgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgZm9yIFRyYW5zZmVyIFVJIG9yIFBsYXRmb3JtIFBheW1lbnRzIChiZXRhKSBjdXN0b21lcnMuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhlIGAvdHJhbnNmZXIvcmVjdXJyaW5nL2dldGAgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjdXJyaW5nIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWN1cnJpbmdfdHJhbnNmZXJfaWRgLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWN1cnJpbmdHZXQodHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCByZWN1cnJpbmcgdHJhbnNmZXJzXG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWZ1bmQvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWZ1bmQuICBBIHJlZnVuZCBpcyBlbGlnaWJsZSBmb3IgY2FuY2VsbGF0aW9uIGlmIGl0IGhhcyBub3QgeWV0IGJlZW4gc3VibWl0dGVkIHRvIHRoZSBwYXltZW50IG5ldHdvcmsuXG4gICAgICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZWZ1bmRDYW5jZWwodHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBSZWZ1bmRzIGNvbWUgb3V0IG9mIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIHVzZWQgZm9yIHRoZSBvcmlnaW5hbCBkZWJpdCB0cmFuc2Zlci4gSWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZnVuZHMgaW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIHRvIGNvdmVyIHRoZSByZWZ1bmQgYW1vdW50LCB0aGUgcmVmdW5kIHdpbGwgYmUgcmVqZWN0ZWQuIFlvdSBjYW4gY3JlYXRlIGEgcmVmdW5kIGF0IGFueSB0aW1lLiBQbGFpZCBkb2VzIG5vdCBpbXBvc2UgYW55IGhvbGQgdGltZSBvbiByZWZ1bmRzLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlZnVuZC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlZnVuZCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVmdW5kX2lkYC5cbiAgICAgICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSByZWZ1bmRcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVmdW5kR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHJlcGF5bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuIFJlcGF5bWVudHMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciAobW9zdCByZWNlbnQgZmlyc3QpIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBgc3RhcnRfdGltZWAuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclJlcGF5bWVudExpc3QodHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdDogVHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclJlcGF5bWVudExpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvcmV0dXJuL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgc2V0IG9mIHJldHVybnMgdGhhdCB3ZXJlIGJhdGNoZWQgdG9nZXRoZXIgaW50byB0aGUgc3BlY2lmaWVkIHJlcGF5bWVudC4gVGhlIHN1bSBvZiBhbW91bnRzIG9mIHJldHVybnMgcmV0cmlldmVkIGJ5IHRoaXMgcmVxdWVzdCBlcXVhbHMgdGhlIGFtb3VudCBvZiB0aGUgcmVwYXltZW50LlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHRoZSByZXR1cm5zIGluY2x1ZGVkIGluIGEgcmVwYXltZW50XG4gICAgICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC50cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3QodHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3dlZXBcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdH0gdHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB0cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0OiBUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxUcmFuc2ZlclN3ZWVwR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyU3dlZXBHZXQodHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgICAgICogQHBhcmFtIHtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFRyYW5zZmVyU3dlZXBMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgdXNlciBwZXJtaXNzaW9uZWQgYWNjb3VudCBkYXRhIGluY2x1ZGluZyBpZGVudGl0eSBhbmQgSXRlbSBhY2Nlc3MgdG9rZW5zLlxuICAgICAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBVc2VyIEFjY291bnRcbiAgICAgICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlckFjY291bnRTZXNzaW9uR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLnVzZXJBY2NvdW50U2Vzc2lvbkdldCh1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIG9mIHlvdXIgZW5kIHVzZXJzIGJlZm9yZSB0aGV5IGJlZ2luIGEgUGxhaWQgQ2hlY2sgb3IgSW5jb21lIGZsb3csIG9yIGEgTXVsdGktSXRlbSBMaW5rIGZsb3cuIFRoaXMgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFlvdSBzaG91bGQgb25seSBjcmVhdGUgb25lIHBlciBlbmQgdXNlci4gIFRoZSBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIG9iamVjdCBtdXN0IGJlIHByZXNlbnQgaW4gb3JkZXIgdG8gY3JlYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0IGZvciBhIHVzZXIuIElmIGl0IGlzIG5vdCBwcm92aWRlZCBkdXJpbmcgdGhlIGAvdXNlci9jcmVhdGVgIGNhbGwsIGl0IGNhbiBiZSBhZGRlZCBsYXRlciBieSBjYWxsaW5nIGAvdXNlci91cGRhdGVgLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC4gIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIGBjbGllbnRfdXNlcl9pZGAsIHRoZSBmaXJzdCBjcmVhdGlvbiBjYWxsIHdpbGwgc3VjY2VlZCBhbmQgdGhlIHJlc3Qgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAuICBFbnN1cmUgdGhhdCB5b3Ugc3RvcmUgdGhlIGB1c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHlvdXIgdXNlclxcJ3MgaWRlbnRpZmllciBpbiB5b3VyIGRhdGFiYXNlLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHVzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJDcmVhdGVSZXF1ZXN0fSB1c2VyQ3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3Q6IFVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlckNyZWF0ZSh1c2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlciBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCBJdGVtcyBhc3NvY2lhdGVkIHdpdGggYSBVc2VyXG4gICAgICAgICAqIEBwYXJhbSB7VXNlckl0ZW1zR2V0UmVxdWVzdH0gdXNlckl0ZW1zR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0OiBVc2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJJdGVtc0dldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIGAvdXNlci9yZW1vdmVgIGRlbGV0ZXMgYSB1c2VyIHRva2VuIGFuZCBhbmQgYXNzb2NpYXRlZCBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIGFueSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRva2VuLiAgQW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gdXNpbmcgdGhlIHNhbWUgdXNlciB0b2tlbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBzdGF0aW5nIHRoZSB1c2VyIGRvZXMgbm90IGV4aXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdXNlclxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJSZW1vdmVSZXF1ZXN0fSB1c2VyUmVtb3ZlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJSZW1vdmUodXNlclJlbW92ZVJlcXVlc3Q6IFVzZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJSZW1vdmVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBjcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBUaGlzIHRva2VuIGNhbiBiZSBzaGFyZWQgd2l0aCBhbmQgdXNlZCBieSBhIHNwZWNpZmllZCB0aGlyZC1wYXJ0eSBjbGllbnQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyIHRocm91Z2ggc3VwcG9ydGVkIGVuZHBvaW50cy4gIEVuc3VyZSB5b3Ugc3RvcmUgdGhlIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHRoZSBgdXNlcl90b2tlbmAgYW5kIGB0aGlyZF9wYXJ0eV9jbGllbnRfaWRgLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHRoaXJkX3BhcnR5X3VzZXJfdG9rZW5gLlxuICAgICAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZSh1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIGRlbGV0ZSBhIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4uIE9uY2UgcmVtb3ZlZCwgdGhlIHRva2VuIGNhbiBsb25nZXIgYmUgdXNlZCB0byBhY2Nlc3MgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuICAgQW55IHN1YnNlcXVlbnQgY2FsbHMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gdXNpbmcgdGhlIHNhbWUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvciBzdGF0aW5nIHRoZSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuIGRvZXMgbm90IGV4aXN0LlxuICAgICAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICAgICAqIEBwYXJhbSB7VXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3R9IHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZSh1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdDogVXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8VXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC51c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBpcyB1c2VkIHRvIHVwZGF0ZSB1c2VyIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAuIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gZW5hYmxlIGFuIGV4aXN0aW5nIGB1c2VyX3Rva2VuYCBmb3IgdXNlIHdpdGggQ29uc3VtZXIgUmVwb3J0cyBieSBQbGFpZCBDaGVjaywgYnkgYWRkaW5nIGEgYGNvbnN1bWVyX3JlcG9ydF91c2VyX2lkZW50aXR5YCBvYmplY3QgdG8gdGhlIHVzZXIuIFBsYWlkIENoZWNrIENvbnN1bWVyIFJlcG9ydHMgY2FuIG9ubHkgYmUgY3JlYXRlZCBmb3IgVVMtYmFzZWQgdXNlcnM7IHRoZSB1c2VyXFwncyBhZGRyZXNzIGNvdW50cnkgbXVzdCBiZSBgVVNgLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1VzZXJVcGRhdGVSZXF1ZXN0fSB1c2VyVXBkYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHVzZXJVcGRhdGUodXNlclVwZGF0ZVJlcXVlc3Q6IFVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFVzZXJVcGRhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAudXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhbiBlLXdhbGxldC4gVGhlIHJlc3BvbnNlIGlzIHRoZSBuZXdseSBjcmVhdGVkIGUtd2FsbGV0IG9iamVjdC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICAgICAqIEBwYXJhbSB7V2FsbGV0Q3JlYXRlUmVxdWVzdH0gd2FsbGV0Q3JlYXRlUmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhbGxldENyZWF0ZSh3YWxsZXRDcmVhdGVSZXF1ZXN0OiBXYWxsZXRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhbGxldENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIEZldGNoIGFuIGUtd2FsbGV0LiBUaGUgcmVzcG9uc2UgaW5jbHVkZXMgdGhlIGN1cnJlbnQgYmFsYW5jZS5cbiAgICAgICAgICogQHN1bW1hcnkgRmV0Y2ggYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldEdldCh3YWxsZXRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICAgICAqIEBzdW1tYXJ5IEZldGNoIGEgbGlzdCBvZiBlLXdhbGxldHNcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRMaXN0UmVxdWVzdH0gd2FsbGV0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0OiBXYWxsZXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldExpc3Qod2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAgICAgKiBAc3VtbWFyeSBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgYW4gZS13YWxsZXRcbiAgICAgICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogRmV0Y2ggYSBzcGVjaWZpYyBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25HZXQod2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGUtd2FsbGV0IHRyYW5zYWN0aW9uc1xuICAgICAgICAgKiBAcGFyYW0ge1dhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3R9IHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdDogV2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSBuZXcgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgdG8gY2hlY2sgeW91ciBjdXN0b21lciBhZ2FpbnN0IHdhdGNobGlzdHMgZGVmaW5lZCBpbiB0aGUgYXNzb2NpYXRlZCBlbnRpdHkgd2F0Y2hsaXN0IHByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXRyaWV2ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGlzdG9yeSBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBoaXRzIGZvciB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogTGlzdCBhbGwgZW50aXR5IHNjcmVlbmluZ3MuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogR2V0IGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciBhIHBhcnRpY3VsYXIgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgICAgICogQHN1bW1hcnkgVXBkYXRlIGFuIGVudGl0eSBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGEgcGVyc29uXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGFuIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXNwb25zZT4ge1xuICAgICAgICAgICAgcmV0dXJuIGxvY2FsVmFyRnAud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3QgYWxsIGhpdHMgZm91bmQgYnkgUGxhaWQgZm9yIGEgcGFydGljdWxhciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBJbmRpdmlkdWFsIFdhdGNobGlzdCBTY3JlZW5pbmdzXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBHZXQgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1cbiAgICAgICAgICogQHN1bW1hcnkgR2V0IGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLiBSZXZpZXdzIGFyZSBjb21wbGlhbmNlIHJlcG9ydHMgY3JlYXRlZCBieSB1c2VycyBpbiB5b3VyIG9yZ2FuaXphdGlvbiByZWdhcmRpbmcgdGhlIHJlbGV2YW5jZSBvZiBwb3RlbnRpYWwgaGl0cyBmb3VuZCBieSBQbGFpZC5cbiAgICAgICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMaXN0IGFsbCByZXZpZXdzIGZvciB0aGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAgICAgKiBAc3VtbWFyeSBMaXN0IHJldmlld3MgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgICAgICovXG4gICAgICAgIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KTogQXhpb3NQcm9taXNlPFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdChheGlvcywgYmFzZVBhdGgpKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqXG4gICAgICAgICAqIFVwZGF0ZSBhIHNwZWNpZmljIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBhZGQgYWRkaXRpb25hbCBjdXN0b21lciBpbmZvcm1hdGlvbiwgY29ycmVjdCBvdXRkYXRlZCBpbmZvcm1hdGlvbiwgYWRkIGEgcmVmZXJlbmNlIGlkLCBhc3NpZ24gdGhlIGluZGl2aWR1YWwgdG8gYSByZXZpZXdlciwgYW5kIHVwZGF0ZSB3aGljaCBwcm9ncmFtIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gUGxlYXNlIG5vdGUgdGhhdCB5b3UgbWF5IG5vdCB1cGRhdGUgYHNlYXJjaF90ZXJtc2AgYW5kIGBzdGF0dXNgIGF0IHRoZSBzYW1lIHRpbWUgc2luY2UgZWRpdGluZyBgc2VhcmNoX3Rlcm1zYCBtYXkgdHJpZ2dlciBhbiBhdXRvbWF0aWMgYHN0YXR1c2AgY2hhbmdlLlxuICAgICAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0IFxuICAgICAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAgICAgKi9cbiAgICAgICAgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpOiBBeGlvc1Byb21pc2U8V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlc3BvbnNlPiB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxWYXJGcC53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KGF4aW9zLCBiYXNlUGF0aCkpO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAgICAgICAgICogUGxhaWQgc2lnbnMgYWxsIG91dGdvaW5nIHdlYmhvb2tzIGFuZCBwcm92aWRlcyBKU09OIFdlYiBUb2tlbnMgKEpXVHMpIHNvIHRoYXQgeW91IGNhbiB2ZXJpZnkgdGhlIGF1dGhlbnRpY2l0eSBvZiBhbnkgaW5jb21pbmcgd2ViaG9va3MgdG8geW91ciBhcHBsaWNhdGlvbi4gQSBtZXNzYWdlIHNpZ25hdHVyZSBpcyBpbmNsdWRlZCBpbiB0aGUgYFBsYWlkLVZlcmlmaWNhdGlvbmAgaGVhZGVyLiAgVGhlIGAvd2ViaG9va192ZXJpZmljYXRpb25fa2V5L2dldGAgZW5kcG9pbnQgcHJvdmlkZXMgYSBKU09OIFdlYiBLZXkgKEpXSykgdGhhdCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgYSBKV1QuXG4gICAgICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgICAgICogQHBhcmFtIHtXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdH0gd2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QgXG4gICAgICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICAgICAqL1xuICAgICAgICB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0KHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0OiBXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSk6IEF4aW9zUHJvbWlzZTxXZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVzcG9uc2U+IHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhckZwLndlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QoYXhpb3MsIGJhc2VQYXRoKSk7XG4gICAgICAgIH0sXG4gICAgfTtcbn07XG5cbi8qKlxuICogUGxhaWRBcGkgLSBvYmplY3Qtb3JpZW50ZWQgaW50ZXJmYWNlXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgUGxhaWRBcGlcbiAqIEBleHRlbmRzIHtCYXNlQVBJfVxuICovXG5leHBvcnQgY2xhc3MgUGxhaWRBcGkgZXh0ZW5kcyBCYXNlQVBJIHtcbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cywgc3VjaCBhcyBgL2FjY291bnRzL2dldGAsIHJldHVybiBhIGJhbGFuY2Ugb2JqZWN0LCBvbmx5IGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgZm9yIGV4aXN0aW5nIEl0ZW1zIHRoYXQgd2VyZSBhZGRlZCB2aWEgYW55IG9mIFBsYWlk4oCZcyBvdGhlciBwcm9kdWN0cy4gVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBhcyBsb25nIGFzIExpbmsgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhbnkgb3RoZXIgcHJvZHVjdCwgYGJhbGFuY2VgIGl0c2VsZiBpcyBub3QgYSBwcm9kdWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBMaW5rLiBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIHJlYWwtdGltZSBiYWxhbmNlIGRhdGFcbiAgICAgKiBAcGFyYW0ge0FjY291bnRzQmFsYW5jZUdldFJlcXVlc3R9IGFjY291bnRzQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhY2NvdW50c0JhbGFuY2VHZXQoYWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdDogQWNjb3VudHNCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFjY291bnRzQmFsYW5jZUdldChhY2NvdW50c0JhbGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlIGEgbGlzdCBvZiBhY2NvdW50cyBhc3NvY2lhdGVkIHdpdGggYW55IGxpbmtlZCBJdGVtLiBQbGFpZCB3aWxsIG9ubHkgcmV0dXJuIGFjdGl2ZSBiYW5rIGFjY291bnRzIOKAlCB0aGF0IGlzLCBhY2NvdW50cyB0aGF0IGFyZSBub3QgY2xvc2VkIGFuZCBhcmUgY2FwYWJsZSBvZiBjYXJyeWluZyBhIGJhbGFuY2UuIFRvIHJldHVybiBuZXcgYWNjb3VudHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYWZ0ZXIgdGhlIHVzZXIgbGlua2VkIHRoZWlyIEl0ZW0sIHlvdSBjYW4gbGlzdGVuIGZvciB0aGUgW2BORVdfQUNDT1VOVFNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI25ld19hY2NvdW50c19hdmFpbGFibGUpIHdlYmhvb2sgYW5kIHRoZW4gdXNlIExpbmtcXCdzIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykgdG8gcmVxdWVzdCB0aGF0IHRoZSB1c2VyIHNoYXJlIHRoaXMgbmV3IGFjY291bnQgd2l0aCB5b3UuICBgL2FjY291bnRzL2dldGAgaXMgZnJlZSB0byB1c2UgYW5kIHJldHJpZXZlcyBjYWNoZWQgaW5mb3JtYXRpb24sIHJhdGhlciB0aGFuIGV4dHJhY3RpbmcgZnJlc2ggaW5mb3JtYXRpb24gZnJvbSB0aGUgaW5zdGl0dXRpb24uIFRoZSBiYWxhbmNlIHJldHVybmVkIHdpbGwgcmVmbGVjdCB0aGUgYmFsYW5jZSBhdCB0aGUgdGltZSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIEl0ZW0gdXBkYXRlLiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIGZvciBhIHJlZ3VsYXJseSB1cGRhdGluZyBwcm9kdWN0LCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgSW52ZXN0bWVudHMsIG9yIExpYWJpbGl0aWVzLCB0aGUgYmFsYW5jZSB3aWxsIHR5cGljYWxseSB1cGRhdGUgYWJvdXQgb25jZSBhIGRheSwgYXMgbG9uZyBhcyB0aGUgSXRlbSBpcyBoZWFsdGh5LiBJZiB0aGUgSXRlbSBpcyBlbmFibGVkIG9ubHkgZm9yIHByb2R1Y3RzIHRoYXQgZG8gbm90IGZyZXF1ZW50bHkgdXBkYXRlLCBzdWNoIGFzIEF1dGggb3IgSWRlbnRpdHksIGJhbGFuY2UgZGF0YSBtYXkgYmUgbXVjaCBvbGRlci4gIEZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgdGhlIHBhaWQgZW5kcG9pbnQgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhY2NvdW50c1xuICAgICAqIEBwYXJhbSB7QWNjb3VudHNHZXRSZXF1ZXN0fSBhY2NvdW50c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhY2NvdW50c0dldChhY2NvdW50c0dldFJlcXVlc3Q6IEFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFjY291bnRzR2V0KGFjY291bnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQgUGxhaWQgY2xpZW50cyBmb3IgdGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgY29udHJvbC10b3dlciBleHBlcmllbmNlc1xuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IGEgUGxhaWQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0FwcGxpY2F0aW9uR2V0UmVxdWVzdH0gYXBwbGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwbGljYXRpb25HZXQoYXBwbGljYXRpb25HZXRSZXF1ZXN0OiBBcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hcHBsaWNhdGlvbkdldChhcHBsaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBwcm92aWRlIGFuIEF1ZGl0IENvcHkgb2YgYW55IEFzc2V0IFJlcG9ydCBkaXJlY3RseSB0byBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIEZvciBleGFtcGxlLCBQbGFpZCBjYW4gc3VwcGx5IGFuIEF1ZGl0IENvcHkgZGlyZWN0bHkgdG8gRmFubmllIE1hZSBvbiB5b3VyIGJlaGFsZiBpZiB5b3UgcGFydGljaXBhdGUgaW4gdGhlIERheSAxIENlcnRhaW50eeKEoiBwcm9ncmFtLiBBbiBBdWRpdCBDb3B5IGNvbnRhaW5zIHRoZSBzYW1lIHVuZGVybHlpbmcgZGF0YSBhcyB0aGUgQXNzZXQgUmVwb3J0LiAgVG8gZ3JhbnQgYWNjZXNzIHRvIGFuIEF1ZGl0IENvcHksIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvYXVkaXRfY29weS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhbiBgYXVkaXRfY29weV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHRoZSB0aGlyZCBwYXJ0eSB3aG8gbmVlZHMgYWNjZXNzLiBFYWNoIHRoaXJkIHBhcnR5IGhhcyBpdHMgb3duIGBhdWRpdG9yX2lkYCwgZm9yIGV4YW1wbGUgYGZhbm5pZV9tYWVgLiBZb3XigJlsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIEF1ZGl0IENvcHkgZm9yIGVhY2ggdGhpcmQgcGFydHkgdG8gd2hvbSB5b3Ugd2FudCB0byBncmFudCBhY2Nlc3MgdG8gdGhlIFJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXNzZXQgUmVwb3J0IEF1ZGl0IENvcHlcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0QXVkaXRDb3B5Q3JlYXRlUmVxdWVzdH0gYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGUoYXNzZXRSZXBvcnRBdWRpdENvcHlDcmVhdGVSZXF1ZXN0OiBBc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZShhc3NldFJlcG9ydEF1ZGl0Q29weUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvZ2V0YCBhbGxvd3MgYXVkaXRvcnMgdG8gZ2V0IGEgY29weSBvZiBhbiBBc3NldCBSZXBvcnQgdGhhdCB3YXMgcHJldmlvdXNseSBzaGFyZWQgdmlhIHRoZSBgL2Fzc2V0X3JlcG9ydC9hdWRpdF9jb3B5L2NyZWF0ZWAgZW5kcG9pbnQuICBUaGUgY2FsbGVyIG9mIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYCBtdXN0IHByb3ZpZGUgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCB0byB0aGUgYXVkaXRvci4gIFRoaXMgdG9rZW4gY2FuIHRoZW4gYmUgdXNlZCB0byBjYWxsIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgQXVkaXQgQ29weVxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRBdWRpdENvcHlHZXRSZXF1ZXN0fSBhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhc3NldFJlcG9ydEF1ZGl0Q29weUdldChhc3NldFJlcG9ydEF1ZGl0Q29weUdldFJlcXVlc3Q6IEFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0KGFzc2V0UmVwb3J0QXVkaXRDb3B5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYXNzZXRfcmVwb3J0L2F1ZGl0X2NvcHkvcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJlbW92ZSBhbiBBdWRpdCBDb3B5LiBSZW1vdmluZyBhbiBBdWRpdCBDb3B5IGludmFsaWRhdGVzIHRoZSBgYXVkaXRfY29weV90b2tlbmAgYXNzb2NpYXRlZCB3aXRoIGl0LCBtZWFuaW5nIGJvdGggeW91IGFuZCBhbnkgdGhpcmQgcGFydGllcyBob2xkaW5nIHRoZSB0b2tlbiB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHVzZSBpdCB0byBhY2Nlc3MgUmVwb3J0IGRhdGEuIEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXNzZXQgUmVwb3J0LCB0aGUgQXNzZXQgUmVwb3J0IGl0c2VsZiBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIEFzc2V0IFJlcG9ydCBBdWRpdCBDb3B5XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydEF1ZGl0Q29weVJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGFzc2V0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmUoYXNzZXRSZXBvcnRBdWRpdENvcHlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBpbml0aWF0ZXMgdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgYW4gQXNzZXQgUmVwb3J0LCB3aGljaCBjYW4gdGhlbiBiZSByZXRyaWV2ZWQgYnkgcGFzc2luZyB0aGUgYGFzc2V0X3JlcG9ydF90b2tlbmAgcmV0dXJuIHZhbHVlIHRvIHRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIG9yIGAvYXNzZXRfcmVwb3J0L3BkZi9nZXRgIGVuZHBvaW50cy4gIFRoZSBBc3NldCBSZXBvcnQgdGFrZXMgc29tZSB0aW1lIHRvIGJlIGNyZWF0ZWQgYW5kIGlzIG5vdCBhdmFpbGFibGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgLiBUaGUgZXhhY3QgYW1vdW50IG9mIHRpbWUgdG8gY3JlYXRlIHRoZSByZXBvcnQgd2lsbCB2YXJ5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkYXlzIG9mIGhpc3RvcnkgYXJlIHJlcXVlc3RlZCBhbmQgd2lsbCB0eXBpY2FsbHkgcmFuZ2UgZnJvbSBhIGZldyBzZWNvbmRzIHRvIGFib3V0IG9uZSBtaW51dGUuIFdoZW4gdGhlIEFzc2V0IFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQgdXNpbmcgYC9hc3NldF9yZXBvcnQvZ2V0YCBvciBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgUGxhaWQgd2lsbCBmaXJlIGEgYFBST0RVQ1RfUkVBRFlgIHdlYmhvb2suIEZvciBmdWxsIGRldGFpbHMgb2YgdGhlIHdlYmhvb2sgc2NoZW1hLCBzZWUgW0Fzc2V0IFJlcG9ydCB3ZWJob29rc10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyN3ZWJob29rcykuICBUaGUgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIGFuIEFzc2V0IFJlcG9ydCBhdCBhIG1vbWVudCBpbiB0aW1lLiBBc3NldCBSZXBvcnRzIGFyZSBpbW11dGFibGUuIFRvIGdldCBhbiB1cGRhdGVkIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydENyZWF0ZVJlcXVlc3R9IGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0Q3JlYXRlKGFzc2V0UmVwb3J0Q3JlYXRlUmVxdWVzdDogQXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRDcmVhdGUoYXNzZXRSZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBCeSBkZWZhdWx0LCBhbiBBc3NldCBSZXBvcnQgd2lsbCBjb250YWluIGFsbCBvZiB0aGUgYWNjb3VudHMgb24gYSBnaXZlbiBJdGVtLiBJbiBzb21lIGNhc2VzLCB5b3UgbWF5IG5vdCB3YW50IHRoZSBBc3NldCBSZXBvcnQgdG8gY29udGFpbiBhbGwgYWNjb3VudHMuIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgaGF2ZSB0aGUgZW5kIHVzZXIgY2hvb3NlIHdoaWNoIGFjY291bnRzIGFyZSByZWxldmFudCBpbiBMaW5rIHVzaW5nIHRoZSBBY2NvdW50IFNlbGVjdCB2aWV3LCB3aGljaCB5b3UgY2FuIGVuYWJsZSBpbiB0aGUgZGFzaGJvYXJkLiBPciwgeW91IG1pZ2h0IGFsd2F5cyBleGNsdWRlIGNlcnRhaW4gYWNjb3VudCB0eXBlcyBvciBzdWJ0eXBlcywgd2hpY2ggeW91IGNhbiBpZGVudGlmeSBieSB1c2luZyB0aGUgYC9hY2NvdW50cy9nZXRgIGVuZHBvaW50LiBUbyBuYXJyb3cgYW4gQXNzZXQgUmVwb3J0IHRvIG9ubHkgYSBzdWJzZXQgb2YgYWNjb3VudHMsIHVzZSB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludC4gIFRvIGV4Y2x1ZGUgY2VydGFpbiBBY2NvdW50cyBmcm9tIGFuIEFzc2V0IFJlcG9ydCwgZmlyc3QgdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSB0aGUgcmVwb3J0LCB0aGVuIHNlbmQgdGhlIGBhc3NldF9yZXBvcnRfdG9rZW5gIGFsb25nIHdpdGggYSBsaXN0IG9mIGBhY2NvdW50X2lkc2AgdG8gZXhjbHVkZSB0byB0aGUgYC9hc3NldF9yZXBvcnQvZmlsdGVyYCBlbmRwb2ludCwgdG8gY3JlYXRlIGEgbmV3IEFzc2V0IFJlcG9ydCB3aGljaCBjb250YWlucyBvbmx5IGEgc3Vic2V0IG9mIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnRcXCdzIGRhdGEuICBCZWNhdXNlIEFzc2V0IFJlcG9ydHMgYXJlIGltbXV0YWJsZSwgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGRvZXMgbm90IGFsdGVyIHRoZSBvcmlnaW5hbCBBc3NldCBSZXBvcnQgaW4gYW55IHdheTsgcmF0aGVyLCBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgIGNyZWF0ZXMgYSBuZXcgQXNzZXQgUmVwb3J0IHdpdGggYSBuZXcgdG9rZW4gYW5kIGlkLiBBc3NldCBSZXBvcnRzIGNyZWF0ZWQgdmlhIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmAgZG8gbm90IGNvbnRhaW4gbmV3IEFzc2V0IGRhdGEsIGFuZCBhcmUgbm90IGJpbGxlZC4gIFBsYWlkIHdpbGwgZmlyZSBhIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayBvbmNlIGdlbmVyYXRpb24gb2YgdGhlIGZpbHRlcmVkIEFzc2V0IFJlcG9ydCBoYXMgY29tcGxldGVkLlxuICAgICAqIEBzdW1tYXJ5IEZpbHRlciBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0RmlsdGVyUmVxdWVzdH0gYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRGaWx0ZXIoYXNzZXRSZXBvcnRGaWx0ZXJSZXF1ZXN0OiBBc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEZpbHRlcihhc3NldFJlcG9ydEZpbHRlclJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgQXNzZXQgUmVwb3J0IGluIEpTT04gZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9nZXRgLCB5b3UgbXVzdCBmaXJzdCBjcmVhdGUgdGhlIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9jcmVhdGVgIChvciBmaWx0ZXIgYW4gQXNzZXQgUmVwb3J0IHVzaW5nIGAvYXNzZXRfcmVwb3J0L2ZpbHRlcmApIGFuZCB0aGVuIHdhaXQgZm9yIHRoZSBbYFBST0RVQ1RfUkVBRFlgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9hc3NldHMvI3Byb2R1Y3RfcmVhZHkpIHdlYmhvb2sgdG8gZmlyZSwgaW5kaWNhdGluZyB0aGF0IHRoZSBSZXBvcnQgaXMgcmVhZHkgdG8gYmUgcmV0cmlldmVkLiAgQnkgZGVmYXVsdCwgYW4gQXNzZXQgUmVwb3J0IGluY2x1ZGVzIHRyYW5zYWN0aW9uIGRlc2NyaXB0aW9ucyBhcyByZXR1cm5lZCBieSB0aGUgYmFuaywgYXMgb3Bwb3NlZCB0byBwYXJzZWQgYW5kIGNhdGVnb3JpemVkIGJ5IFBsYWlkLiBZb3UgY2FuIGFsc28gcmVjZWl2ZSBjbGVhbmVkIGFuZCBjYXRlZ29yaXplZCB0cmFuc2FjdGlvbnMsIGFzIHdlbGwgYXMgYWRkaXRpb25hbCBpbnNpZ2h0cyBsaWtlIG1lcmNoYW50IG5hbWUgb3IgbG9jYXRpb24gaW5mb3JtYXRpb24uIFdlIGNhbGwgdGhpcyBhbiBBc3NldCBSZXBvcnQgd2l0aCBJbnNpZ2h0cy4gQW4gQXNzZXQgUmVwb3J0IHdpdGggSW5zaWdodHMgcHJvdmlkZXMgdHJhbnNhY3Rpb24gY2F0ZWdvcnksIGxvY2F0aW9uLCBhbmQgbWVyY2hhbnQgaW5mb3JtYXRpb24gaW4gYWRkaXRpb24gdG8gdGhlIHRyYW5zYWN0aW9uIHN0cmluZ3MgcHJvdmlkZWQgaW4gYSBzdGFuZGFyZCBBc3NldCBSZXBvcnQuIFRvIHJldHJpZXZlIGFuIEFzc2V0IFJlcG9ydCB3aXRoIEluc2lnaHRzLCBjYWxsIGAvYXNzZXRfcmVwb3J0L2dldGAgZW5kcG9pbnQgd2l0aCBgaW5jbHVkZV9pbnNpZ2h0c2Agc2V0IHRvIGB0cnVlYC4gIEZvciBsYXRlbmN5LXNlbnNpdGl2ZSBhcHBsaWNhdGlvbnMsIHlvdSBjYW4gb3B0aW9uYWxseSBjYWxsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgd2l0aCBgb3B0aW9ucy5hZGRfb25zYCBzZXQgdG8gYFtcXFwiZmFzdF9hc3NldHNcXFwiXWAuIFRoaXMgd2lsbCBjYXVzZSBQbGFpZCB0byBjcmVhdGUgdHdvIHZlcnNpb25zIG9mIHRoZSBBc3NldCBSZXBvcnQ6IG9uZSB3aXRoIG9ubHkgY3VycmVudCBhbmQgYXZhaWxhYmxlIGJhbGFuY2UgYW5kIGlkZW50aXR5IGluZm9ybWF0aW9uLCBhbmQgdGhlbiBsYXRlciBvbiB0aGUgY29tcGxldGUgQXNzZXQgUmVwb3J0LiBZb3Ugd2lsbCByZWNlaXZlIHNlcGFyYXRlIHdlYmhvb2tzIGZvciBlYWNoIHZlcnNpb24gb2YgdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0Fzc2V0UmVwb3J0R2V0UmVxdWVzdH0gYXNzZXRSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYXNzZXRSZXBvcnRHZXQoYXNzZXRSZXBvcnRHZXRSZXF1ZXN0OiBBc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5hc3NldFJlcG9ydEdldChhc3NldFJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCZWZvcmUgY2FsbGluZyBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCwgeW91IG11c3QgZmlyc3QgY3JlYXRlIHRoZSBBc3NldCBSZXBvcnQgdXNpbmcgYC9hc3NldF9yZXBvcnQvY3JlYXRlYCAob3IgZmlsdGVyIGFuIEFzc2V0IFJlcG9ydCB1c2luZyBgL2Fzc2V0X3JlcG9ydC9maWx0ZXJgKSBhbmQgdGhlbiB3YWl0IGZvciB0aGUgW2BQUk9EVUNUX1JFQURZYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvYXNzZXRzLyNwcm9kdWN0X3JlYWR5KSB3ZWJob29rIHRvIGZpcmUsIGluZGljYXRpbmcgdGhhdCB0aGUgUmVwb3J0IGlzIHJlYWR5IHRvIGJlIHJldHJpZXZlZC4gIFRoZSByZXNwb25zZSB0byBgL2Fzc2V0X3JlcG9ydC9wZGYvZ2V0YCBpcyB0aGUgUERGIGJpbmFyeSBkYXRhLiBUaGUgYHJlcXVlc3RfaWRgICBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFBERkdldFJlcXVlc3R9IGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0UGRmR2V0KGFzc2V0UmVwb3J0UERGR2V0UmVxdWVzdDogQXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRQZGZHZXQoYXNzZXRSZXBvcnRQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBbiBBc3NldCBSZXBvcnQgaXMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIGEgdXNlclxcJ3MgYXNzZXRzLiBJbiBvcmRlciB0byBcXFwicmVmcmVzaFxcXCIgYW4gQXNzZXQgUmVwb3J0IHlvdSBjcmVhdGVkIHByZXZpb3VzbHksIHlvdSBjYW4gdXNlIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgQXNzZXQgUmVwb3J0IGJhc2VkIG9uIHRoZSBvbGQgb25lLCBidXQgd2l0aCB0aGUgbW9zdCByZWNlbnQgZGF0YSBhdmFpbGFibGUuICBUaGUgbmV3IEFzc2V0IFJlcG9ydCB3aWxsIGNvbnRhaW4gdGhlIHNhbWUgSXRlbXMgYXMgdGhlIG9yaWdpbmFsIFJlcG9ydCwgYXMgd2VsbCBhcyB0aGUgc2FtZSBmaWx0ZXJzIGFwcGxpZWQgYnkgYW55IGNhbGwgdG8gYC9hc3NldF9yZXBvcnQvZmlsdGVyYC4gQnkgZGVmYXVsdCwgdGhlIG5ldyBBc3NldCBSZXBvcnQgd2lsbCBhbHNvIHVzZSB0aGUgc2FtZSBwYXJhbWV0ZXJzIHlvdSBzdWJtaXR0ZWQgd2l0aCB5b3VyIG9yaWdpbmFsIGAvYXNzZXRfcmVwb3J0L2NyZWF0ZWAgcmVxdWVzdCwgYnV0IHRoZSBvcmlnaW5hbCBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIGFuZCB0aGUgdmFsdWVzIG9mIGFueSBwYXJhbWV0ZXJzIGluIHRoZSBgb3B0aW9uc2Agb2JqZWN0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggbmV3IHZhbHVlcy4gVG8gY2hhbmdlIHRoZXNlIGFyZ3VtZW50cywgc2ltcGx5IHN1cHBseSBuZXcgdmFsdWVzIGZvciB0aGVtIGluIHlvdXIgcmVxdWVzdCB0byBgL2Fzc2V0X3JlcG9ydC9yZWZyZXNoYC4gU3VibWl0IGFuIGVtcHR5IHN0cmluZyAoXFxcIlxcXCIpIGZvciBhbnkgcHJldmlvdXNseS1wb3B1bGF0ZWQgZmllbGRzIHlvdSB3b3VsZCBsaWtlIHNldCBhcyBlbXB0eS5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGFuIEFzc2V0IFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdH0gYXNzZXRSZXBvcnRSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0UmVmcmVzaChhc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0OiBBc3NldFJlcG9ydFJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRSZWZyZXNoKGFzc2V0UmVwb3J0UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2l0ZW0vcmVtb3ZlYCBlbmRwb2ludCBhbGxvd3MgeW91IHRvIGludmFsaWRhdGUgYW4gYGFjY2Vzc190b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm90IGJlIGFibGUgdG8gY3JlYXRlIG5ldyBBc3NldCBSZXBvcnRzIHdpdGggaXQuIFJlbW92aW5nIGFuIEl0ZW0gZG9lcyBub3QgYWZmZWN0IGFueSBBc3NldCBSZXBvcnRzIG9yIEF1ZGl0IENvcGllcyB5b3UgaGF2ZSBhbHJlYWR5IGNyZWF0ZWQsIHdoaWNoIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgdW50aWwgeW91IHJlbW92ZSB0aGVtIHNwZWNpZmljYWxseS4gIFRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFjY2VzcyB0byBhbiBBc3NldCBSZXBvcnQuIFJlbW92aW5nIGFuIEFzc2V0IFJlcG9ydCBpbnZhbGlkYXRlcyBpdHMgYGFzc2V0X3JlcG9ydF90b2tlbmAsIG1lYW5pbmcgeW91IHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YSBvciBjcmVhdGUgbmV3IEF1ZGl0IENvcGllcy4gUmVtb3ZpbmcgYW4gQXNzZXQgUmVwb3J0IGRvZXMgbm90IGFmZmVjdCB0aGUgdW5kZXJseWluZyBJdGVtcywgYnV0IGRvZXMgaW52YWxpZGF0ZSBhbnkgYGF1ZGl0X2NvcHlfdG9rZW5zYCBhc3NvY2lhdGVkIHdpdGggdGhlIEFzc2V0IFJlcG9ydC5cbiAgICAgKiBAc3VtbWFyeSBEZWxldGUgYW4gQXNzZXQgUmVwb3J0XG4gICAgICogQHBhcmFtIHtBc3NldFJlcG9ydFJlbW92ZVJlcXVlc3R9IGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGFzc2V0UmVwb3J0UmVtb3ZlKGFzc2V0UmVwb3J0UmVtb3ZlUmVxdWVzdDogQXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYXNzZXRSZXBvcnRSZW1vdmUoYXNzZXRSZXBvcnRSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9hdXRoL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgYmFuayBhY2NvdW50IGFuZCBiYW5rIGlkZW50aWZpY2F0aW9uIG51bWJlcnMgKHN1Y2ggYXMgcm91dGluZyBudW1iZXJzLCBmb3IgVVMgYWNjb3VudHMpIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtXFwncyBjaGVja2luZywgc2F2aW5ncywgYW5kIGNhc2ggbWFuYWdlbWVudCBhY2NvdW50cywgYWxvbmcgd2l0aCBoaWdoLWxldmVsIGFjY291bnQgZGF0YSBhbmQgYmFsYW5jZXMgd2hlbiBhdmFpbGFibGUuICBWZXJzaW9uaW5nIG5vdGU6IEluIEFQSSB2ZXJzaW9uIDIwMTctMDMtMDgsIHRoZSBzY2hlbWEgb2YgdGhlIGBudW1iZXJzYCBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBlbmRwb2ludCBpcyBzdWJzdGFudGlhbGx5IGRpZmZlcmVudC4gRm9yIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOC0wNS0yMikuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtBdXRoR2V0UmVxdWVzdH0gYXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBhdXRoR2V0KGF1dGhHZXRSZXF1ZXN0OiBBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmF1dGhHZXQoYXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2JhbGFuY2UvZ2V0YCBlbmRwb2ludCB0byBzZWUgdGhlIGF2YWlsYWJsZSBiYWxhbmNlIGluIHlvdXIgYmFuayB0cmFuc2ZlciBhY2NvdW50LiBEZWJpdCB0cmFuc2ZlcnMgaW5jcmVhc2UgdGhpcyBiYWxhbmNlIG9uY2UgdGhlaXIgc3RhdHVzIGlzIHBvc3RlZC4gQ3JlZGl0IHRyYW5zZmVycyBkZWNyZWFzZSB0aGlzIGJhbGFuY2Ugd2hlbiB0aGV5IGFyZSBjcmVhdGVkLiAgVGhlIHRyYW5zYWN0YWJsZSBiYWxhbmNlIHNob3dzIHRoZSBhbW91bnQgaW4geW91ciBhY2NvdW50IHRoYXQgeW91IGFyZSBhYmxlIHRvIHVzZSBmb3IgdHJhbnNmZXJzLCBhbmQgaXMgZXNzZW50aWFsbHkgeW91ciBhdmFpbGFibGUgYmFsYW5jZSBtaW51cyB5b3VyIG1pbmltdW0gYmFsYW5jZS4gIE5vdGUgdGhhdCB0aGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBGQk8gYWNjb3VudHMsIHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEZ1bGwgU2VydmljZSBjb25maWd1cmF0aW9uLiBJdCBjYW5ub3QgYmUgdXNlZCBvbiB5b3VyIG93biBhY2NvdW50IHdoZW4gdXNpbmcgQmFuayBUcmFuc2ZlcnMgaW4gdGhlIEJUUyBQbGF0Zm9ybSBjb25maWd1cmF0aW9uLlxuICAgICAqIEBzdW1tYXJ5IEdldCBiYWxhbmNlIG9mIHlvdXIgQmFuayBUcmFuc2ZlciBhY2NvdW50XG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdH0gYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJCYWxhbmNlR2V0KGJhbmtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0OiBCYW5rVHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckJhbGFuY2VHZXQoYmFua1RyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iYW5rX3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgYmFuayB0cmFuc2Zlci4gIEEgdHJhbnNmZXIgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGF0aW9uIGlmIHRoZSBgY2FuY2VsbGFibGVgIHByb3BlcnR5IHJldHVybmVkIGJ5IGAvYmFua190cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSBiYW5rIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtCYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSBiYW5rVHJhbnNmZXJDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmFua1RyYW5zZmVyQ2FuY2VsKGJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3Q6IEJhbmtUcmFuc2ZlckNhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iYW5rVHJhbnNmZXJDYW5jZWwoYmFua1RyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyBiYW5rIHRyYW5zZmVyLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IGJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJDcmVhdGUoYmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdDogQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckNyZWF0ZShiYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCBlbmRwb2ludCB0byBnZXQgYSBsaXN0IG9mIFBsYWlkLWluaXRpYXRlZCBBQ0ggb3IgYmFuayB0cmFuc2ZlciBldmVudHMgYmFzZWQgb24gc3BlY2lmaWVkIGZpbHRlciBjcml0ZXJpYS4gV2hlbiB1c2luZyBBdXRoIHdpdGggbWljcm8tZGVwb3NpdCB2ZXJpZmljYXRpb24gZW5hYmxlZCwgdGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBmZXRjaCBzdGF0dXMgdXBkYXRlcyBvbiBBQ0ggbWljcm8tZGVwb3NpdHMuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbbWljcm8tZGVwb3NpdCBldmVudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICogQHN1bW1hcnkgTGlzdCBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50TGlzdChiYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRMaXN0KGJhbmtUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvYmFua190cmFuc2Zlci9ldmVudC9zeW5jYCBhbGxvd3MgeW91IHRvIHJlcXVlc3QgdXAgdG8gdGhlIG5leHQgMjUgUGxhaWQtaW5pdGlhdGVkIGJhbmsgdHJhbnNmZXIgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYWZ0ZXIgYSBzcGVjaWZpYyBgZXZlbnRfaWRgLiBXaGVuIHVzaW5nIEF1dGggd2l0aCBtaWNyby1kZXBvc2l0IHZlcmlmaWNhdGlvbiBlbmFibGVkLCB0aGlzIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGZldGNoIHN0YXR1cyB1cGRhdGVzIG9uIEFDSCBtaWNyby1kZXBvc2l0cy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIFttaWNyby1kZXBvc2l0IGV2ZW50c10oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS9taWNyb2RlcG9zaXQtZXZlbnRzLykuXG4gICAgICogQHN1bW1hcnkgU3luYyBiYW5rIHRyYW5zZmVyIGV2ZW50c1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gYmFua1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2ZlckV2ZW50U3luYyhiYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBCYW5rVHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyRXZlbnRTeW5jKGJhbmtUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2JhbmtfdHJhbnNmZXIvZ2V0YCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiYW5rIHRyYW5zZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBiYW5rX3RyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIGJhbmsgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlckdldFJlcXVlc3R9IGJhbmtUcmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJHZXQoYmFua1RyYW5zZmVyR2V0UmVxdWVzdDogQmFua1RyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlckdldChiYW5rVHJhbnNmZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvYmFua190cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIGJhbmsgdHJhbnNmZXJzIGFuZCB0aGVpciBzdGF0dXNlcy4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgYmFuayB0cmFuc2ZlcnMuIFxuICAgICAqIEBzdW1tYXJ5IExpc3QgYmFuayB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0fSBiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJhbmtUcmFuc2Zlckxpc3QoYmFua1RyYW5zZmVyTGlzdFJlcXVlc3Q6IEJhbmtUcmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmFua1RyYW5zZmVyTGlzdChiYW5rVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXMgYW4gYWx0ZXJuYXRpdmUgdG8gYWRkaW5nIEl0ZW1zIHZpYSBMaW5rLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgL2JhbmtfdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBlbmRwb2ludCB0byBtaWdyYXRlIGtub3duIGFjY291bnQgYW5kIHJvdXRpbmcgbnVtYmVycyB0byBQbGFpZCBJdGVtcy4gIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggQmFuayBUcmFuc2ZlciBlbmRwb2ludHMuICBJZiB5b3UgcmVxdWlyZSBhY2Nlc3MgdG8gb3RoZXIgZW5kcG9pbnRzLCBjcmVhdGUgdGhlIEl0ZW0gdGhyb3VnaCBMaW5rIGluc3RlYWQuICBBY2Nlc3MgdG8gYC9iYW5rX3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdDsgdG8gb2J0YWluIGFjY2VzcywgY29udGFjdCB5b3VyIFBsYWlkIEFjY291bnQgTWFuYWdlci5cbiAgICAgKiBAc3VtbWFyeSBNaWdyYXRlIGFjY291bnQgaW50byBCYW5rIFRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudChiYW5rVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3Q6IEJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50KGJhbmtUcmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9nZXRgIGVuZHBvaW50IGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7QmFua1RyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0fSBiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcEdldChiYW5rVHJhbnNmZXJTd2VlcEdldFJlcXVlc3Q6IEJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwR2V0KGJhbmtUcmFuc2ZlclN3ZWVwR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmFua190cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzd2VlcHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGZpbHRlcnMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBzd2VlcHNcbiAgICAgKiBAcGFyYW0ge0JhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3R9IGJhbmtUcmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiYW5rVHJhbnNmZXJTd2VlcExpc3QoYmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdDogQmFua1RyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJhbmtUcmFuc2ZlclN3ZWVwTGlzdChiYW5rVHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9iZWFjb24vYWNjb3VudF9yaXNrL3YxL2V2YWx1YXRlYCB0byBnZXQgcmlzayBpbnNpZ2h0cyBmb3IgYSBsaW5rZWQgYWNjb3VudC5cbiAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSByaXNrIG9mIGEgYmFuayBhY2NvdW50XG4gICAgICogQHBhcmFtIHtCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdH0gYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25BY2NvdW50Umlza0V2YWx1YXRlKGJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGVSZXF1ZXN0OiBCZWFjb25BY2NvdW50Umlza0V2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvbkFjY291bnRSaXNrRXZhbHVhdGUoYmVhY29uQWNjb3VudFJpc2tFdmFsdWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCZWFjb24gRHVwbGljYXRlIGZvciBhIGdpdmVuIEJlYWNvbiBEdXBsaWNhdGUgaWQuICBBIEJlYWNvbiBEdXBsaWNhdGUgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc2ltaWxhciBCZWFjb24gVXNlcnMgd2l0aGluIHlvdXIgb3JnYW5pemF0aW9uLiAgVHdvIEJlYWNvbiBVc2VyIHJldmlzaW9ucyBhcmUgcmV0dXJuZWQgZm9yIGVhY2ggRHVwbGljYXRlIHJlY29yZCBpbiBlaXRoZXIgdGhlIGBiZWFjb25fdXNlcjFgIG9yIGBiZWFjb25fdXNlcjJgIHJlc3BvbnNlIGZpZWxkcy4gIFRoZSBgYW5hbHlzaXNgIGZpZWxkIGluIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgd2hpY2ggZmllbGRzIG1hdGNoZWQgYmV0d2VlbiBgYmVhY29uX3VzZXIxYCBhbmQgYGJlYWNvbl91c2VyMmAuIFxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBEdXBsaWNhdGVcbiAgICAgKiBAcGFyYW0ge0JlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3R9IGJlYWNvbkR1cGxpY2F0ZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBiZWFjb25EdXBsaWNhdGVHZXQoYmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdDogQmVhY29uRHVwbGljYXRlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmJlYWNvbkR1cGxpY2F0ZUdldChiZWFjb25EdXBsaWNhdGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBmcmF1ZCByZXBvcnQgZm9yIGEgZ2l2ZW4gQmVhY29uIFVzZXIuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgQmVhY29uIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdH0gYmVhY29uUmVwb3J0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydENyZWF0ZShiZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0OiBCZWFjb25SZXBvcnRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0Q3JlYXRlKGJlYWNvblJlcG9ydENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBCZWFjb24gcmVwb3J0IGZvciBhIGdpdmVuIEJlYWNvbiByZXBvcnQgaWQuXG4gICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0R2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblJlcG9ydEdldChiZWFjb25SZXBvcnRHZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uUmVwb3J0R2V0KGJlYWNvblJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0L2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIEJlYWNvbiBVc2VyLiBUaGUgcmVwb3J0cyByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50IGFyZSBleGNsdXNpdmVseSByZXBvcnRzIHlvdSBjcmVhdGVkIGZvciBhIHNwZWNpZmljIHVzZXIuIEEgQmVhY29uIFVzZXIgY2FuIG9ubHkgaGF2ZSBvbmUgYWN0aXZlIHJlcG9ydCBhdCBhIHRpbWUsIGJ1dCBhIG5ldyByZXBvcnQgY2FuIGJlIGNyZWF0ZWQgaWYgYSBwcmV2aW91cyByZXBvcnQgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIHJlc3VsdHMgZnJvbSB0aGlzIGVuZHBvaW50IGFyZSBwYWdpbmF0ZWQ7IHRoZSBgbmV4dF9jdXJzb3JgIGZpZWxkIHdpbGwgYmUgcG9wdWxhdGVkIGlmIHRoZXJlIGlzIGFub3RoZXIgcGFnZSBvZiByZXN1bHRzIHRoYXQgY2FuIGJlIHJldHJpZXZlZC4gVG8gZmV0Y2ggdGhlIG5leHQgcGFnZSwgcGFzcyB0aGUgYG5leHRfY3Vyc29yYCB2YWx1ZSBhcyB0aGUgYGN1cnNvcmAgcGFyYW1ldGVyIGluIHRoZSBuZXh0IHJlcXVlc3QuXG4gICAgICogQHN1bW1hcnkgTGlzdCBCZWFjb24gUmVwb3J0cyBmb3IgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uUmVwb3J0TGlzdFJlcXVlc3R9IGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0TGlzdChiZWFjb25SZXBvcnRMaXN0UmVxdWVzdDogQmVhY29uUmVwb3J0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRMaXN0KGJlYWNvblJlcG9ydExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBmb3IgYSBnaXZlbiBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9uIGlkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0JlYWNvblJlcG9ydFN5bmRpY2F0aW9uR2V0UmVxdWVzdH0gYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXQoYmVhY29uUmVwb3J0U3luZGljYXRpb25HZXRSZXF1ZXN0OiBCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldChiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9iZWFjb24vcmVwb3J0X3N5bmRpY2F0aW9uL2xpc3RgIGVuZHBvaW50IHRvIHZpZXcgYWxsIEJlYWNvbiBSZXBvcnRzIHRoYXQgaGF2ZSBiZWVuIHN5bmRpY2F0ZWQgdG8gYSBzcGVjaWZpYyBCZWFjb24gVXNlci4gVGhpcyBlbmRwb2ludCByZXR1cm5zIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIHdoaWNoIGFyZSByZWZlcmVuY2VzIHRvIEJlYWNvbiBSZXBvcnRzIGNyZWF0ZWQgZWl0aGVyIGJ5IHlvdSwgb3IgYW5vdGhlciBCZWFjb24gY3VzdG9tZXIsIHRoYXQgbWF0Y2hlZCB0aGUgc3BlY2lmaWVkIEJlYWNvbiBVc2VyLiBBIEJlYWNvbiBVc2VyIGNhbiBoYXZlIG11bHRpcGxlIGFjdGl2ZSBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBhdCBvbmNlLiBUaGUgcmVzdWx0cyBmcm9tIHRoaXMgZW5kcG9pbnQgYXJlIHBhZ2luYXRlZDsgdGhlIGBuZXh0X2N1cnNvcmAgZmllbGQgd2lsbCBiZSBwb3B1bGF0ZWQgaWYgdGhlcmUgaXMgYW5vdGhlciBwYWdlIG9mIHJlc3VsdHMgdGhhdCBjYW4gYmUgcmV0cmlldmVkLiBUbyBmZXRjaCB0aGUgbmV4dCBwYWdlLCBwYXNzIHRoZSBgbmV4dF9jdXJzb3JgIHZhbHVlIGFzIHRoZSBgY3Vyc29yYCBwYXJhbWV0ZXIgaW4gdGhlIG5leHQgcmVxdWVzdC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGZvciBhIEJlYWNvbiBVc2VyXG4gICAgICogQHBhcmFtIHtCZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0fSBiZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0KGJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3Q6IEJlYWNvblJlcG9ydFN5bmRpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25SZXBvcnRTeW5kaWNhdGlvbkxpc3QoYmVhY29uUmVwb3J0U3luZGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGFsbCBBY2NvdW50cyBsaW5rZWQgdG8gdGhpcyBCZWFjb24gVXNlci4gVGhlIGluc2lnaHRzIGZvciBlYWNoIGFjY291bnQgYXJlIGNvbXB1dGVkIGJhc2VkIG9uIHRoZSBpbmZvcm1hdGlvbiB0aGF0IHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHRoZSBmaW5hbmNpYWwgaW5zdGl0dXRpb24uXG4gICAgICogQHN1bW1hcnkgR2V0IEFjY291bnQgSW5zaWdodHMgZm9yIGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXQoYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldFJlcXVlc3Q6IEJlYWNvblVzZXJBY2NvdW50SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckFjY291bnRJbnNpZ2h0c0dldChiZWFjb25Vc2VyQWNjb3VudEluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuZCBzY2FuIGEgQmVhY29uIFVzZXIgYWdhaW5zdCB5b3VyIEJlYWNvbiBQcm9ncmFtLCBhY2NvcmRpbmcgdG8geW91ciBwcm9ncmFtXFwncyBzZXR0aW5ncy4gIFdoZW4geW91IHN1Ym1pdCBhIG5ldyB1c2VyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseTogICAgLSBUaGUgdXNlclxcJ3MgUElJIChwcm92aWRlZCB3aXRoaW4gdGhlIGB1c2VyYCBvYmplY3QpIGlzIHNlYXJjaGVkIGFnYWluc3QgYWxsIG90aGVyIHVzZXJzIHdpdGhpbiB0aGUgQmVhY29uIFByb2dyYW0geW91IHNwZWNpZmllZC4gSWYgYSBtYXRjaCBpcyBmb3VuZCB0aGF0IHZpb2xhdGVzIHlvdXIgcHJvZ3JhbVxcJ3MgXFxcIkR1cGxpY2F0ZSBJbmZvcm1hdGlvbiBGaWx0ZXJpbmdcXFwiIHNldHRpbmdzLCB0aGUgdXNlciB3aWxsIGJlIHJldHVybmVkIHdpdGggYSBzdGF0dXMgb2YgYHBlbmRpbmdfcmV2aWV3YC4gICAgLSBUaGUgdXNlclxcJ3MgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckNyZWF0ZVJlcXVlc3R9IGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlckNyZWF0ZShiZWFjb25Vc2VyQ3JlYXRlUmVxdWVzdDogQmVhY29uVXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyQ3JlYXRlKGJlYWNvblVzZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGZXRjaCBhIEJlYWNvbiBVc2VyLiAgVGhlIEJlYWNvbiBVc2VyIGlzIHJldHVybmVkIHdpdGggYWxsIG9mIHRoZWlyIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24gYW5kIGEgYHN0YXR1c2AgYmFzZWQgb24gdGhlIEJlYWNvbiBOZXR3b3JrIGR1cGxpY2F0ZSByZWNvcmQgYW5kIGZyYXVkIGNoZWNrcy4gXG4gICAgICogQHN1bW1hcnkgR2V0IGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJHZXRSZXF1ZXN0fSBiZWFjb25Vc2VyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJHZXQoYmVhY29uVXNlckdldFJlcXVlc3Q6IEJlYWNvblVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckdldChiZWFjb25Vc2VyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgQmVhY29uIFVzZXIgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBCZWFjb24gVXNlclxcJ3MgaGlzdG9yeVxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdH0gYmVhY29uVXNlckhpc3RvcnlMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJIaXN0b3J5TGlzdChiZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0OiBCZWFjb25Vc2VySGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlckhpc3RvcnlMaXN0KGJlYWNvblVzZXJIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIGEgQmVhY29uIFVzZXIuICBXaGVuIHVwZGF0aW5nIGEgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB2aWEgdGhpcyBlbmRwb2ludCwgUGxhaWQgdmFsaWRhdGVzIHRoYXQgdGhlIHN0YXR1cyBjaGFuZ2UgaXMgY29uc2lzdGVudCB3aXRoIHRoZSByZWxhdGVkIHN0YXRlIGZvciB0aGlzIEJlYWNvbiBVc2VyLiBTcGVjaWZpY2FsbHksIHdlIHdpbGwgY2hlY2s6ICAxLiBXaGV0aGVyIHRoZXJlIGFyZSBhbnkgYXNzb2NpYXRlZCBCZWFjb24gUmVwb3J0cyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLCBhbmQgMi4gV2hldGhlciB0aGVyZSBhcmUgYW55IGNvbmZpcm1lZCBCZWFjb24gUmVwb3J0IFN5bmRpY2F0aW9ucyBjb25uZWN0ZWQgdG8gdGhlIEJlYWNvbiBVc2VyLiAgV2hlbiB1cGRhdGluZyBhIEJlYWNvbiBVc2VyXFwncyBzdGF0dXMgdG8gXFxcInJlamVjdGVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IGVpdGhlciBhIEJlYWNvbiBSZXBvcnQgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIEJlYWNvbiBVc2VyIG9yIGEgQmVhY29uIFJlcG9ydCBTeW5kaWNhdGlvbiBoYXMgYmVlbiBjb25maXJtZWQuIFdoZW4gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJjbGVhcmVkXFxcIiwgd2UgZW5mb3JjZSB0aGF0IHRoZXJlIGFyZSBubyBhY3RpdmUgQmVhY29uIFJlcG9ydHMgb3IgY29uZmlybWVkIEJlYWNvbiBSZXBvcnQgU3luZGljYXRpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlci4gSWYgeW91IHByZXZpb3VzbHkgY3JlYXRlZCBhIEJlYWNvbiBSZXBvcnQgZm9yIHRoaXMgdXNlciwgeW91IG11c3QgZGVsZXRlIGl0IGJlZm9yZSB1cGRhdGluZyB0aGUgQmVhY29uIFVzZXJcXCdzIHN0YXR1cyB0byBcXFwiY2xlYXJlZFxcXCIuIFRoZXJlIGFyZSBubyByZXN0cmljdGlvbnMgb24gdXBkYXRpbmcgYSBCZWFjb24gVXNlclxcJ3Mgc3RhdHVzIHRvIFxcXCJwZW5kaW5nX3Jldmlld1xcXCIuICBJZiB0aGVzZSBjb25kaXRpb25zIGFyZSBub3QgbWV0LCB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlamVjdGVkIHdpdGggYW4gZXJyb3IgZXhwbGFpbmluZyB0aGUgaXNzdWUuXG4gICAgICogQHN1bW1hcnkgUmV2aWV3IGEgQmVhY29uIFVzZXJcbiAgICAgKiBAcGFyYW0ge0JlYWNvblVzZXJSZXZpZXdSZXF1ZXN0fSBiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGJlYWNvblVzZXJSZXZpZXcoYmVhY29uVXNlclJldmlld1JlcXVlc3Q6IEJlYWNvblVzZXJSZXZpZXdSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuYmVhY29uVXNlclJldmlldyhiZWFjb25Vc2VyUmV2aWV3UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBpZGVudGl0eSBkYXRhIGZvciBhIEJlYWNvbiBVc2VyIGluIHlvdXIgQmVhY29uIFByb2dyYW0gb3IgYWRkIG5ldyBhY2NvdW50cyB0byB0aGUgQmVhY29uIFVzZXIuICBTaW1pbGFyIHRvIGAvYmVhY29uL3VzZXIvY3JlYXRlYCwgc2V2ZXJhbCBjaGVja3MgYXJlIHBlcmZvcm1lZCBpbW1lZGlhdGVseSB3aGVuIHlvdSBzdWJtaXQgYW4gaWRlbnRpdHkgZGF0YSBjaGFuZ2UgdG8gYC9iZWFjb24vdXNlci91cGRhdGVgOiAgICAtIFRoZSB1c2VyXFwncyB1cGRhdGVkIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBvdGhlciB1c2VycyB3aXRoaW4gdGhlIEJlYWNvbiBQcm9ncmFtIHlvdSBzcGVjaWZpZWQuIElmIGEgbWF0Y2ggaXMgZm91bmQgdGhhdCB2aW9sYXRlcyB5b3VyIHByb2dyYW1cXCdzIFxcXCJEdXBsaWNhdGUgSW5mb3JtYXRpb24gRmlsdGVyaW5nXFxcIiBzZXR0aW5ncywgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGBwZW5kaW5nX3Jldmlld2AuICAgIC0gVGhlIHVzZXJcXCdzIHVwZGF0ZWQgUElJIGlzIGFsc28gc2VhcmNoZWQgYWdhaW5zdCBhbGwgZnJhdWQgcmVwb3J0cyBjcmVhdGVkIGJ5IHlvdXIgb3JnYW5pemF0aW9uIGFjcm9zcyBhbGwgb2YgeW91ciBCZWFjb24gUHJvZ3JhbXMuIElmIHRoZSB1c2VyXFwncyBkYXRhIG1hdGNoZXMgYSBmcmF1ZCByZXBvcnQgdGhhdCB5b3VyIHRlYW0gY3JlYXRlZCwgdGhlIHVzZXIgd2lsbCBiZSByZXR1cm5lZCB3aXRoIGEgc3RhdHVzIG9mIGByZWplY3RlZGAuICAgIC0gRmluYWxseSwgdGhlIHVzZXJcXCdzIFBJSSBpcyBzZWFyY2hlZCBhZ2FpbnN0IGFsbCBmcmF1ZCByZXBvcnQgc2hhcmVkIHdpdGggdGhlIEJlYWNvbiBOZXR3b3JrIGJ5IG90aGVyIGNvbXBhbmllcy4gSWYgYSBtYXRjaGluZyBmcmF1ZCByZXBvcnQgaXMgZm91bmQsIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhIGBwZW5kaW5nX3Jldmlld2Agc3RhdHVzIGlmIHlvdXIgcHJvZ3JhbSBoYXMgZW5hYmxlZCBhdXRvbWF0aWMgZmxhZ2dpbmcgYmFzZWQgb24gbmV0d29yayBmcmF1ZC4gIFBsYWlkIG1haW50YWlucyBhIHZlcnNpb24gaGlzdG9yeSBmb3IgZWFjaCBCZWFjb24gVXNlciwgc28gdGhlIEJlYWNvbiBVc2VyXFwncyBpZGVudGl0eSBkYXRhIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIHVwZGF0ZSBpcyByZXRhaW5lZCBhcyBzZXBhcmF0ZSB2ZXJzaW9ucy5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGlkZW50aXR5IGRhdGEgb2YgYSBCZWFjb24gVXNlclxuICAgICAqIEBwYXJhbSB7QmVhY29uVXNlclVwZGF0ZVJlcXVlc3R9IGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgYmVhY29uVXNlclVwZGF0ZShiZWFjb25Vc2VyVXBkYXRlUmVxdWVzdDogQmVhY29uVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5iZWFjb25Vc2VyVXBkYXRlKGJlYWNvblVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZW5kIGEgcmVxdWVzdCB0byB0aGUgYC9jYXRlZ29yaWVzL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIGNhdGVnb3JpZXMgcmV0dXJuZWQgYnkgUGxhaWQuIFRoaXMgZW5kcG9pbnQgZG9lcyBub3QgcmVxdWlyZSBhdXRoZW50aWNhdGlvbi4gIEFsbCBpbXBsZW1lbnRhdGlvbnMgYXJlIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUgbmV3ZXIgYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnlgIHRheG9ub215IGluc3RlYWQgb2YgdGhlIG9sZGVyIGBjYXRlZ29yeWAgdGF4b25vbXkgc3VwcG9ydGVkIGJ5IHRoaXMgZW5kcG9pbnQuIFRoZSBbYHBlcnNvbmFsX2ZpbmFuY2VfY2F0ZWdvcnkgdGF4b25vbXlgIENTViBmaWxlXShodHRwczovL3BsYWlkLmNvbS9kb2N1bWVudHMvdHJhbnNhY3Rpb25zLXBlcnNvbmFsLWZpbmFuY2UtY2F0ZWdvcnktdGF4b25vbXkuY3N2KSBpcyBhdmFpbGFibGUgZm9yIGRvd25sb2FkIGFuZCBpcyBub3QgYWNjZXNzaWJsZSB2aWEgQVBJLlxuICAgICAqIEBzdW1tYXJ5IEdldCBjYXRlZ29yaWVzXG4gICAgICogQHBhcmFtIHtvYmplY3R9IGJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjYXRlZ29yaWVzR2V0KGJvZHk6IG9iamVjdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNhdGVnb3JpZXNHZXQoYm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIEl0ZW0gY29uc2VudCBldmVudHMuIENvbnNlbnQgbG9ncyBhcmUgb25seSBhdmFpbGFibGUgZm9yIGV2ZW50cyBvY2N1cnJpbmcgb24gb3IgYWZ0ZXIgTm92ZW1iZXIgNywgMjAyNC4gVXAgdG8gdGhyZWUgeWVhcnMgb2YgY29uc2VudCBsb2dzIHdpbGwgYmUgYXZhaWxhYmxlIHZpYSB0aGUgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIGhpc3RvcmljYWwgbG9nIG9mIGl0ZW0gY29uc2VudCBldmVudHNcbiAgICAgKiBAcGFyYW0ge0NvbnNlbnRFdmVudHNHZXRSZXF1ZXN0fSBjb25zZW50RXZlbnRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNvbnNlbnRFdmVudHNHZXQoY29uc2VudEV2ZW50c0dldFJlcXVlc3Q6IENvbnNlbnRFdmVudHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY29uc2VudEV2ZW50c0dldChjb25zZW50RXZlbnRzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIGFsbCBleGlzdGluZyBDUkIgQmFuayBJbmNvbWUgYW5kIEJhc2UgcmVwb3J0cyBmb3IgdGhlIGNvbnN1bWVyIGluIFBERiBmb3JtYXQuICBSZXNwb25zZSBpcyBQREYgYmluYXJ5IGRhdGEuIFRoZSBgcmVxdWVzdF9pZGAgaXMgcmV0dXJuZWQgaW4gdGhlIGBQbGFpZC1SZXF1ZXN0LUlEYCBoZWFkZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBQREYgUmVwb3J0c1xuICAgICAqIEBwYXJhbSB7Q29uc3VtZXJSZXBvcnRQREZHZXRSZXF1ZXN0fSBjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdW1lclJlcG9ydFBkZkdldChjb25zdW1lclJlcG9ydFBERkdldFJlcXVlc3Q6IENvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNvbnN1bWVyUmVwb3J0UGRmR2V0KGNvbnN1bWVyUmVwb3J0UERGR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvYmFua19pbmNvbWUvY3JlYXRlYCBjcmVhdGVzIGEgQ1JBIHJlcG9ydCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIENSQSByZXBvcnQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0fSBjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUJhbmtJbmNvbWVDcmVhdGUoY3JhQmFua0luY29tZUNyZWF0ZVJlcXVlc3Q6IENyYUJhbmtJbmNvbWVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQmFua0luY29tZUNyZWF0ZShjcmFCYW5rSW5jb21lQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvYmFua19pbmNvbWUvZ2V0YCByZXR1cm5zIHRoZSBiYW5rIGluY29tZSByZXBvcnQocykgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgYmFuayBhY2NvdW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmFCYW5rSW5jb21lR2V0UmVxdWVzdH0gY3JhQmFua0luY29tZUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFCYW5rSW5jb21lR2V0KGNyYUJhbmtJbmNvbWVHZXRSZXF1ZXN0OiBDcmFCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUJhbmtJbmNvbWVHZXQoY3JhQmFua0luY29tZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgQmFzZSBSZXBvcnQgZm9yIHlvdXIgdXNlciwgYWxsb3dpbmcgeW91IHRvIHJlY2VpdmUgY29tcHJlaGVuc2l2ZSBiYW5rIGFjY291bnQgYW5kIGNhc2ggZmxvdyBkYXRhLiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzblxcJ3QgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIEJhc2UgUmVwb3J0XG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0KGNyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0QmFzZVJlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydEJhc2VSZXBvcnRHZXQoY3JhQ2hlY2tSZXBvcnRCYXNlUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBDYXNoZmxvdyBJbnNpZ2h0cyByZXBvcnQgZm9yIHlvdXIgdXNlci4gWW91IHNob3VsZCBjYWxsIHRoaXMgZW5kcG9pbnQgYWZ0ZXIgeW91XFwndmUgcmVjZWl2ZWQgdGhlIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGluc2lnaHRzLCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gIElmIHlvdSBkaWQgbm90IGluaXRpYWxpemUgTGluayB3aXRoIHRoZSBgY3JhX2Nhc2hmbG93X2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20geW91ciB1c2VyXFwncyBiYW5raW5nIGRhdGFcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnRDYXNoZmxvd0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0Q2FzaGZsb3dJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydENhc2hmbG93SW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBjcmVhdGVzIGEgQ29uc3VtZXIgUmVwb3J0IHBvd2VyZWQgYnkgUGxhaWQgQ2hlY2suIFlvdSBjYW4gY2FsbCB0aGlzIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyByZXBvcnQgaWYgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCB3YXMgb21pdHRlZCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbi4gSWYgeW91IGRpZCBwcm92aWRlIGEgYGNvbnN1bWVyX3JlcG9ydF9wZXJtaXNzaWJsZV9wdXJwb3NlYCBkdXJpbmcgTGluayB0b2tlbiBjcmVhdGlvbiwgdGhlbiBQbGFpZCBDaGVjayB3aWxsIGF1dG9tYXRpY2FsbHkgYmVnaW4gY3JlYXRpbmcgYSBDb25zdW1lciBSZXBvcnQgb25jZSB0aGUgdXNlciBjb21wbGV0ZXMgdGhlIExpbmsgcHJvY2VzcywgYW5kIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gY2FsbCBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYCBiZWZvcmUgcmV0cmlldmluZyB0aGUgcmVwb3J0LiAgIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVmcmVzaCBkYXRhIGluIGFuIGV4aXN0aW5nIHJlcG9ydC4gQSBDb25zdW1lciBSZXBvcnQgd2lsbCBsYXN0IGZvciAyNCBob3VycyBiZWZvcmUgZXhwaXJpbmc7IHlvdSBzaG91bGQgY2FsbCBhbnkgYC9nZXRgIGVuZHBvaW50cyBvbiB0aGUgcmVwb3J0IGJlZm9yZSBpdCBleHBpcmVzLiBJZiBhIHJlcG9ydCBleHBpcmVzLCB5b3UgY2FuIGNhbGwgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAgYWdhaW4gdG8gcmUtZ2VuZXJhdGUgaXQuIE5vdGUgdGhhdCByZWZyZXNoaW5nIG9yIHJlZ2VuZXJhdGluZyBhIHJlcG9ydCBpcyBhIGJpbGxhYmxlIGV2ZW50LlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIENvbnN1bWVyIFJlcG9ydFxuICAgICAqIEBwYXJhbSB7Q3JhQ2hlY2tSZXBvcnRDcmVhdGVSZXF1ZXN0fSBjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydENyZWF0ZShjcmFDaGVja1JlcG9ydENyZWF0ZVJlcXVlc3Q6IENyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0Q3JlYXRlKGNyYUNoZWNrUmVwb3J0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBJbmNvbWUgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuICBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBlbmRwb2ludCBhZnRlciB5b3VcXCd2ZSByZWNlaXZlZCBhIGBDSEVDS19SRVBPUlRfUkVBRFlgIHdlYmhvb2ssIGVpdGhlciBhZnRlciB0aGUgTGluayBzZXNzaW9uIGZvciB0aGUgdXNlciBvciBhZnRlciBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiBJZiB0aGUgbW9zdCByZWNlbnQgY29uc3VtZXIgcmVwb3J0IGZvciB0aGUgdXNlciBkb2VzbuKAmXQgaGF2ZSBzdWZmaWNpZW50IGRhdGEgdG8gZ2VuZXJhdGUgdGhlIGJhc2UgcmVwb3J0LCBvciB0aGUgY29uc3VtZXIgcmVwb3J0IGhhcyBleHBpcmVkLCB5b3Ugd2lsbCByZWNlaXZlIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB5b3Ugc2hvdWxkIGNyZWF0ZSBhIG5ldyBjb25zdW1lciByZXBvcnQgYnkgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBjYXNoIGZsb3cgaW5mb3JtYXRpb24gZnJvbSB5b3VyIHVzZXJcXCdzIGJhbmtzXG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydEluY29tZUluc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYUNoZWNrUmVwb3J0SW5jb21lSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRJbmNvbWVJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB0aGUgTmV0d29yayBJbnNpZ2h0cyBwcm9kdWN0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSByZXBvcnQsIG9yIHRoZSBjb25zdW1lciByZXBvcnQgaGFzIGV4cGlyZWQsIHlvdSB3aWxsIHJlY2VpdmUgYW4gZXJyb3IgaW5kaWNhdGluZyB0aGF0IHlvdSBzaG91bGQgY3JlYXRlIGEgbmV3IGNvbnN1bWVyIHJlcG9ydCBieSBjYWxsaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLiAgSWYgeW91IGRpZCBub3QgaW5pdGlhbGl6ZSBMaW5rIHdpdGggdGhlIGBjcmFfbmV0d29ya19hdHRyaWJ1dGVzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGdlbmVyYXRlIHRoZSBhdHRyaWJ1dGVzIHdoZW4geW91IGNhbGwgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGF0dHJpYnV0ZXMgZm9yIHRoZSB1c2VyXG4gICAgICogQHBhcmFtIHtDcmFDaGVja1JlcG9ydE5ldHdvcmtJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0KGNyYUNoZWNrUmVwb3J0TmV0d29ya0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnROZXR3b3JrSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgdGhlIFBhcnRuZXIgSW5zaWdodHMgcmVwb3J0IGZvciB5b3VyIHVzZXIuIFlvdSBzaG91bGQgY2FsbCB0aGlzIGVuZHBvaW50IGFmdGVyIHlvdVxcJ3ZlIHJlY2VpdmVkIHRoZSBgQ0hFQ0tfUkVQT1JUX1JFQURZYCB3ZWJob29rLCBlaXRoZXIgYWZ0ZXIgdGhlIExpbmsgc2Vzc2lvbiBmb3IgdGhlIHVzZXIgb3IgYWZ0ZXIgY2FsbGluZyBgL2NyYS9jaGVja19yZXBvcnQvY3JlYXRlYC4gSWYgdGhlIG1vc3QgcmVjZW50IGNvbnN1bWVyIHJlcG9ydCBmb3IgdGhlIHVzZXIgZG9lc27igJl0IGhhdmUgc3VmZmljaWVudCBkYXRhIHRvIGdlbmVyYXRlIHRoZSBiYXNlIHJlcG9ydCwgb3IgdGhlIGNvbnN1bWVyIHJlcG9ydCBoYXMgZXhwaXJlZCwgeW91IHdpbGwgcmVjZWl2ZSBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgeW91IHNob3VsZCBjcmVhdGUgYSBuZXcgY29uc3VtZXIgcmVwb3J0IGJ5IGNhbGxpbmcgYC9jcmEvY2hlY2tfcmVwb3J0L2NyZWF0ZWAuICBJZiB5b3UgZGlkIG5vdCBpbml0aWFsaXplIExpbmsgd2l0aCB0aGUgYGNyZWRpdF9wYXJ0bmVyX2luc2lnaHRzYCBwcm9kdWN0IG9yIGhhdmUgZ2VuZXJhdGVkIGEgcmVwb3J0IHVzaW5nIGAvY3JhL2NoZWNrX3JlcG9ydC9jcmVhdGVgLCB3ZSB3aWxsIGNhbGwgb3VyIHBhcnRuZXJzIHRvIGdlbmVyYXRlIHRoZSBpbnNpZ2h0cyB3aGVuIHlvdSBjYWxsIHRoaXMgZW5kcG9pbnQuIEluIHRoaXMgY2FzZSwgeW91IG1heSBvcHRpb25hbGx5IHByb3ZpZGUgcGFyYW1ldGVycyB1bmRlciBgb3B0aW9uc2AgdG8gY29uZmlndXJlIHdoaWNoIGluc2lnaHRzIHlvdSB3YW50IHRvIHJlY2VpdmUuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gcGFydG5lcnNcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXQoY3JhQ2hlY2tSZXBvcnRQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldChjcmFDaGVja1JlcG9ydFBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2NoZWNrX3JlcG9ydC9wZGYvZ2V0YCByZXRyaWV2ZXMgdGhlIG1vc3QgcmVjZW50IENvbnN1bWVyIFJlcG9ydCBpbiBQREYgZm9ybWF0LiBCeSBkZWZhdWx0LCB0aGUgbW9zdCByZWNlbnQgQmFzZSBSZXBvcnQgKGlmIGl0IGV4aXN0cykgZm9yIHRoZSB1c2VyIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHJlcXVlc3QgdGhhdCB0aGUgbW9zdCByZWNlbnQgSW5jb21lIEluc2lnaHRzIHJlcG9ydCBiZSBpbmNsdWRlZCBpbiB0aGUgUERGIGFzIHdlbGwsIHVzZSB0aGUgYGFkZC1vbnNgIGZpZWxkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIENvbnN1bWVyIFJlcG9ydHMgYXMgYSBQREZcbiAgICAgKiBAcGFyYW0ge0NyYUNoZWNrUmVwb3J0UERGR2V0UmVxdWVzdH0gY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhQ2hlY2tSZXBvcnRQZGZHZXQoY3JhQ2hlY2tSZXBvcnRQREZHZXRSZXF1ZXN0OiBDcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFDaGVja1JlcG9ydFBkZkdldChjcmFDaGVja1JlcG9ydFBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JhL2xvYW5zL2FwcGxpY2F0aW9ucy9yZWdpc3RlcmAgcmVnaXN0ZXJzIGxvYW4gYXBwbGljYXRpb25zIGFuZCBkZWNpc2lvbnMuXG4gICAgICogQHN1bW1hcnkgUmVnaXN0ZXIgbG9hbiBhcHBsaWNhdGlvbnMgYW5kIGRlY2lzaW9ucy5cbiAgICAgKiBAcGFyYW0ge0NyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXIoY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zQXBwbGljYXRpb25zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTG9hbnNBcHBsaWNhdGlvbnNSZWdpc3RlcihjcmFMb2Fuc0FwcGxpY2F0aW9uc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvbG9hbnMvcmVnaXN0ZXJgIHJlZ2lzdGVycyBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgKiBAc3VtbWFyeSBSZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMgdG8gdGhlaXIgYXBwbGljYW50cy5cbiAgICAgKiBAcGFyYW0ge0NSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0fSBjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUxvYW5zUmVnaXN0ZXIoY1JBTG9hbnNSZWdpc3RlclJlcXVlc3Q6IENSQUxvYW5zUmVnaXN0ZXJSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTG9hbnNSZWdpc3RlcihjUkFMb2Fuc1JlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvbG9hbnMvdW5yZWdpc3RlcmAgaW5kaWNhdGVzIHRoZSBsb2FucyBoYXZlIHJlYWNoZWQgYSBmaW5hbCBzdGF0dXMgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyBhcmUgZXhwZWN0ZWQuXG4gICAgICogQHN1bW1hcnkgVW5yZWdpc3RlciBhIGxpc3Qgb2YgbG9hbnMuXG4gICAgICogQHBhcmFtIHtDcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0fSBjcmFMb2Fuc1VucmVnaXN0ZXJSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTG9hbnNVbnJlZ2lzdGVyKGNyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3Q6IENyYUxvYW5zVW5yZWdpc3RlclJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFMb2Fuc1VucmVnaXN0ZXIoY3JhTG9hbnNVbnJlZ2lzdGVyUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmEvbG9hbnMvdXBkYXRlYCB1cGRhdGVzIGxvYW4gaW5mb3JtYXRpb24gc3VjaCBhcyB0aGUgc3RhdHVzIGFuZCBwYXltZW50IGhpc3RvcnkuXG4gICAgICogQHN1bW1hcnkgVXBkYXRlcyBsb2FuIGRhdGEuXG4gICAgICogQHBhcmFtIHtDcmFMb2Fuc1VwZGF0ZVJlcXVlc3R9IGNyYUxvYW5zVXBkYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYUxvYW5zVXBkYXRlKGNyYUxvYW5zVXBkYXRlUmVxdWVzdDogQ3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTG9hbnNVcGRhdGUoY3JhTG9hbnNVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmV0cmlldmUgYSBNb25pdG9yaW5nIEluc2lnaHRzIHJlcG9ydCBieSBwYXNzaW5nIGluIHRoZSBgdXNlcl90b2tlbmAgcmVmZXJyZWQgdG8gaW4gdGhlIHdlYmhvb2sgeW91IHJlY2VpdmVkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgTW9uaXRvcmluZyBJbnNpZ2h0cyBSZXBvcnRcbiAgICAgKiBAcGFyYW0ge0NyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmFNb25pdG9yaW5nSW5zaWdodHNHZXQoY3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyYU1vbml0b3JpbmdJbnNpZ2h0c0dldChjcmFNb25pdG9yaW5nSW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gc3Vic2NyaWJlIHRvIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIGxpbmtlZCBDUkEgaXRlbXMsIHdoaWNoIGFyZSB1cGRhdGVkIGV2ZXJ5IGRheSAoYmVzdC1lZmZvcnQpLlxuICAgICAqIEBzdW1tYXJ5IFN1YnNjcmliZSB0byBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0fSBjcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3Q6IENyYU1vbml0b3JpbmdJbnNpZ2h0c1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmFNb25pdG9yaW5nSW5zaWdodHNTdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHVuc3Vic2NyaWJlIGZyb20gcHJldmlvdXNseSBzdWJzY3JpYmVkIE1vbml0b3JpbmcgSW5zaWdodHMuXG4gICAgICogQHN1bW1hcnkgVW5zdWJzY3JpYmUgZnJvbSBNb25pdG9yaW5nIEluc2lnaHRzXG4gICAgICogQHBhcmFtIHtDcmFNb25pdG9yaW5nSW5zaWdodHNVbnN1YnNjcmliZVJlcXVlc3R9IGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlKGNyYU1vbml0b3JpbmdJbnNpZ2h0c1Vuc3Vic2NyaWJlUmVxdWVzdDogQ3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmUoY3JhTW9uaXRvcmluZ0luc2lnaHRzVW5zdWJzY3JpYmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyYS9wYXJ0bmVyX2luc2lnaHRzL2dldGAgcmV0dXJucyBjYXNoIGZsb3cgaW5zaWdodHMgZm9yIGEgc3BlY2lmaWVkIHVzZXIuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgY2FzaCBmbG93IGluc2lnaHRzIGZyb20gdGhlIGJhbmsgYWNjb3VudHMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7Q3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdH0gY3JhUGFydG5lckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyYVBhcnRuZXJJbnNpZ2h0c0dldChjcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0OiBDcmFQYXJ0bmVySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JhUGFydG5lckluc2lnaHRzR2V0KGNyYVBhcnRuZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gTmV3IFBsYWlkIGN1c3RvbWVycyB3aWxsIGJlIHVuYWJsZSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYW5kIGV4aXN0aW5nIGN1c3RvbWVycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIHRoZSBuZXdlciwgYGxpbmtfdG9rZW5gLWJhc2VkIGZsb3cuIFRoZSByZWNvbW1lbmRlZCBmbG93IGlzIHRvIHByb3ZpZGUgdGhlIGBwYXltZW50X2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCwgd2hpY2ggcmV0dXJucyBhIGBsaW5rX3Rva2VuYCB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gIFRoZSBgL3BheW1lbnRfaW5pdGlhdGlvbi9wYXltZW50L3Rva2VuL2NyZWF0ZWAgaXMgdXNlZCB0byBjcmVhdGUgYSBgcGF5bWVudF90b2tlbmAsIHdoaWNoIGNhbiB0aGVuIGJlIHVzZWQgaW4gTGluayBpbml0aWFsaXphdGlvbiB0byBlbnRlciBhIHBheW1lbnQgaW5pdGlhdGlvbiBmbG93LiBZb3UgY2FuIG9ubHkgdXNlIGEgYHBheW1lbnRfdG9rZW5gIG9uY2UuIElmIHRoaXMgYXR0ZW1wdCBmYWlscywgdGhlIGVuZCB1c2VyIGFib3J0cyB0aGUgZmxvdywgb3IgdGhlIHRva2VuIGV4cGlyZXMsIHlvdSB3aWxsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IHBheW1lbnQgdG9rZW4uIENyZWF0aW5nIGEgbmV3IHBheW1lbnQgdG9rZW4gZG9lcyBub3QgcmVxdWlyZSBlbmQgdXNlciBpbnB1dC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCB0b2tlblxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblBheW1lbnRUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVhdGVQYXltZW50VG9rZW4ocGF5bWVudEluaXRpYXRpb25QYXltZW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYGNyZWRpdC9hc3NldF9yZXBvcnQvZnJlZGRpZV9tYWMvZ2V0YCBlbmRwb2ludCByZXRyaWV2ZXMgdGhlIEFzc2V0IFJlcG9ydCBpbiBGcmVkZGllIE1hY1xcJ3MgSlNPTiBmb3JtYXQuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gQXNzZXQgUmVwb3J0IHdpdGggRnJlZGRpZSBNYWMgZm9ybWF0LiBPbmx5IEZyZWRkaWUgTWFjIGNhbiB1c2UgdGhpcyBlbmRwb2ludC5cbiAgICAgKiBAcGFyYW0ge3sgW2tleTogc3RyaW5nXTogb2JqZWN0OyB9fSByZXF1ZXN0Qm9keSBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEFzc2V0UmVwb3J0RnJlZGRpZU1hY0dldChyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRBc3NldFJlcG9ydEZyZWRkaWVNYWNHZXQocmVxdWVzdEJvZHksIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBjcmVhdGUgYW4gQXVkaXQgQ29weSB0b2tlbiBvZiBhbiBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgdG8gc2hhcmUgd2l0aCBwYXJ0aWNpcGF0aW5nIEdvdmVybm1lbnQgU3BvbnNvcmVkIEVudGl0eSAoR1NFKS4gSWYgeW91IHBhcnRpY2lwYXRlIGluIHRoZSBEYXkgMSBDZXJ0YWludHnihKIgcHJvZ3JhbSwgUGxhaWQgY2FuIHN1cHBseSBhbiBBdWRpdCBDb3B5IHRva2VuIGRpcmVjdGx5IHRvIEZhbm5pZSBNYWUgb24geW91ciBiZWhhbGYuIEFuIEF1ZGl0IENvcHkgdG9rZW4gY29udGFpbnMgdGhlIHNhbWUgdW5kZXJseWluZyBkYXRhIGFzIHRoZSBBc3NldCBSZXBvcnQgYW5kL29yIEluY29tZSBSZXBvcnQgKHJlc3VsdCBvZiAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldCkuICBVc2UgdGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYW4gYGF1ZGl0X2NvcHlfdG9rZW5gIGFuZCB0aGVuIHBhc3MgdGhhdCB0b2tlbiB0byB0aGUgR1NFIHdobyBuZWVkcyBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEFzc2V0IG9yIEluY29tZSBSZXBvcnQgQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5DcmVhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZShjcmVkaXRBdWRpdENvcHlUb2tlbkNyZWF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L2F1ZGl0X2NvcHlfdG9rZW4vdXBkYXRlYCBlbmRwb2ludCB1cGRhdGVzIGFuIGV4aXN0aW5nICBBdWRpdCBDb3B5IFRva2VuIGJ5IGFkZGluZyB0aGUgcmVwb3J0IHRva2VucyBpbiB0aGUgYHJlcG9ydF90b2tlbnNgIGZpZWxkIHRvIHRoZSBgYXVkaXRfY29weV90b2tlbmAuIElmIHRoZSBBdWRpdCBDb3B5IFRva2VuIGFscmVhZHkgY29udGFpbnMgYSByZXBvcnQgb2YgYSBjZXJ0YWluIHR5cGUsIGl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdG9rZW4gcHJvdmlkZWQgaW4gdGhlIGByZXBvcnRfdG9rZW5zYCBmaWVsZC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYW4gQXVkaXQgQ29weSBUb2tlblxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QXVkaXRDb3B5VG9rZW5VcGRhdGVSZXF1ZXN0fSBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZShjcmVkaXRBdWRpdENvcHlUb2tlblVwZGF0ZVJlcXVlc3Q6IENyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlKGNyZWRpdEF1ZGl0Q29weVRva2VuVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19lbXBsb3ltZW50L2dldGAgcmV0dXJucyB0aGUgZW1wbG95bWVudCByZXBvcnQocykgZGVyaXZlZCBmcm9tIGJhbmsgdHJhbnNhY3Rpb24gZGF0YSBmb3IgYSBzcGVjaWZpZWQgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGVtcGxveW1lbnQgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRCYW5rRW1wbG95bWVudEdldFJlcXVlc3R9IGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0KGNyZWRpdEJhbmtFbXBsb3ltZW50R2V0UmVxdWVzdDogQ3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0VtcGxveW1lbnRHZXQoY3JlZGl0QmFua0VtcGxveW1lbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9nZXRgIHJldHVybnMgdGhlIGJhbmsgaW5jb21lIHJlcG9ydChzKSBmb3IgYSBzcGVjaWZpZWQgdXNlci4gQSBzaW5nbGUgcmVwb3J0IGNvcnJlc3BvbmRzIHRvIGFsbCBpbnN0aXR1dGlvbnMgbGlua2VkIGluIGEgc2luZ2xlIExpbmsgc2Vzc2lvbi4gVG8gaW5jbHVkZSBtdWx0aXBsZSBpbnN0aXR1dGlvbnMgaW4gYSBzaW5nbGUgcmVwb3J0LCB1c2UgW011bHRpLUl0ZW0gTGlua10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL211bHRpLWl0ZW0tbGluaykuIFRvIHJldHVybiBvbGRlciByZXBvcnRzLCB1c2UgdGhlIGBvcHRpb25zLmNvdW50YCBmaWVsZC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEJhbmtJbmNvbWVHZXQoY3JlZGl0QmFua0luY29tZUdldFJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0QmFua0luY29tZUdldChjcmVkaXRCYW5rSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19pbmNvbWUvcGRmL2dldGAgcmV0dXJucyB0aGUgbW9zdCByZWNlbnQgYmFuayBpbmNvbWUgcmVwb3J0IGZvciBhIHNwZWNpZmllZCB1c2VyIGluIFBERiBmb3JtYXQuICBBIHNpbmdsZSByZXBvcnQgY29ycmVzcG9uZHMgdG8gYWxsIGluc3RpdHV0aW9ucyBsaW5rZWQgaW4gYSBzaW5nbGUgTGluayBzZXNzaW9uLiBUbyBpbmNsdWRlIG11bHRpcGxlIGluc3RpdHV0aW9ucyBpbiBhIHNpbmdsZSByZXBvcnQsIHVzZSBbTXVsdGktSXRlbSBMaW5rXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rKS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBiYW5rIGFjY291bnRzIHVzZWQgZm9yIGluY29tZSB2ZXJpZmljYXRpb24gaW4gUERGIGZvcm1hdFxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3R9IGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QmFua0luY29tZVBkZkdldChjcmVkaXRCYW5rSW5jb21lUERGR2V0UmVxdWVzdDogQ3JlZGl0QmFua0luY29tZVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRCYW5rSW5jb21lUGRmR2V0KGNyZWRpdEJhbmtJbmNvbWVQREZHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9iYW5rX2luY29tZS9yZWZyZXNoYCByZWZyZXNoZXMgdGhlIG1vc3QgcmVjZW50IGJhbmsgaW5jb21lIHJlcG9ydCBkYXRhIGZvciBhIHNwZWNpZmljIHVzZXIuIElmIHRoZSBtb3N0IHJlY2VudCBiYW5rIGluY29tZSByZXBvcnQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpLmUuIGRlbGV0ZWQpLCB0aGUgZW5kcG9pbnQgd2lsbCByZWZyZXNoIHRoZSBtb3N0IHJlY2VudCB2YWxpZCByZXBvcnQgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSBSZWZyZXNoIGEgdXNlclxcJ3MgYmFuayBpbmNvbWUgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtJbmNvbWVSZWZyZXNoUmVxdWVzdH0gY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0QmFua0luY29tZVJlZnJlc2goY3JlZGl0QmFua0luY29tZVJlZnJlc2hSZXF1ZXN0OiBDcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRCYW5rSW5jb21lUmVmcmVzaChjcmVkaXRCYW5rSW5jb21lUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L2JhbmtfaW5jb21lL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSBvciB1bnN1YnNjcmliZSBhIHVzZXIgZm9yIGluY29tZSB3ZWJob29rIG5vdGlmaWNhdGlvbnMuIEJ5IGRlZmF1bHQsIGFsbCB1c2VycyBzdGFydCBvdXQgdW5zdWJzY3JpYmVkLiAgSWYgYSB1c2VyIGlzIHN1YnNjcmliZWQsIG9uIHNpZ25pZmljYW50IGNoYW5nZXMgdG8gdGhlIHVzZXJcXCdzIGluY29tZSBwcm9maWxlLCB5b3Ugd2lsbCByZWNlaXZlIGEgYEJBTktfSU5DT01FX1JFRlJFU0hfVVBEQVRFYCB3ZWJob29rLCBwcm9tcHRpbmcgeW91IHRvIHJlZnJlc2ggYmFuayBpbmNvbWUgZGF0YSBmb3IgdGhlIHVzZXIuXG4gICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIGFuZCB1bnN1YnNjcmliZSB0byBwcm9hY3RpdmUgbm90aWZpY2F0aW9ucyBmb3IgYSB1c2VyXFwncyBpbmNvbWUgcHJvZmlsZVxuICAgICAqIEBwYXJhbSB7Q3JlZGl0QmFua0luY29tZVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZShjcmVkaXRCYW5rSW5jb21lV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IENyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlKGNyZWRpdEJhbmtJbmNvbWVXZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvYmFua19zdGF0ZW1lbnRzL3VwbG9hZHMvZ2V0YCByZXR1cm5zIHBhcnNlZCBkYXRhIGZyb20gYmFuayBzdGF0ZW1lbnRzIHVwbG9hZGVkIGJ5IHVzZXJzIGFzIHBhcnQgb2YgdGhlIERvY3VtZW50IEluY29tZSBmbG93LiBJZiB5b3VyIGFjY291bnQgaXMgbm90IGVuYWJsZWQgZm9yIERvY3VtZW50IFBhcnNpbmcsIGNvbnRhY3QgeW91ciBhY2NvdW50IG1hbmFnZXIgdG8gcmVxdWVzdCBhY2Nlc3MuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgZGF0YSBmb3IgYSB1c2VyXFwncyB1cGxvYWRlZCBiYW5rIHN0YXRlbWVudHNcbiAgICAgKiBAcGFyYW0ge0NyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3R9IGNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXQoY3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdDogQ3JlZGl0QmFua1N0YXRlbWVudHNVcGxvYWRzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEJhbmtTdGF0ZW1lbnRzVXBsb2Fkc0dldChjcmVkaXRCYW5rU3RhdGVtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgcmV0dXJucyBhIGxpc3Qgb2YgaXRlbXMgd2l0aCBlbXBsb3ltZW50IGluZm9ybWF0aW9uIGZyb20gYSB1c2VyXFwncyBwYXlyb2xsIHByb3ZpZGVyIHRoYXQgd2FzIHZlcmlmaWVkIGJ5IGFuIGVuZCB1c2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc3VtbWFyeSBvZiBhbiBpbmRpdmlkdWFsXFwncyBlbXBsb3ltZW50IGluZm9ybWF0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdH0gY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRFbXBsb3ltZW50R2V0KGNyZWRpdEVtcGxveW1lbnRHZXRSZXF1ZXN0OiBDcmVkaXRFbXBsb3ltZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmNyZWRpdEVtcGxveW1lbnRHZXQoY3JlZGl0RW1wbG95bWVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgY3JlZGl0L2Fzc2V0X3JlcG9ydC9mcmVkZGllX21hYy9nZXRgIGVuZHBvaW50IHJldHJpZXZlcyB0aGUgVmVyaWZpY2F0aW9uIG9mIEFzc2V0cyBhbmQgVmVyaWZpY2F0aW9uIG9mIEVtcGxveW1lbnQgcmVwb3J0cy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBGcmVkZGllIE1hYyBmb3JtYXQgKGFrYSBWT0EgLSBWZXJpZmljYXRpb24gT2YgQXNzZXRzKSwgYW5kIGEgVmVyaWZpY2F0aW9uIE9mIEVtcGxveW1lbnQgKFZPRSkgcmVwb3J0IGlmIHRoaXMgb25lIGlzIGF2YWlsYWJsZS4gT25seSBGcmVkZGllIE1hYyBjYW4gdXNlIHRoaXMgZW5kcG9pbnQuXG4gICAgICogQHBhcmFtIHtDcmVkaXRGcmVkZGllTWFjUmVwb3J0c0dldFJlcXVlc3R9IGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0KGNyZWRpdEZyZWRkaWVNYWNSZXBvcnRzR2V0UmVxdWVzdDogQ3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXQoY3JlZGl0RnJlZGRpZU1hY1JlcG9ydHNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGdldHMgcGF5cm9sbCBpbmNvbWUgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgdXNlciwgZWl0aGVyIGFzIGEgcmVzdWx0IG9mIHRoZSB1c2VyIGNvbm5lY3RpbmcgdG8gdGhlaXIgcGF5cm9sbCBwcm92aWRlciBvciB1cGxvYWRpbmcgYSBwYXkgcmVsYXRlZCBkb2N1bWVudC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHVzZXJcXCdzIHBheXJvbGwgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0NyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVHZXQoY3JlZGl0UGF5cm9sbEluY29tZUdldFJlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZUdldChjcmVkaXRQYXlyb2xsSW5jb21lR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYCB1cGRhdGVzIHRoZSBwYXJzaW5nIGNvbmZpZ3VyYXRpb24gZm9yIGEgZG9jdW1lbnQgaW5jb21lIHZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIHBhcnNpbmcgY29uZmlndXJhdGlvbiBmb3IgYSBkb2N1bWVudCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHt7IFtrZXk6IHN0cmluZ106IG9iamVjdDsgfX0gcmVxdWVzdEJvZHkgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keTogeyBba2V5OiBzdHJpbmddOiBvYmplY3Q7IH0sIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUGFyc2luZ0NvbmZpZ1VwZGF0ZShyZXF1ZXN0Qm9keSwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgY2FuIGJlIGNhbGxlZCBiZWZvcmUgaW5pdGlhbGl6aW5nIGEgTGluayBzZXNzaW9uIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJdCBldmFsdWF0ZXMgd2hldGhlciBhIGdpdmVuIHVzZXIgaXMgc3VwcG9ydGFibGUgYnkgZGlnaXRhbCBpbmNvbWUgdmVyaWZpY2F0aW9uLiBJZiB0aGUgdXNlciBpcyBlbGlnaWJsZSBmb3IgZGlnaXRhbCB2ZXJpZmljYXRpb24sIHRoYXQgaW5mb3JtYXRpb24gd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIgdG9rZW4sIGFuZCBpbiB0aGlzIHdheSB3aWxsIGdlbmVyYXRlIGEgTGluayBVSSBvcHRpbWl6ZWQgZm9yIHRoZSBlbmQgdXNlciBhbmQgdGhlaXIgc3BlY2lmaWMgZW1wbG95ZXIuIElmIHRoZSB1c2VyIGNhbm5vdCBiZSBjb25maXJtZWQgYXMgZWxpZ2libGUsIHRoZSB1c2VyIGNhbiBzdGlsbCB1c2UgdGhlIGluY29tZSB2ZXJpZmljYXRpb24gZmxvdywgYnV0IHRoZXkgbWF5IGJlIHJlcXVpcmVkIHRvIG1hbnVhbGx5IHVwbG9hZCBhIHBheXN0dWIgdG8gdmVyaWZ5IHRoZWlyIGluY29tZS4gIFdoaWxlIGFsbCByZXF1ZXN0IGZpZWxkcyBhcmUgb3B0aW9uYWwsIHByb3ZpZGluZyBgZW1wbG95ZXJgIGRhdGEgd2lsbCBpbmNyZWFzZSB0aGUgY2hhbmNlIG9mIHJlY2VpdmluZyBhIHVzZWZ1bCByZXN1bHQuICBXaGVuIHRlc3RpbmcgaW4gU2FuZGJveCwgeW91IGNhbiBjb250cm9sIHRoZSByZXN1bHRzIGJ5IHByb3ZpZGluZyBzcGVjaWFsIHRlc3QgdmFsdWVzIGluIHRoZSBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgZmllbGRzLiBgZW1wbG95ZXJfZ29vZGAgYW5kIGBlbXBsb3llcl9iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gYGVtcGxveWVyX211bHRpYCB3aWxsIHJlc3VsdCBpbiBhIGBISUdIYCBjb25maWRlbmNlIHdpdGggbXVsdGlwbGUgcGF5cm9sbCBvcHRpb25zLiBMaWtld2lzZSwgYGFjY2Vzc19nb29kYCBhbmQgYGFjY2Vzc19iYWRgIHdpbGwgcmVzdWx0IGluIGBISUdIYCBhbmQgYExPV2AgY29uZmlkZW5jZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gQW55IG90aGVyIHZhbHVlIGZvciBgZW1wbG95ZXJgIGFuZCBgYWNjZXNzX3Rva2Vuc2AgaW4gU2FuZGJveCB3aWxsIHJlc3VsdCBpbiBgVU5LTk9XTmAgY29uZmlkZW5jZS5cbiAgICAgKiBAc3VtbWFyeSBDaGVjayBpbmNvbWUgdmVyaWZpY2F0aW9uIGVsaWdpYmlsaXR5IGFuZCBvcHRpbWl6ZSBjb252ZXJzaW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0fSBjcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrKGNyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3Q6IENyZWRpdFBheXJvbGxJbmNvbWVQcmVjaGVja1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRQYXlyb2xsSW5jb21lUHJlY2hlY2soY3JlZGl0UGF5cm9sbEluY29tZVByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmVmcmVzaGAgcmVmcmVzaGVzIGEgZ2l2ZW4gZGlnaXRhbCBwYXlyb2xsIGluY29tZSB2ZXJpZmljYXRpb24uXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIGRpZ2l0YWwgcGF5cm9sbCBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtDcmVkaXRQYXlyb2xsSW5jb21lUmVmcmVzaFJlcXVlc3R9IGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoKGNyZWRpdFBheXJvbGxJbmNvbWVSZWZyZXNoUmVxdWVzdDogQ3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2goY3JlZGl0UGF5cm9sbEluY29tZVJlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9wYXlyb2xsX2luY29tZS9yaXNrX3NpZ25hbHMvZ2V0YCBjYW4gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyB0byBhc3Nlc3MgYSB1c2VyLXVwbG9hZGVkIGRvY3VtZW50IGZvciBzaWducyBvZiBwb3RlbnRpYWwgZnJhdWQgb3IgdGFtcGVyaW5nLiBJdCByZXR1cm5zIGEgcmlzayBzY29yZSBmb3IgZWFjaCB1cGxvYWRlZCBkb2N1bWVudCB0aGF0IGluZGljYXRlcyB0aGUgbGlrZWxpaG9vZCBvZiB0aGUgZG9jdW1lbnQgYmVpbmcgZnJhdWR1bGVudCwgaW4gYWRkaXRpb24gdG8gZGV0YWlscyBvbiB0aGUgaW5kaXZpZHVhbCByaXNrIHNpZ25hbHMgY29udHJpYnV0aW5nIHRvIHRoZSBzY29yZS4gIFRvIHRyaWdnZXIgcmlzayBzaWduYWwgZ2VuZXJhdGlvbiBmb3IgYW4gSXRlbSwgY2FsbCBgL2xpbmsvdG9rZW4vY3JlYXRlYCB3aXRoIGBwYXJzaW5nX2NvbmZpZ2Agc2V0IHRvIGluY2x1ZGUgYHJpc2tfc2lnbmFsc2AsIG9yIGNhbGwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcGFyc2luZ19jb25maWcvdXBkYXRlYC4gT25jZSByaXNrIHNpZ25hbCBnZW5lcmF0aW9uIGhhcyBiZWVuIHRyaWdnZXJlZCwgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZSBhZnRlciB0aGUgYElOQ09NRV9WRVJJRklDQVRJT05fUklTS19TSUdOQUxTYCB3ZWJob29rIGhhcyBiZWVuIGZpcmVkLiAgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcmlza19zaWduYWxzL2dldGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gRG9jdW1lbnQgSW5jb21lIGFuZCBpcyBiaWxsZWQgc2VwYXJhdGVseS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdCBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGZyYXVkIGluc2lnaHRzIGZvciBhIHVzZXJcXCdzIG1hbnVhbGx5IHVwbG9hZGVkIGRvY3VtZW50KHMpLlxuICAgICAqIEBwYXJhbSB7Q3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdH0gY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldChjcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0OiBDcmVkaXRQYXlyb2xsSW5jb21lUmlza1NpZ25hbHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UGF5cm9sbEluY29tZVJpc2tTaWduYWxzR2V0KGNyZWRpdFBheXJvbGxJbmNvbWVSaXNrU2lnbmFsc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIGNhbiBzaGFyZSBhbiBBc3NldCBSZXBvcnQgZGlyZWN0bHkgd2l0aCBhIHBhcnRpY2lwYXRpbmcgdGhpcmQgcGFydHkgb24geW91ciBiZWhhbGYuIFRoZSBzaGFyZWQgQXNzZXQgUmVwb3J0IGlzIHRoZSBleGFjdCBzYW1lIEFzc2V0IFJlcG9ydCBvcmlnaW5hbGx5IGNyZWF0ZWQgaW4gYC9hc3NldF9yZXBvcnQvY3JlYXRlYC4gIFRvIGdyYW50IGEgdGhpcmQgcGFydHkgYWNjZXNzIHRvIGFuIEFzc2V0IFJlcG9ydCwgdXNlIHRoZSBgL2NyZWRpdC9yZWxheS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIGByZWxheV90b2tlbmAgYW5kIHRoZW4gcGFzcyB0aGF0IHRva2VuIHRvIHlvdXIgdGhpcmQgcGFydHkuIEVhY2ggdGhpcmQgcGFydHkgaGFzIGl0cyBvd24gYHNlY29uZGFyeV9jbGllbnRfaWRgOyBmb3IgZXhhbXBsZSwgYGNlNWJkMzI4ZGNkMzQxMjM0NTZgLiBZb3VcXCdsbCBuZWVkIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIGByZWxheV90b2tlbmAgZm9yIGVhY2ggdGhpcmQgcGFydHkgdGhhdCBuZWVkcyBhY2Nlc3MgdG8gdGhlIHJlcG9ydCBvbiB5b3VyIGJlaGFsZi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWxheSB0b2tlbiB0byBzaGFyZSBhbiBBc3NldCBSZXBvcnQgd2l0aCBhIHBhcnRuZXIgY2xpZW50XG4gICAgICogQHBhcmFtIHtDcmVkaXRSZWxheUNyZWF0ZVJlcXVlc3R9IGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFJlbGF5Q3JlYXRlKGNyZWRpdFJlbGF5Q3JlYXRlUmVxdWVzdDogQ3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UmVsYXlDcmVhdGUoY3JlZGl0UmVsYXlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2NyZWRpdC9yZWxheS9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSByZXBvcnQgdGhhdCB3YXMgc2hhcmVkIHdpdGggdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgcmVwb3J0cyBhc3NvY2lhdGVkIHdpdGggYSByZWxheSB0b2tlbiB0aGF0IHdhcyBzaGFyZWQgd2l0aCB5b3VcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5R2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlHZXQoY3JlZGl0UmVsYXlHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheUdldChjcmVkaXRSZWxheUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvY3JlZGl0L3JlbGF5L3BkZi9nZXRgIGFsbG93cyB0aGlyZCBwYXJ0aWVzIHRvIHJlY2VpdmUgYSBwZGYgcmVwb3J0IHRoYXQgd2FzIHNoYXJlZCB3aXRoIHRoZW0sIHVzaW5nIGEgYHJlbGF5X3Rva2VuYCB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZSByZXBvcnQgb3duZXIuICBUaGUgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBBc3NldCBSZXBvcnQgaW4gUERGIGZvcm1hdC4gQmVmb3JlIGNhbGxpbmcgYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAsIHlvdSBtdXN0IGZpcnN0IGNyZWF0ZSB0aGUgQXNzZXQgUmVwb3J0IHVzaW5nIGAvY3JlZGl0L3JlbGF5L2NyZWF0ZWAgYW5kIHRoZW4gd2FpdCBmb3IgdGhlIFtgUFJPRFVDVF9SRUFEWWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL2Fzc2V0cy8jcHJvZHVjdF9yZWFkeSkgd2ViaG9vayB0byBmaXJlLCBpbmRpY2F0aW5nIHRoYXQgdGhlIFJlcG9ydCBpcyByZWFkeSB0byBiZSByZXRyaWV2ZWQuICBUaGUgcmVzcG9uc2UgdG8gYC9jcmVkaXQvcmVsYXkvcGRmL2dldGAgaXMgdGhlIFBERiBiaW5hcnkgZGF0YS4gVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci4gIFtWaWV3IGEgc2FtcGxlIFBERiBBc3NldCBSZXBvcnRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3VtZW50cy9zYW1wbGUtYXNzZXQtcmVwb3J0LnBkZikuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgdGhlIHBkZiByZXBvcnRzIGFzc29jaWF0ZWQgd2l0aCBhIHJlbGF5IHRva2VuIHRoYXQgd2FzIHNoYXJlZCB3aXRoIHlvdSAoYmV0YSlcbiAgICAgKiBAcGFyYW0ge0NyZWRpdFJlbGF5UERGR2V0UmVxdWVzdH0gY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlQZGZHZXQoY3JlZGl0UmVsYXlQREZHZXRSZXF1ZXN0OiBDcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVBkZkdldChjcmVkaXRSZWxheVBERkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2NyZWRpdC9yZWxheS9yZWZyZXNoYCBlbmRwb2ludCBhbGxvd3MgdGhpcmQgcGFydGllcyB0byByZWZyZXNoIGEgcmVwb3J0IHRoYXQgd2FzIHJlbGF5ZWQgdG8gdGhlbSwgdXNpbmcgYSBgcmVsYXlfdG9rZW5gIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlIHJlcG9ydCBvd25lci4gQSBuZXcgcmVwb3J0IHdpbGwgYmUgY3JlYXRlZCB3aXRoIHRoZSBvcmlnaW5hbCByZXBvcnQgcGFyYW1ldGVycywgYnV0IHdpdGggdGhlIG1vc3QgcmVjZW50IGRhdGEgYXZhaWxhYmxlIGJhc2VkIG9uIHRoZSBgZGF5c19yZXF1ZXN0ZWRgIHZhbHVlIG9mIHRoZSBvcmlnaW5hbCByZXBvcnQuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBhIHJlcG9ydCBvZiBhIHJlbGF5IHRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0fSBjcmVkaXRSZWxheVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVsYXlSZWZyZXNoKGNyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3Q6IENyZWRpdFJlbGF5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5jcmVkaXRSZWxheVJlZnJlc2goY3JlZGl0UmVsYXlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvY3JlZGl0L3JlbGF5L3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byBpbnZhbGlkYXRlIGEgYHJlbGF5X3Rva2VuYC4gVGhlIHRoaXJkIHBhcnR5IGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gYWNjZXNzIG9yIHJlZnJlc2ggdGhlIHJlcG9ydHMgd2hpY2ggdGhlIGByZWxheV90b2tlbmAgZ2l2ZXMgYWNjZXNzIHRvLiBUaGUgb3JpZ2luYWwgcmVwb3J0LCBhc3NvY2lhdGVkIEl0ZW1zLCBhbmQgb3RoZXIgcmVsYXkgdG9rZW5zIHRoYXQgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwb3J0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIGByZWxheV90b2tlbmAuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHJlbGF5IHRva2VuXG4gICAgICogQHBhcmFtIHtDcmVkaXRSZWxheVJlbW92ZVJlcXVlc3R9IGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFJlbGF5UmVtb3ZlKGNyZWRpdFJlbGF5UmVtb3ZlUmVxdWVzdDogQ3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UmVsYXlSZW1vdmUoY3JlZGl0UmVsYXlSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9jcmVkaXQvYXVkaXRfY29weV90b2tlbi9yZW1vdmVgIGVuZHBvaW50IGFsbG93cyB5b3UgdG8gcmVtb3ZlIGFuIEF1ZGl0IENvcHkuIFJlbW92aW5nIGFuIEF1ZGl0IENvcHkgaW52YWxpZGF0ZXMgdGhlIGBhdWRpdF9jb3B5X3Rva2VuYCBhc3NvY2lhdGVkIHdpdGggaXQsIG1lYW5pbmcgYm90aCB5b3UgYW5kIGFueSB0aGlyZCBwYXJ0aWVzIGhvbGRpbmcgdGhlIHRva2VuIHdpbGwgbm8gbG9uZ2VyIGJlIGFibGUgdG8gdXNlIGl0IHRvIGFjY2VzcyBSZXBvcnQgZGF0YS4gSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBSZXBvcnQgZGF0YSBhbmQgb3RoZXIgQXVkaXQgQ29waWVzIG9mIGl0IGFyZSBub3QgYWZmZWN0ZWQgYW5kIHdpbGwgcmVtYWluIGFjY2Vzc2libGUgYWZ0ZXIgcmVtb3ZpbmcgdGhlIGdpdmVuIEF1ZGl0IENvcHkuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEF1ZGl0IENvcHkgdG9rZW5cbiAgICAgKiBAcGFyYW0ge0NyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdH0gY3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdDogQ3JlZGl0QXVkaXRDb3B5VG9rZW5SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0UmVwb3J0QXVkaXRDb3B5UmVtb3ZlKGNyZWRpdEF1ZGl0Q29weVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBjYW4gYmUgdXNlZCBmb3IgeW91ciBlbmQgdXNlcnMgYWZ0ZXIgdGhleSBjb21wbGV0ZSB0aGUgTGluayBmbG93LiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIExpbmsgc2Vzc2lvbnMgdGhhdCB5b3VyIHVzZXIgY29tcGxldGVkLCB3aGVyZSBlYWNoIHNlc3Npb24gaW5jbHVkZXMgdGhlIHJlc3VsdHMgZnJvbSB0aGUgTGluayBmbG93LiAgVGhlc2UgcmVzdWx0cyBpbmNsdWRlIGRldGFpbHMgYWJvdXQgdGhlIEl0ZW0gdGhhdCB3YXMgY3JlYXRlZCBhbmQgc29tZSBwcm9kdWN0IHJlbGF0ZWQgbWV0YWRhdGEgKHNob3dpbmcsIGZvciBleGFtcGxlLCB3aGV0aGVyIHRoZSB1c2VyIGZpbmlzaGVkIHRoZSBiYW5rIGluY29tZSB2ZXJpZmljYXRpb24gc3RlcCkuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgTGluayBzZXNzaW9ucyBmb3IgeW91ciB1c2VyXG4gICAgICogQHBhcmFtIHtDcmVkaXRTZXNzaW9uc0dldFJlcXVlc3R9IGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGNyZWRpdFNlc3Npb25zR2V0KGNyZWRpdFNlc3Npb25zR2V0UmVxdWVzdDogQ3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuY3JlZGl0U2Vzc2lvbnNHZXQoY3JlZGl0U2Vzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGRldGFpbHMgKHN1Y2ggYXMgZW1haWwgYWRkcmVzcykgYWJvdXQgYSBzcGVjaWZpYyBEYXNoYm9hcmQgdXNlciBiYXNlZCBvbiB0aGUgYGRhc2hib2FyZF91c2VyX2lkYCBmaWVsZCwgd2hpY2ggaXMgcmV0dXJuZWQgaW4gdGhlIGBhdWRpdF90cmFpbGAgb2JqZWN0IG9mIGNlcnRhaW4gTW9uaXRvciBhbmQgQmVhY29uIGVuZHBvaW50cy4gVGhpcyBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgc3BlY2lmaWMgcmV2aWV3ZXIgd2hvIHBlcmZvcm1lZCBhIERhc2hib2FyZCBhY3Rpb24uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBkYXNoYm9hcmQgdXNlclxuICAgICAqIEBwYXJhbSB7RGFzaGJvYXJkVXNlckdldFJlcXVlc3R9IGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGFzaGJvYXJkVXNlckdldChkYXNoYm9hcmRVc2VyR2V0UmVxdWVzdDogRGFzaGJvYXJkVXNlckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kYXNoYm9hcmRVc2VyR2V0KGRhc2hib2FyZFVzZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9kYXNoYm9hcmRfdXNlci9saXN0YCBlbmRwb2ludCBwcm92aWRlcyBkZXRhaWxzIChzdWNoIGFzIGVtYWlsIGFkZHJlc3MpIGFsbCBEYXNoYm9hcmQgdXNlcnMgYXNzb2NpYXRlZCB3aXRoIHlvdXIgYWNjb3VudC4gVGhpcyBjYW4gdXNlIHVzZWQgdG8gYXVkaXQgb3IgdHJhY2sgdGhlIGxpc3Qgb2YgcmV2aWV3ZXJzIGZvciBNb25pdG9yLCBCZWFjb24sIGFuZCBJZGVudGl0eSBWZXJpZmljYXRpb24gcHJvZHVjdHMuXG4gICAgICogQHN1bW1hcnkgTGlzdCBkYXNoYm9hcmQgdXNlcnNcbiAgICAgKiBAcGFyYW0ge0Rhc2hib2FyZFVzZXJMaXN0UmVxdWVzdH0gZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGFzaGJvYXJkVXNlckxpc3QoZGFzaGJvYXJkVXNlckxpc3RSZXF1ZXN0OiBEYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kYXNoYm9hcmRVc2VyTGlzdChkYXNoYm9hcmRVc2VyTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcHJvdmlkZXMgYW4gYWx0ZXJuYXRpdmUgdG8gYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgIGZvciBjdXN0b21lcnMgd2hvIGhhdmUgbm90IHlldCBmdWxseSBpbnRlZ3JhdGVkIHdpdGggUGxhaWQgRXhjaGFuZ2UuIExpa2UgYC9kZXBvc2l0X3N3aXRjaC9jcmVhdGVgLCBpdCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHdpdGhvdXQgdXNpbmcgUGxhaWQgRXhjaGFuZ2VcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hBbHRDcmVhdGUoZGVwb3NpdFN3aXRjaEFsdENyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hBbHRDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaEFsdENyZWF0ZShkZXBvc2l0U3dpdGNoQWx0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBjcmVhdGVzIGEgZGVwb3NpdCBzd2l0Y2ggZW50aXR5IHRoYXQgd2lsbCBiZSBwZXJzaXN0ZWQgdGhyb3VnaG91dCB0aGUgbGlmZWN5Y2xlIG9mIHRoZSBzd2l0Y2guXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdH0gZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBkZXBvc2l0U3dpdGNoQ3JlYXRlKGRlcG9zaXRTd2l0Y2hDcmVhdGVSZXF1ZXN0OiBEZXBvc2l0U3dpdGNoQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmRlcG9zaXRTd2l0Y2hDcmVhdGUoZGVwb3NpdFN3aXRjaENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgcmV0dXJucyBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGhvdyB0aGUgdXNlciBoYXMgY29uZmlndXJlZCB0aGVpciBwYXlyb2xsIGFsbG9jYXRpb24gYW5kIHRoZSBzdGF0ZSBvZiB0aGUgc3dpdGNoLiBZb3UgY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9uIHRvIGJ1aWxkIGxvZ2ljIHJlbGF0ZWQgdG8gdGhlIHVzZXJcXCdzIGRpcmVjdCBkZXBvc2l0IGFsbG9jYXRpb24gcHJlZmVyZW5jZXMuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIFJldHJpZXZlIGEgZGVwb3NpdCBzd2l0Y2hcbiAgICAgKiBAcGFyYW0ge0RlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGRlcG9zaXRTd2l0Y2hHZXQoZGVwb3NpdFN3aXRjaEdldFJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZGVwb3NpdFN3aXRjaEdldChkZXBvc2l0U3dpdGNoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSW4gb3JkZXIgZm9yIHRoZSBlbmQgdXNlciB0byB0YWtlIGFjdGlvbiwgeW91IHdpbGwgbmVlZCB0byBjcmVhdGUgYSBwdWJsaWMgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBkZXBvc2l0IHN3aXRjaC4gVGhpcyB0b2tlbiBpcyB1c2VkIHRvIGluaXRpYWxpemUgTGluay4gSXQgY2FuIGJlIHVzZWQgb25lIHRpbWUgYW5kIGV4cGlyZXMgYWZ0ZXIgMzAgbWludXRlcy4gXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENyZWF0ZSBhIGRlcG9zaXQgc3dpdGNoIHRva2VuXG4gICAgICogQHBhcmFtIHtEZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0fSBkZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlKGRlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3Q6IERlcG9zaXRTd2l0Y2hUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5kZXBvc2l0U3dpdGNoVG9rZW5DcmVhdGUoZGVwb3NpdFN3aXRjaFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3llcnMvc2VhcmNoYCBhbGxvd3MgeW91IHRoZSBhYmlsaXR5IHRvIHNlYXJjaCBQbGFpZOKAmXMgZGF0YWJhc2Ugb2Yga25vd24gZW1wbG95ZXJzLCBmb3IgdXNlIHdpdGggRGVwb3NpdCBTd2l0Y2guIFlvdSBjYW4gdXNlIHRoaXMgZW5kcG9pbnQgdG8gbG9vayB1cCBhIHVzZXJcXCdzIGVtcGxveWVyIGluIG9yZGVyIHRvIGNvbmZpcm0gdGhhdCB0aGV5IGFyZSBzdXBwb3J0ZWQuIFVzZXJzIHdpdGggbm9uLXN1cHBvcnRlZCBlbXBsb3llcnMgY2FuIHRoZW4gYmUgcm91dGVkIG91dCBvZiB0aGUgRGVwb3NpdCBTd2l0Y2ggZmxvdy4gIFRoZSBkYXRhIGluIHRoZSBlbXBsb3llciBkYXRhYmFzZSBpcyBjdXJyZW50bHkgbGltaXRlZC4gQXMgdGhlIERlcG9zaXQgU3dpdGNoIGFuZCBJbmNvbWUgcHJvZHVjdHMgcHJvZ3Jlc3MgdGhyb3VnaCB0aGVpciByZXNwZWN0aXZlIGJldGEgcGVyaW9kcywgbW9yZSBlbXBsb3llcnMgYXJlIGJlaW5nIHJlZ3VsYXJseSBhZGRlZC4gQmVjYXVzZSB0aGUgZW1wbG95ZXIgZGF0YWJhc2UgaXMgZnJlcXVlbnRseSB1cGRhdGVkLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3UgZG8gbm90IGNhY2hlIG9yIHN0b3JlIGRhdGEgZnJvbSB0aGlzIGVuZHBvaW50IGZvciBtb3JlIHRoYW4gYSBkYXkuXG4gICAgICogQHN1bW1hcnkgU2VhcmNoIGVtcGxveWVyIGRhdGFiYXNlXG4gICAgICogQHBhcmFtIHtFbXBsb3llcnNTZWFyY2hSZXF1ZXN0fSBlbXBsb3llcnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZW1wbG95ZXJzU2VhcmNoKGVtcGxveWVyc1NlYXJjaFJlcXVlc3Q6IEVtcGxveWVyc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5lbXBsb3llcnNTZWFyY2goZW1wbG95ZXJzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9lbXBsb3ltZW50L3ZlcmlmaWNhdGlvbi9nZXRgIHJldHVybnMgYSBsaXN0IG9mIGVtcGxveW1lbnRzIHRocm91Z2ggYSB1c2VyIHBheXJvbGwgdGhhdCB3YXMgdmVyaWZpZWQgYnkgYW4gZW5kIHVzZXIuICBUaGlzIGVuZHBvaW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQ7IG5ldyBpbnRlZ3JhdGlvbnMgc2hvdWxkIHVzZSBgL2NyZWRpdC9lbXBsb3ltZW50L2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgYSBzdW1tYXJ5IG9mIGFuIGluZGl2aWR1YWxcXCdzIGVtcGxveW1lbnQgaW5mb3JtYXRpb25cbiAgICAgKiBAcGFyYW0ge0VtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0fSBlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGVtcGxveW1lbnRWZXJpZmljYXRpb25HZXQoZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldFJlcXVlc3Q6IEVtcGxveW1lbnRWZXJpZmljYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuZW1wbG95bWVudFZlcmlmaWNhdGlvbkdldChlbXBsb3ltZW50VmVyaWZpY2F0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQSBnZW5lcmljIHdlYmhvb2sgcmVjZWl2ZXIgZW5kcG9pbnQgZm9yIEZEWCBFdmVudCBOb3RpZmljYXRpb25zXG4gICAgICogQHN1bW1hcnkgV2ViaG9vayByZWNlaXZlciBmb3IgZmR4IG5vdGlmaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0ZEWE5vdGlmaWNhdGlvbn0gZkRYTm90aWZpY2F0aW9uIFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgZmR4Tm90aWZpY2F0aW9ucyhmRFhOb3RpZmljYXRpb246IEZEWE5vdGlmaWNhdGlvbiwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmZkeE5vdGlmaWNhdGlvbnMoZkRYTm90aWZpY2F0aW9uLCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYSBzcGVjaWZpYyByZWNpcGllbnRcbiAgICAgKiBAc3VtbWFyeSBHZXQgUmVjaXBpZW50XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHJlY2lwaWVudElkIFJlY2lwaWVudCBJZGVudGlmaWVyLiBVbmlxdWVseSBpZGVudGlmaWVzIHRoZSByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29BVVRIU1RBVEVJRF0gVGhlIHZhbHVlIHRoYXQgaXMgcGFzc2VkIGludG8gdGhlIE9BdXRoIFVSSSBcXCYjMzk7c3RhdGVcXCYjMzk7IHF1ZXJ5IHBhcmFtZXRlci5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGdldFJlY2lwaWVudChyZWNpcGllbnRJZDogc3RyaW5nLCBvQVVUSFNUQVRFSUQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5nZXRSZWNpcGllbnQocmVjaXBpZW50SWQsIG9BVVRIU1RBVEVJRCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgUmVjaXBpZW50c1xuICAgICAqIEBzdW1tYXJ5IEdldCBSZWNpcGllbnRzXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSZWNpcGllbnRzKG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5nZXRSZWNpcGllbnRzKG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL2lkZW50aXR5L2RvY3VtZW50cy91cGxvYWRzL2dldGAgdG8gcmV0cmlldmUgaWRlbnRpdHkgZGV0YWlscyB3aGVuIHVzaW5nIFtJZGVudGl0eSBEb2N1bWVudCBVcGxvYWRdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvaWRlbnRpdHkvaWRlbnRpdHktZG9jdW1lbnQtdXBsb2FkLykuXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyB1cGxvYWRlZCBkb2N1bWVudCBpZGVudGl0eVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdH0gaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldChpZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0OiBJZGVudGl0eURvY3VtZW50c1VwbG9hZHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlEb2N1bWVudHNVcGxvYWRzR2V0KGlkZW50aXR5RG9jdW1lbnRzVXBsb2Fkc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy4gT25seSBuYW1lIGRhdGEgaXMgZ3VhcmFudGVlZCB0byBiZSByZXR1cm5lZDsgb3RoZXIgZmllbGRzIHdpbGwgYmUgZW1wdHkgYXJyYXlzIGlmIG5vdCBwcm92aWRlZCBieSB0aGUgaW5zdGl0dXRpb24uICBOb3RlOiBJbiBBUEkgdmVyc2lvbnMgMjAxOC0wNS0yMiBhbmQgZWFybGllciwgdGhlIGBvd25lcnNgIG9iamVjdCBpcyBub3QgcmV0dXJuZWQsIGFuZCBpbnN0ZWFkIGlkZW50aXR5IGluZm9ybWF0aW9uIGlzIHJldHVybmVkIGluIHRoZSB0b3AgbGV2ZWwgYGlkZW50aXR5YCBvYmplY3QuIEZvciBtb3JlIGRldGFpbHMsIHNlZSBbUGxhaWQgQVBJIHZlcnNpb25pbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3ZlcnNpb25pbmcvI3ZlcnNpb24tMjAxOS0wNS0yOSkuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgaWRlbnRpdHkgZGF0YVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlHZXRSZXF1ZXN0fSBpZGVudGl0eUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpZGVudGl0eUdldChpZGVudGl0eUdldFJlcXVlc3Q6IElkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmlkZW50aXR5R2V0KGlkZW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlNYXRjaFJlcXVlc3R9IGlkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlNYXRjaChpZGVudGl0eU1hdGNoUmVxdWVzdDogSWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eU1hdGNoKGlkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2lkZW50aXR5L3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSWRlbnRpdHkgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBtb3N0IHVwIHRvIGRhdGUgSWRlbnRpdHkgaW5mb3JtYXRpb24gZnJvbSB0aGUgRmluYW5jaWFsIEluc3RpdHV0aW9uLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgZm9yIGFueSBJZGVudGl0eS1lbmFibGVkIEl0ZW0uIElmIGNoYW5nZXMgdG8gSWRlbnRpdHkgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL2lkZW50aXR5L3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pZGVudGl0eS8jZGVmYXVsdF91cGRhdGUpLiAgQXMgdGhpcyBlbmRwb2ludCB0cmlnZ2VycyBhIHN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIGZyZXNoIGRhdGEsIGxhdGVuY3kgbWF5IGJlIGhpZ2hlciB0aGFuIGZvciBvdGhlciBQbGFpZCBlbmRwb2ludHMgKHR5cGljYWxseSBsZXNzIHRoYW4gMTAgc2Vjb25kcywgYnV0IG9jY2FzaW9uYWxseSB1cCB0byAzMCBzZWNvbmRzIG9yIG1vcmUpOyBpZiB5b3UgZW5jb3VudGVyIGVycm9ycywgeW91IG1heSBmaW5kIGl0IG5lY2Vzc2FyeSB0byBhZGp1c3QgeW91ciB0aW1lb3V0IHBlcmlvZCB3aGVuIG1ha2luZyByZXF1ZXN0cy4gIGAvaWRlbnRpdHkvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gSWRlbnRpdHkgYW5kIGhhcyBhIHNlcGFyYXRlIFtmZWUgbW9kZWxdKC9kb2NzL2FjY291bnQvYmlsbGluZy8jcGVyLXJlcXVlc3QtZmxhdC1mZWUpLiBUbyByZXF1ZXN0IGFjY2VzcyB0byB0aGlzIGVuZHBvaW50LCBzdWJtaXQgYSBbcHJvZHVjdCBhY2Nlc3MgcmVxdWVzdF0oaHR0cHM6Ly9kYXNoYm9hcmQucGxhaWQuY29tL3RlYW0vcHJvZHVjdHMpIG9yIGNvbnRhY3QgeW91ciBQbGFpZCBhY2NvdW50IG1hbmFnZXIuXG4gICAgICogQHN1bW1hcnkgUmVmcmVzaCBpZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVJlZnJlc2hSZXF1ZXN0fSBpZGVudGl0eVJlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlSZWZyZXNoKGlkZW50aXR5UmVmcmVzaFJlcXVlc3Q6IElkZW50aXR5UmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVJlZnJlc2goaWRlbnRpdHlSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVHJ5IHRvIGF1dG9maWxsIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvbiBiYXNlZCBvZiB0aGUgcHJvdmlkZWQgcGhvbmUgbnVtYmVyLCBkYXRlIG9mIGJpcnRoIGFuZCBjb3VudHJ5IG9mIHJlc2lkZW5jZS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYXV0b2ZpbGwgZm9yIGFuIElkZW50aXR5IFZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3R9IGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlUmVxdWVzdDogSWRlbnRpdHlWZXJpZmljYXRpb25BdXRvZmlsbENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkF1dG9maWxsQ3JlYXRlKGlkZW50aXR5VmVyaWZpY2F0aW9uQXV0b2ZpbGxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGZvciB0aGUgdXNlciBzcGVjaWZpZWQgYnkgdGhlIGBjbGllbnRfdXNlcl9pZGAgZmllbGQuIFRoZSByZXF1aXJlbWVudHMgYW5kIGJlaGF2aW9yIG9mIHRoZSB2ZXJpZmljYXRpb24gYXJlIGRldGVybWluZWQgYnkgdGhlIGB0ZW1wbGF0ZV9pZGAgcHJvdmlkZWQuIElmIHlvdSBkb25cXCd0IGtub3cgd2hldGhlciB0aGUgYXNzb2NpYXRlZCB1c2VyIGFscmVhZHkgaGFzIGFuIGFjdGl2ZSBJZGVudGl0eSBWZXJpZmljYXRpb24sIHlvdSBjYW4gc3BlY2lmeSBgXFxcImlzX2lkZW1wb3RlbnRcXFwiOiB0cnVlYCBpbiB0aGUgcmVxdWVzdCBib2R5LiBXaXRoIGlkZW1wb3RlbmN5IGVuYWJsZWQsIGEgbmV3IElkZW50aXR5IFZlcmlmaWNhdGlvbiB3aWxsIG9ubHkgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBmb3IgdGhlIGFzc29jaWF0ZWQgYGNsaWVudF91c2VyX2lkYCBhbmQgYHRlbXBsYXRlX2lkYC4gSWYgYW4gSWRlbnRpdHkgVmVyaWZpY2F0aW9uIGlzIGZvdW5kLCBpdCB3aWxsIGJlIHJldHVybmVkIHVubW9kaWZpZWQgd2l0aCBhbiBgMjAwIE9LYCBIVFRQIHN0YXR1cyBjb2RlLiAgWW91IGNhbiBhbHNvIHVzZSB0aGlzIGVuZHBvaW50IHRvIHN1cHBseSBpbmZvcm1hdGlvbiB5b3UgYWxyZWFkeSBoYXZlIGNvbGxlY3RlZCBhYm91dCB0aGUgdXNlcjsgaWYgYW55IG9mIHRoZXNlIGZpZWxkcyBhcmUgc3BlY2lmaWVkLCB0aGUgc2NyZWVucyBwcm9tcHRpbmcgdGhlIHVzZXIgdG8gZW50ZXIgdGhlbSB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIHRoZSBMaW5rIGZsb3cuIFxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIG5ldyBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGUoaWRlbnRpdHlWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZShpZGVudGl0eVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIElkZW50aXR5IFZlcmlmaWNhdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uR2V0UmVxdWVzdH0gaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25HZXQoaWRlbnRpdHlWZXJpZmljYXRpb25HZXRSZXF1ZXN0OiBJZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkdldChpZGVudGl0eVZlcmlmaWNhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbHRlciBhbmQgbGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zIGNyZWF0ZWQgYnkgeW91ciBhY2NvdW50XG4gICAgICogQHN1bW1hcnkgTGlzdCBJZGVudGl0eSBWZXJpZmljYXRpb25zXG4gICAgICogQHBhcmFtIHtJZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0KGlkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pZGVudGl0eVZlcmlmaWNhdGlvbkxpc3QoaWRlbnRpdHlWZXJpZmljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3cgYSBjdXN0b21lciB0byByZXRyeSB0aGVpciBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAc3VtbWFyeSBSZXRyeSBhbiBJZGVudGl0eSBWZXJpZmljYXRpb25cbiAgICAgKiBAcGFyYW0ge0lkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0fSBpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGlkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnkoaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeVJlcXVlc3Q6IElkZW50aXR5VmVyaWZpY2F0aW9uUmV0cnlSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaWRlbnRpdHlWZXJpZmljYXRpb25SZXRyeShpZGVudGl0eVZlcmlmaWNhdGlvblJldHJ5UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL2NyZWF0ZWAgYmVnaW5zIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIHByb2Nlc3MgYnkgcmV0dXJuaW5nIGFuIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYC4gWW91IGNhbiB0aGVuIHByb3ZpZGUgdGhlIGBpbmNvbWVfdmVyaWZpY2F0aW9uX2lkYCB0byBgL2xpbmsvdG9rZW4vY3JlYXRlYCB1bmRlciB0aGUgYGluY29tZV92ZXJpZmljYXRpb25gIHBhcmFtZXRlciBpbiBvcmRlciB0byBjcmVhdGUgYSBMaW5rIGluc3RhbmNlIHRoYXQgd2lsbCBwcm9tcHQgdGhlIHVzZXIgdG8gZ28gdGhyb3VnaCB0aGUgaW5jb21lIHZlcmlmaWNhdGlvbiBmbG93LiBQbGFpZCB3aWxsIGZpcmUgYW4gYElOQ09NRWAgd2ViaG9vayBvbmNlIHRoZSB1c2VyIGNvbXBsZXRlcyB0aGUgUGF5cm9sbCBJbmNvbWUgZmxvdywgb3Igd2hlbiB0aGUgdXBsb2FkZWQgZG9jdW1lbnRzIGluIHRoZSBEb2N1bWVudCBJbmNvbWUgZmxvdyBoYXZlIGZpbmlzaGVkIHByb2Nlc3NpbmcuIFxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBDcmVhdGUgYW4gaW5jb21lIHZlcmlmaWNhdGlvbiBpbnN0YW5jZVxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdH0gaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZShpbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0OiBJbmNvbWVWZXJpZmljYXRpb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uQ3JlYXRlKGluY29tZVZlcmlmaWNhdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvaW5jb21lL3ZlcmlmaWNhdGlvbi9kb2N1bWVudHMvZG93bmxvYWRgIHByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGRvd25sb2FkIHRoZSBzb3VyY2UgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgSWYgRG9jdW1lbnQgSW5jb21lIHdhcyB1c2VkLCB0aGUgZG9jdW1lbnRzIHdpbGwgYmUgdGhvc2UgdGhlIHVzZXIgcHJvdmlkZWQgaW4gTGluay4gRm9yIFBheXJvbGwgSW5jb21lLCB0aGUgbW9zdCByZWNlbnQgZmlsZXMgYXZhaWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZSBwYXlyb2xsIHByb3ZpZGVyIHdpbGwgYmUgYXZhaWxhYmxlIGZyb20gdGhpcyBlbmRwb2ludC4gIFRoZSByZXNwb25zZSB0byBgL2luY29tZS92ZXJpZmljYXRpb24vZG9jdW1lbnRzL2Rvd25sb2FkYCBpcyBhIFpJUCBmaWxlIGluIGJpbmFyeSBkYXRhLiBJZiBhIGBkb2N1bWVudF9pZGAgaXMgcGFzc2VkLCBhIHNpbmdsZSBkb2N1bWVudCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGlzIGZpbGUuIElmIG5vdCwgdGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhbGwgZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdmVyaWZpY2F0aW9uLiAgVGhlIGByZXF1ZXN0X2lkYCBpcyByZXR1cm5lZCBpbiB0aGUgYFBsYWlkLVJlcXVlc3QtSURgIGhlYWRlci5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgRG93bmxvYWQgdGhlIG9yaWdpbmFsIGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25Eb2N1bWVudHNEb3dubG9hZFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkKGluY29tZVZlcmlmaWNhdGlvbkRvY3VtZW50c0Rvd25sb2FkUmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWQoaW5jb21lVmVyaWZpY2F0aW9uRG9jdW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2luY29tZS92ZXJpZmljYXRpb24vcGF5c3R1YnMvZ2V0YCByZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZnJvbSB0aGUgcGF5c3R1YnMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcGF5c3R1YnMgdXNlZCBmb3IgaW5jb21lIHZlcmlmaWNhdGlvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUGF5c3R1YnNHZXRSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldChpbmNvbWVWZXJpZmljYXRpb25QYXlzdHVic0dldFJlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0KGluY29tZVZlcmlmaWNhdGlvblBheXN0dWJzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3ByZWNoZWNrYCBpcyBhbiBvcHRpb25hbCBlbmRwb2ludCB0aGF0IGNhbiBiZSBjYWxsZWQgYmVmb3JlIGluaXRpYWxpemluZyBhIExpbmsgc2Vzc2lvbiBmb3IgaW5jb21lIHZlcmlmaWNhdGlvbi4gSXQgZXZhbHVhdGVzIHdoZXRoZXIgYSBnaXZlbiB1c2VyIGlzIHN1cHBvcnRhYmxlIGJ5IGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBhbmQgcmV0dXJucyBhIGBwcmVjaGVja19pZGAgdGhhdCBjYW4gYmUgcHJvdmlkZWQgdG8gYC9saW5rL3Rva2VuL2NyZWF0ZWAuIElmIHRoZSB1c2VyIGlzIGVsaWdpYmxlIGZvciBkaWdpdGFsIHZlcmlmaWNhdGlvbiwgcHJvdmlkaW5nIHRoZSBgcHJlY2hlY2tfaWRgIGluIHRoaXMgd2F5IHdpbGwgZ2VuZXJhdGUgYSBMaW5rIFVJIG9wdGltaXplZCBmb3IgdGhlIGVuZCB1c2VyIGFuZCB0aGVpciBzcGVjaWZpYyBlbXBsb3llci4gSWYgdGhlIHVzZXIgY2Fubm90IGJlIGNvbmZpcm1lZCBhcyBlbGlnaWJsZSwgdGhlIGBwcmVjaGVja19pZGAgY2FuIHN0aWxsIGJlIHByb3ZpZGVkIHRvIGAvbGluay90b2tlbi9jcmVhdGVgIGFuZCB0aGUgdXNlciBjYW4gc3RpbGwgdXNlIHRoZSBpbmNvbWUgdmVyaWZpY2F0aW9uIGZsb3csIGJ1dCB0aGV5IG1heSBiZSByZXF1aXJlZCB0byBtYW51YWxseSB1cGxvYWQgYSBwYXlzdHViIHRvIHZlcmlmeSB0aGVpciBpbmNvbWUuICBXaGlsZSBhbGwgcmVxdWVzdCBmaWVsZHMgYXJlIG9wdGlvbmFsLCBwcm92aWRpbmcgZWl0aGVyIGBlbXBsb3llcmAgb3IgYHRyYW5zYWN0aW9uc19hY2Nlc3NfdG9rZW5zYCBkYXRhIHdpbGwgaW5jcmVhc2UgdGhlIGNoYW5jZSBvZiByZWNlaXZpbmcgYSB1c2VmdWwgcmVzdWx0LiAgVGhpcyBlbmRwb2ludCBoYXMgYmVlbiBkZXByZWNhdGVkOyBuZXcgaW50ZWdyYXRpb25zIHNob3VsZCB1c2UgYC9jcmVkaXQvcGF5cm9sbF9pbmNvbWUvcHJlY2hlY2tgIGluc3RlYWQuXG4gICAgICogQHN1bW1hcnkgKERlcHJlY2F0ZWQpIENoZWNrIGRpZ2l0YWwgaW5jb21lIHZlcmlmaWNhdGlvbiBlbGlnaWJpbGl0eSBhbmQgb3B0aW1pemUgY29udmVyc2lvblxuICAgICAqIEBwYXJhbSB7SW5jb21lVmVyaWZpY2F0aW9uUHJlY2hlY2tSZXF1ZXN0fSBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVjayhpbmNvbWVWZXJpZmljYXRpb25QcmVjaGVja1JlcXVlc3Q6IEluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrKGluY29tZVZlcmlmaWNhdGlvblByZWNoZWNrUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9pbmNvbWUvdmVyaWZpY2F0aW9uL3RheGZvcm1zL2dldGAgcmV0dXJucyB0aGUgaW5mb3JtYXRpb24gY29sbGVjdGVkIGZyb20gZm9ybXMgdGhhdCB3ZXJlIHVzZWQgdG8gdmVyaWZ5IGFuIGVuZCB1c2VyXFwnXFwncyBpbmNvbWUuIEl0IGNhbiBiZSBjYWxsZWQgb25jZSB0aGUgc3RhdHVzIG9mIHRoZSB2ZXJpZmljYXRpb24gaGFzIGJlZW4gc2V0IHRvIGBWRVJJRklDQVRJT05fU1RBVFVTX1BST0NFU1NJTkdfQ09NUExFVEVgLCBhcyByZXBvcnRlZCBieSB0aGUgYElOQ09NRTogdmVyaWZpY2F0aW9uX3N0YXR1c2Agd2ViaG9vay4gQXR0ZW1wdGluZyB0byBjYWxsIHRoZSBlbmRwb2ludCBiZWZvcmUgdmVyaWZpY2F0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIFRoaXMgZW5kcG9pbnQgaGFzIGJlZW4gZGVwcmVjYXRlZDsgbmV3IGludGVncmF0aW9ucyBzaG91bGQgdXNlIGAvY3JlZGl0L3BheXJvbGxfaW5jb21lL2dldGAgaW5zdGVhZC5cbiAgICAgKiBAc3VtbWFyeSAoRGVwcmVjYXRlZCkgUmV0cmlldmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgdGF4IGRvY3VtZW50cyB1c2VkIGZvciBpbmNvbWUgdmVyaWZpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJbmNvbWVWZXJpZmljYXRpb25UYXhmb3Jtc0dldFJlcXVlc3R9IGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0KGluY29tZVZlcmlmaWNhdGlvblRheGZvcm1zR2V0UmVxdWVzdDogSW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXQoaW5jb21lVmVyaWZpY2F0aW9uVGF4Zm9ybXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgSlNPTiByZXNwb25zZSBjb250YWluaW5nIGRldGFpbHMgb24gYWxsIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMgY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gQmVjYXVzZSBQbGFpZCBzdXBwb3J0cyB0aG91c2FuZHMgb2YgaW5zdGl0dXRpb25zLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuICBJZiB0aGVyZSBpcyBubyBvdmVybGFwIGJldHdlZW4gYW4gaW5zdGl0dXRpb27igJlzIGVuYWJsZWQgcHJvZHVjdHMgYW5kIGEgY2xpZW504oCZcyBlbmFibGVkIHByb2R1Y3RzLCB0aGVuIHRoZSBpbnN0aXR1dGlvbiB3aWxsIGJlIGZpbHRlcmVkIG91dCBmcm9tIHRoZSByZXNwb25zZS4gQXMgYSByZXN1bHQsIHRoZSBudW1iZXIgb2YgaW5zdGl0dXRpb25zIHJldHVybmVkIG1heSBub3QgbWF0Y2ggdGhlIGNvdW50IHNwZWNpZmllZCBpbiB0aGUgY2FsbC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgZGV0YWlscyBvZiBhbGwgc3VwcG9ydGVkIGluc3RpdHV0aW9uc1xuICAgICAqIEBwYXJhbSB7SW5zdGl0dXRpb25zR2V0UmVxdWVzdH0gaW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluc3RpdHV0aW9uc0dldChpbnN0aXR1dGlvbnNHZXRSZXF1ZXN0OiBJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5zdGl0dXRpb25zR2V0KGluc3RpdHV0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgYSBKU09OIHJlc3BvbnNlIGNvbnRhaW5pbmcgZGV0YWlscyBvbiBhIHNwZWNpZmllZCBmaW5hbmNpYWwgaW5zdGl0dXRpb24gY3VycmVudGx5IHN1cHBvcnRlZCBieSBQbGFpZC4gIFZlcnNpb25pbmcgbm90ZTogQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgYWxsb3cgdXNlIG9mIHRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCB0byBhdXRoZW50aWNhdGUgdG8gdGhpcyBlbmRwb2ludC4gVGhlIGBwdWJsaWNfa2V5YCBoYXMgYmVlbiBkZXByZWNhdGVkOyBhbGwgY3VzdG9tZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSBgY2xpZW50X2lkYCBhbmQgYHNlY3JldGAgaW5zdGVhZC4gXG4gICAgICogQHN1bW1hcnkgR2V0IGRldGFpbHMgb2YgYW4gaW5zdGl0dXRpb25cbiAgICAgKiBAcGFyYW0ge0luc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0fSBpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGluc3RpdHV0aW9uc0dldEJ5SWQoaW5zdGl0dXRpb25zR2V0QnlJZFJlcXVlc3Q6IEluc3RpdHV0aW9uc0dldEJ5SWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaW5zdGl0dXRpb25zR2V0QnlJZChpbnN0aXR1dGlvbnNHZXRCeUlkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhIEpTT04gcmVzcG9uc2UgY29udGFpbmluZyBkZXRhaWxzIGZvciBpbnN0aXR1dGlvbnMgdGhhdCBtYXRjaCB0aGUgcXVlcnkgcGFyYW1ldGVycywgdXAgdG8gYSBtYXhpbXVtIG9mIHRlbiBpbnN0aXR1dGlvbnMgcGVyIHF1ZXJ5LiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciBhbGxvdyB1c2Ugb2YgdGhlIGBwdWJsaWNfa2V5YCBwYXJhbWV0ZXIgaW5zdGVhZCBvZiB0aGUgYGNsaWVudF9pZGAgYW5kIGBzZWNyZXRgIHBhcmFtZXRlcnMgdG8gYXV0aGVudGljYXRlIHRvIHRoaXMgZW5kcG9pbnQuIFRoZSBgcHVibGljX2tleWAgcGFyYW1ldGVyIGhhcyBzaW5jZSBiZWVuIGRlcHJlY2F0ZWQ7IGFsbCBjdXN0b21lcnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGBjbGllbnRfaWRgIGFuZCBgc2VjcmV0YCBpbnN0ZWFkLiBcbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggaW5zdGl0dXRpb25zXG4gICAgICogQHBhcmFtIHtJbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0fSBpbnN0aXR1dGlvbnNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW5zdGl0dXRpb25zU2VhcmNoKGluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3Q6IEluc3RpdHV0aW9uc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnN0aXR1dGlvbnNTZWFyY2goaW5zdGl0dXRpb25zU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvYXV0aC9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIGRhdGEgdG8gZmFjaWxpdGF0ZSB0aGUgdHJhbnNmZXIgb2YgaG9sZGluZ3NcbiAgICAgKiBAc3VtbWFyeSBHZXQgZGF0YSBuZWVkZWQgdG8gYXV0aG9yaXplIGFuIGludmVzdG1lbnRzIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c0F1dGhHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNBdXRoR2V0KGludmVzdG1lbnRzQXV0aEdldFJlcXVlc3Q6IEludmVzdG1lbnRzQXV0aEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c0F1dGhHZXQoaW52ZXN0bWVudHNBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvaG9sZGluZ3MvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIHVzZXItYXV0aG9yaXplZCBzdG9jayBwb3NpdGlvbiBkYXRhIGZvciBgaW52ZXN0bWVudGAtdHlwZSBhY2NvdW50cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgSW52ZXN0bWVudCBob2xkaW5nc1xuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3R9IGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNIb2xkaW5nc0dldChpbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdDogSW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c0hvbGRpbmdzR2V0KGludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IGZvciB1c2VycyBvZiB0aGUgSW52ZXN0bWVudHMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgaW52ZXN0bWVudCBob2xkaW5ncyBhbmQgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGlzIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRha2VzIHBsYWNlIGluIGFkZGl0aW9uIHRvIHRoZSBwZXJpb2RpYyBleHRyYWN0aW9ucyB0aGF0IGF1dG9tYXRpY2FsbHkgb2NjdXIgb25lIG9yIG1vcmUgdGltZXMgcGVyIGRheSBmb3IgYW55IEludmVzdG1lbnRzLWVuYWJsZWQgSXRlbS4gSWYgY2hhbmdlcyB0byBpbnZlc3RtZW50cyBhcmUgZGlzY292ZXJlZCBhZnRlciBjYWxsaW5nIGAvaW52ZXN0bWVudHMvcmVmcmVzaGAsIFBsYWlkIHdpbGwgZmlyZSB3ZWJob29rczogW2BIT0xESU5HUzogREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy9pbnZlc3RtZW50cy8jaG9sZGluZ3MtZGVmYXVsdF91cGRhdGUpIGlmIGFueSBuZXcgaG9sZGluZ3MgYXJlIGRldGVjdGVkLCBhbmQgW2BJTlZFU1RNRU5UU19UUkFOU0FDVElPTlM6IERFRkFVTFRfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvI2ludmVzdG1lbnRzX3RyYW5zYWN0aW9ucy1kZWZhdWx0X3VwZGF0ZSkgaWYgYW55IG5ldyBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucyBhcmUgZGV0ZWN0ZWQuIFRoaXMgd2ViaG9vayB3aWxsIHR5cGljYWxseSBub3QgZmlyZSBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgZHVlIHRvIHRoZSBsYWNrIG9mIGR5bmFtaWMgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYW5kIGhvbGRpbmdzIGRhdGEuIFRvIHRlc3QgdGhpcyB3ZWJob29rIGluIFNhbmRib3gsIGNhbGwgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYC4gVXBkYXRlZCBob2xkaW5ncyBhbmQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgY2FuIGJlIGZldGNoZWQgYnkgY2FsbGluZyBgL2ludmVzdG1lbnRzL2hvbGRpbmdzL2dldGAgYW5kIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIE5vdGUgdGhhdCB0aGUgYC9pbnZlc3RtZW50cy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGFsbCBpbnN0aXR1dGlvbnMuIElmIGNhbGxlZCBvbiBhbiBJdGVtIGZyb20gYW4gaW5zdGl0dXRpb24gdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb25hbGl0eSwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfU1VQUE9SVEVEYCBlcnJvci4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL2ludmVzdG1lbnRzL3JlZnJlc2hgIGlzIG9mZmVyZWQgYXMgYW4gYWRkLW9uIHRvIEludmVzdG1lbnRzIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggaW52ZXN0bWVudCBkYXRhXG4gICAgICogQHBhcmFtIHtJbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0fSBpbnZlc3RtZW50c1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaW52ZXN0bWVudHNSZWZyZXNoKGludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3Q6IEludmVzdG1lbnRzUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pbnZlc3RtZW50c1JlZnJlc2goaW52ZXN0bWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgZW5kcG9pbnQgYWxsb3dzIGRldmVsb3BlcnMgdG8gcmV0cmlldmUgdXAgdG8gMjQgbW9udGhzIG9mIHVzZXItYXV0aG9yaXplZCB0cmFuc2FjdGlvbiBkYXRhIGZvciBpbnZlc3RtZW50IGFjY291bnRzLiAgVHJhbnNhY3Rpb25zIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIsIGFuZCB0aGUgc2VxdWVuY2Ugb2YgdHJhbnNhY3Rpb24gb3JkZXJpbmcgaXMgc3RhYmxlIGFuZCB3aWxsIG5vdCBzaGlmdC4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIGludmVzdG1lbnQgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBmaXJzdCBjYWxsZWQsIFBsYWlkIHdpbGwgd2FpdCBmb3IgdGhlIGRhdGEuIEZvciB0aGlzIHJlYXNvbiwgY2FsbGluZyBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGltbWVkaWF0ZWx5IGFmdGVyIExpbmsgbWF5IHRha2UgdXAgdG8gb25lIHRvIHR3byBtaW51dGVzIHRvIHJldHVybi4gIERhdGEgcmV0dXJuZWQgYnkgdGhlIGFzeW5jaHJvbm91cyBpbnZlc3RtZW50cyBleHRyYWN0aW9uIGZsb3cgKHdoZW4gYGFzeW5jX3VwZGF0ZWAgaXMgc2V0IHRvIHRydWUpIG1heSBub3QgYmUgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHRvIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL2ludmVzdG1lbnRzL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLlxuICAgICAqIEBzdW1tYXJ5IEdldCBpbnZlc3RtZW50IHRyYW5zYWN0aW9uc1xuICAgICAqIEBwYXJhbSB7SW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChpbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IEludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KGludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBgSXNzdWVgLiBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBzaW5nbGUgYElzc3VlYCBvYmplY3QuXG4gICAgICogQHN1bW1hcnkgR2V0IGFuIElzc3VlXG4gICAgICogQHBhcmFtIHtJc3N1ZXNHZXRSZXF1ZXN0fSBpc3N1ZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNzdWVzR2V0KGlzc3Vlc0dldFJlcXVlc3Q6IElzc3Vlc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pc3N1ZXNHZXQoaXNzdWVzR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2VhcmNoIGZvciBhbiBpc3N1ZSBhc3NvY2lhdGVkIHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgaWRlbnRpZmllcnM6ICBgaXRlbV9pZGAsIGBsaW5rX3Nlc3Npb25faWRgIG9yIExpbmsgc2Vzc2lvbiBgcmVxdWVzdF9pZGAuICBUaGlzIGVuZHBvaW50IHJldHVybnMgYSBsaXN0IG9mIGBJc3N1ZWAgb2JqZWN0cywgd2l0aCBhbiBlbXB0eSBsaXN0IGluZGljYXRpbmcgdGhhdCBubyBpc3N1ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgaWRlbnRpZmllci4gQXQgbGVhc3Qgb25lIG9mIHRoZSBpZGVudGlmaWVycyBtdXN0IGJlIHByb3ZpZGVkIHRvIHBlcmZvcm0gdGhlIHNlYXJjaC5cbiAgICAgKiBAc3VtbWFyeSBTZWFyY2ggZm9yIGFuIElzc3VlXG4gICAgICogQHBhcmFtIHtJc3N1ZXNTZWFyY2hSZXF1ZXN0fSBpc3N1ZXNTZWFyY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNzdWVzU2VhcmNoKGlzc3Vlc1NlYXJjaFJlcXVlc3Q6IElzc3Vlc1NlYXJjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pc3N1ZXNTZWFyY2goaXNzdWVzU2VhcmNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWxsb3dzIGEgdXNlciB0byBzdWJzY3JpYmUgdG8gdXBkYXRlcyBvbiBhIHNwZWNpZmljIGBJc3N1ZWAgdXNpbmcgYSBQT1NUIG1ldGhvZC4gU3Vic2NyaWJlcnMgd2lsbCByZWNlaXZlIHdlYmhvb2sgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBpc3N1ZSBzdGF0dXMgY2hhbmdlcywgcGFydGljdWxhcmx5IHdoZW4gcmVzb2x2ZWQuXG4gICAgICogQHN1bW1hcnkgU3Vic2NyaWJlIHRvIGFuIElzc3VlXG4gICAgICogQHBhcmFtIHtJc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0fSBpc3N1ZXNTdWJzY3JpYmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNzdWVzU3Vic2NyaWJlKGlzc3Vlc1N1YnNjcmliZVJlcXVlc3Q6IElzc3Vlc1N1YnNjcmliZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pc3N1ZXNTdWJzY3JpYmUoaXNzdWVzU3Vic2NyaWJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnkgZGVmYXVsdCwgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGRvZXMgbm90IGV4cGlyZSBhbmQgc2hvdWxkIGJlIHN0b3JlZCBpbiBhIHBlcnNpc3RlbnQsIHNlY3VyZSBtYW5uZXIuICBZb3UgY2FuIHVzZSB0aGUgYC9pdGVtL2FjY2Vzc190b2tlbi9pbnZhbGlkYXRlYCBlbmRwb2ludCB0byByb3RhdGUgdGhlIGBhY2Nlc3NfdG9rZW5gIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtLiBUaGUgZW5kcG9pbnQgcmV0dXJucyBhIG5ldyBgYWNjZXNzX3Rva2VuYCBhbmQgaW1tZWRpYXRlbHkgaW52YWxpZGF0ZXMgdGhlIHByZXZpb3VzIGBhY2Nlc3NfdG9rZW5gLiBcbiAgICAgKiBAc3VtbWFyeSBJbnZhbGlkYXRlIGFjY2Vzc190b2tlblxuICAgICAqIEBwYXJhbSB7SXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3R9IGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZShpdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlUmVxdWVzdDogSXRlbUFjY2Vzc1Rva2VuSW52YWxpZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQWNjZXNzVG9rZW5JbnZhbGlkYXRlKGl0ZW1BY2Nlc3NUb2tlbkludmFsaWRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGEgaGlzdG9yaWNhbCBsb2cgb2YgdXNlciBjb25zZW50IGV2ZW50c1xuICAgICAqIEBzdW1tYXJ5IExpc3QgYSBoaXN0b3JpY2FsIGxvZyBvZiB1c2VyIGNvbnNlbnQgZXZlbnRzXG4gICAgICogQHBhcmFtIHtJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdH0gaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQWN0aXZpdHlMaXN0KGl0ZW1BY3Rpdml0eUxpc3RSZXF1ZXN0OiBJdGVtQWN0aXZpdHlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BY3Rpdml0eUxpc3QoaXRlbUFjdGl2aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25zXG4gICAgICogQHN1bW1hcnkgTGlzdCBhIHVzZXLigJlzIGNvbm5lY3RlZCBhcHBsaWNhdGlvbnNcbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1BcHBsaWNhdGlvbkxpc3QoaXRlbUFwcGxpY2F0aW9uTGlzdFJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvbkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUFwcGxpY2F0aW9uTGlzdChpdGVtQXBwbGljYXRpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGNvbnN1bWVycyB0byB1cGRhdGUgcHJvZHVjdCBhY2Nlc3Mgb24gc2VsZWN0ZWQgYWNjb3VudHMgZm9yIGFuIGFwcGxpY2F0aW9uLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSB0aGUgc2NvcGVzIG9mIGFjY2VzcyBmb3IgYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uXG4gICAgICogQHBhcmFtIHtJdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0fSBpdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlKGl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3Q6IEl0ZW1BcHBsaWNhdGlvblNjb3Blc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQXBwbGljYXRpb25TY29wZXNVcGRhdGUoaXRlbUFwcGxpY2F0aW9uU2NvcGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVW5saW5rIGEgdXNlcuKAmXMgY29ubmVjdGVkIGFwcGxpY2F0aW9uLiBPbiBhbiB1bmxpbmsgcmVxdWVzdCwgUGxhaWQgd2lsbCBpbW1lZGlhdGVseSByZXZva2UgdGhlIEFwcGxpY2F0aW9u4oCZcyBhY2Nlc3MgdG8gdGhlIFVzZXLigJlzIGRhdGEuICBUaGUgVXNlciB3aWxsIGhhdmUgdG8gcmVkbyB0aGUgT0F1dGggYXV0aGVudGljYXRpb24gcHJvY2VzcyBpbiBvcmRlciB0byByZXN0b3JlIGZ1bmN0aW9uYWxpdHkuICBUaGlzIGVuZHBvaW50IG9ubHkgcmVtb3ZlcyBvbmdvaW5nIGRhdGEgYWNjZXNzIHBlcm1pc3Npb25zLCB0aGVyZWZvcmUgdGhlIFVzZXIgd2lsbCBuZWVkIHRvIHJlYWNoIG91dCB0byB0aGUgQXBwbGljYXRpb24gaXRzZWxmIGluIG9yZGVyIHRvIGRpc2FibGUgYW5kIGRlbGV0ZSB0aGVpciBhY2NvdW50IGFuZCBkZWxldGUgYW55IGRhdGEgdGhhdCB0aGUgQXBwbGljYXRpb24gYWxyZWFkeSByZWNlaXZlZCAoaWYgdGhlIEFwcGxpY2F0aW9uIGRvZXMgbm90IGRvIHNvIGJ5IGRlZmF1bHQpLiAgVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGluIHJlYWwgdGltZSBhcyB0aGUgVXNlciBpcyB1bmxpbmtpbmcgYW4gQXBwbGljYXRpb24sIGFuZCBzaG91bGQgbm90IGJlIGJhdGNoZWQgaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBpcyByZWZsZWN0ZWQgYXMgc29vbiBhcyBwb3NzaWJsZS5cbiAgICAgKiBAc3VtbWFyeSBVbmxpbmsgYSB1c2Vy4oCZcyBjb25uZWN0ZWQgYXBwbGljYXRpb25cbiAgICAgKiBAcGFyYW0ge0l0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3R9IGl0ZW1BcHBsaWNhdGlvblVubGlua1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtQXBwbGljYXRpb25VbmxpbmsoaXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdDogSXRlbUFwcGxpY2F0aW9uVW5saW5rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1BcHBsaWNhdGlvblVubGluayhpdGVtQXBwbGljYXRpb25VbmxpbmtSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlOiBBcyBvZiBKdWx5IDIwMjAsIHRoZSBgL2l0ZW0vcHVibGljX3Rva2VuL2NyZWF0ZWAgZW5kcG9pbnQgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIGAvbGluay90b2tlbi9jcmVhdGVgIHdpdGggYW4gYGFjY2Vzc190b2tlbmAgdG8gY3JlYXRlIGEgTGluayB0b2tlbiBmb3IgdXNlIHdpdGggW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpLiAgSWYgeW91IG5lZWQgeW91ciB1c2VyIHRvIHRha2UgYWN0aW9uIHRvIHJlc3RvcmUgb3IgcmVzb2x2ZSBhbiBlcnJvciBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgZ2VuZXJhdGUgYSBwdWJsaWMgdG9rZW4gd2l0aCB0aGUgYC9pdGVtL3B1YmxpY190b2tlbi9jcmVhdGVgIGVuZHBvaW50IGFuZCB0aGVuIGluaXRpYWxpemUgTGluayB3aXRoIHRoYXQgYHB1YmxpY190b2tlbmAuICBBIGBwdWJsaWNfdG9rZW5gIGlzIG9uZS10aW1lIHVzZSBhbmQgZXhwaXJlcyBhZnRlciAzMCBtaW51dGVzLiBZb3UgdXNlIGEgYHB1YmxpY190b2tlbmAgdG8gaW5pdGlhbGl6ZSBMaW5rIGluIFt1cGRhdGUgbW9kZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9saW5rL3VwZGF0ZS1tb2RlKSBmb3IgYSBwYXJ0aWN1bGFyIEl0ZW0uIFlvdSBjYW4gZ2VuZXJhdGUgYSBgcHVibGljX3Rva2VuYCBmb3IgYW4gSXRlbSBldmVuIGlmIHlvdSBkaWQgbm90IHVzZSBMaW5rIHRvIGNyZWF0ZSB0aGUgSXRlbSBvcmlnaW5hbGx5LiAgVGhlIGAvaXRlbS9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCBpcyAqKm5vdCoqIHVzZWQgdG8gY3JlYXRlIHlvdXIgaW5pdGlhbCBgcHVibGljX3Rva2VuYC4gSWYgeW91IGhhdmUgbm90IGFscmVhZHkgcmVjZWl2ZWQgYW4gYGFjY2Vzc190b2tlbmAgZm9yIGEgc3BlY2lmaWMgSXRlbSwgdXNlIExpbmsgdG8gb2J0YWluIHlvdXIgYHB1YmxpY190b2tlbmAgaW5zdGVhZC4gU2VlIHRoZSBbUXVpY2tzdGFydF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9xdWlja3N0YXJ0KSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcHVibGljIHRva2VuXG4gICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBpdGVtUHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUNyZWF0ZVB1YmxpY1Rva2VuKGl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IEl0ZW1QdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtQ3JlYXRlUHVibGljVG9rZW4oaXRlbVB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIGFuIEl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7SXRlbUdldFJlcXVlc3R9IGl0ZW1HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgaXRlbUdldChpdGVtR2V0UmVxdWVzdDogSXRlbUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5pdGVtR2V0KGl0ZW1HZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL2l0ZW0vaW1wb3J0YCBjcmVhdGVzIGFuIEl0ZW0gdmlhIHlvdXIgUGxhaWQgRXhjaGFuZ2UgSW50ZWdyYXRpb24gYW5kIHJldHVybnMgYW4gYGFjY2Vzc190b2tlbmAuIEFzIHBhcnQgb2YgYW4gYC9pdGVtL2ltcG9ydGAgcmVxdWVzdCwgeW91IHdpbGwgaW5jbHVkZSBhIFVzZXIgSUQgKGB1c2VyX2F1dGgudXNlcl9pZGApIGFuZCBBdXRoZW50aWNhdGlvbiBUb2tlbiAoYHVzZXJfYXV0aC5hdXRoX3Rva2VuYCkgdGhhdCBlbmFibGUgZGF0YSBhZ2dyZWdhdGlvbiB0aHJvdWdoIHlvdXIgUGxhaWQgRXhjaGFuZ2UgQVBJIGVuZHBvaW50cy4gVGhlc2UgYXV0aGVudGljYXRpb24gcHJpbmNpcGFscyBhcmUgdG8gYmUgY2hvc2VuIGJ5IHlvdS4gIFVwb24gY3JlYXRpbmcgYW4gSXRlbSB2aWEgYC9pdGVtL2ltcG9ydGAsIFBsYWlkIHdpbGwgYXV0b21hdGljYWxseSBiZWdpbiBhbiBleHRyYWN0aW9uIG9mIHRoYXQgSXRlbSB0aHJvdWdoIHRoZSBQbGFpZCBFeGNoYW5nZSBpbmZyYXN0cnVjdHVyZSB5b3UgaGF2ZSBhbHJlYWR5IGludGVncmF0ZWQuXG4gICAgICogQHN1bW1hcnkgSW1wb3J0IEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1JbXBvcnRSZXF1ZXN0fSBpdGVtSW1wb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1JbXBvcnQoaXRlbUltcG9ydFJlcXVlc3Q6IEl0ZW1JbXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbUltcG9ydChpdGVtSW1wb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRXhjaGFuZ2UgYSBMaW5rIGBwdWJsaWNfdG9rZW5gIGZvciBhbiBBUEkgYGFjY2Vzc190b2tlbmAuIExpbmsgaGFuZHMgb2ZmIHRoZSBgcHVibGljX3Rva2VuYCBjbGllbnQtc2lkZSB2aWEgdGhlIGBvblN1Y2Nlc3NgIGNhbGxiYWNrIG9uY2UgYSB1c2VyIGhhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBhbiBJdGVtLiBUaGUgYHB1YmxpY190b2tlbmAgaXMgZXBoZW1lcmFsIGFuZCBleHBpcmVzIGFmdGVyIDMwIG1pbnV0ZXMuIEFuIGBhY2Nlc3NfdG9rZW5gIGRvZXMgbm90IGV4cGlyZSwgYnV0IGNhbiBiZSByZXZva2VkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuICBUaGUgcmVzcG9uc2UgYWxzbyBpbmNsdWRlcyBhbiBgaXRlbV9pZGAgdGhhdCBzaG91bGQgYmUgc3RvcmVkIHdpdGggdGhlIGBhY2Nlc3NfdG9rZW5gLiBUaGUgYGl0ZW1faWRgIGlzIHVzZWQgdG8gaWRlbnRpZnkgYW4gSXRlbSBpbiBhIHdlYmhvb2suIFRoZSBgaXRlbV9pZGAgY2FuIGFsc28gYmUgcmV0cmlldmVkIGJ5IG1ha2luZyBhbiBgL2l0ZW0vZ2V0YCByZXF1ZXN0LlxuICAgICAqIEBzdW1tYXJ5IEV4Y2hhbmdlIHB1YmxpYyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuXG4gICAgICogQHBhcmFtIHtJdGVtUHVibGljVG9rZW5FeGNoYW5nZVJlcXVlc3R9IGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlKGl0ZW1QdWJsaWNUb2tlbkV4Y2hhbmdlUmVxdWVzdDogSXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2UoaXRlbVB1YmxpY1Rva2VuRXhjaGFuZ2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9pdGVtL3JlbW92ZWAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZW1vdmUgYW4gSXRlbS4gT25jZSByZW1vdmVkLCB0aGUgYGFjY2Vzc190b2tlbmAsIGFzIHdlbGwgYXMgYW55IHByb2Nlc3NvciB0b2tlbnMgb3IgYmFuayBhY2NvdW50IHRva2VucyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0sIGlzIG5vIGxvbmdlciB2YWxpZCBhbmQgY2Fubm90IGJlIHVzZWQgdG8gYWNjZXNzIGFueSBkYXRhIHRoYXQgd2FzIGFzc29jaWF0ZWQgd2l0aCB0aGUgSXRlbS4gICBDYWxsaW5nIGAvaXRlbS9yZW1vdmVgIGlzIGEgcmVjb21tZW5kZWQgYmVzdCBwcmFjdGljZSB3aGVuIG9mZmJvYXJkaW5nIHVzZXJzIG9yIGlmIGEgdXNlciBjaG9vc2VzIHRvIGRpc2Nvbm5lY3QgYW4gYWNjb3VudCBsaW5rZWQgdmlhIFBsYWlkLiBGb3Igc3Vic2NyaXB0aW9uIHByb2R1Y3RzLCBzdWNoIGFzIFRyYW5zYWN0aW9ucywgTGlhYmlsaXRpZXMsIGFuZCBJbnZlc3RtZW50cywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCBpcyByZXF1aXJlZCB0byBlbmQgc3Vic2NyaXB0aW9uIGJpbGxpbmcgZm9yIHRoZSBJdGVtLiBGb3IgbW9uZXkgbW92ZW1lbnQgcHJvZHVjdHMgc3VjaCBhcyBBdXRoIGFuZCBUcmFuc2ZlciwgaWYgdGhlIEl0ZW0gaXMgYXQgYW4gaW5zdGl0dXRpb24gdGhhdCB1c2VzIFRva2VuaXplZCBBY2NvdW50IE51bWJlcnMgKFRBTnMpLCBzdWNoIGFzIENoYXNlIG9yIFBOQywgY2FsbGluZyBgL2l0ZW0vcmVtb3ZlYCB3aWxsIGludmFsaWRhdGUgdGhlIFRBTiwgYW5kIHN1YnNlcXVlbnQgQUNIIHRyYW5zZmVyIGF0dGVtcHRzIHVzaW5nIHRoYXQgVEFOIHdpbGwgYmUgcmV0dXJuZWQuICBJbiBMaW1pdGVkIFByb2R1Y3Rpb24sIGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAgZG9lcyBub3QgaW1wYWN0IHRoZSBudW1iZXIgb2YgcmVtYWluaW5nIExpbWl0ZWQgUHJvZHVjdGlvbiBJdGVtcyB5b3UgaGF2ZSBhdmFpbGFibGUuICBSZW1vdmluZyBhbiBJdGVtIGRvZXMgbm90IGFmZmVjdCBhbnkgQXNzZXQgUmVwb3J0cyBvciBBdWRpdCBDb3BpZXMgeW91IGhhdmUgYWxyZWFkeSBjcmVhdGVkLCB3aGljaCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsIHlvdSByZW1vdmUgYWNjZXNzIHRvIHRoZW0gc3BlY2lmaWNhbGx5IHVzaW5nIHRoZSBgL2Fzc2V0X3JlcG9ydC9yZW1vdmVgIGVuZHBvaW50LiAgQWxzbyBub3RlIHRoYXQgZm9yIGNlcnRhaW4gT0F1dGgtYmFzZWQgaW5zdGl0dXRpb25zLCBhbiBJdGVtIHJlbW92ZWQgdmlhIGAvaXRlbS9yZW1vdmVgIG1heSBzdGlsbCBzaG93IGFzIGFuIGFjdGl2ZSBjb25uZWN0aW9uIGluIHRoZSBpbnN0aXR1dGlvblxcJ3MgT0F1dGggcGVybWlzc2lvbiBtYW5hZ2VyLiAgQVBJIHZlcnNpb25zIDIwMTktMDUtMjkgYW5kIGVhcmxpZXIgcmV0dXJuIGEgYHJlbW92ZWRgIGJvb2xlYW4gYXMgcGFydCBvZiB0aGUgcmVzcG9uc2UuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIGFuIEl0ZW1cbiAgICAgKiBAcGFyYW0ge0l0ZW1SZW1vdmVSZXF1ZXN0fSBpdGVtUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGl0ZW1SZW1vdmUoaXRlbVJlbW92ZVJlcXVlc3Q6IEl0ZW1SZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuaXRlbVJlbW92ZShpdGVtUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIFBPU1QgYC9pdGVtL3dlYmhvb2svdXBkYXRlYCBhbGxvd3MgeW91IHRvIHVwZGF0ZSB0aGUgd2ViaG9vayBVUkwgYXNzb2NpYXRlZCB3aXRoIGFuIEl0ZW0uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIFtgV0VCSE9PS19VUERBVEVfQUNLTk9XTEVER0VEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvaXRlbXMvI3dlYmhvb2tfdXBkYXRlX2Fja25vd2xlZGdlZCkgd2ViaG9vayB0byB0aGUgbmV3bHkgc3BlY2lmaWVkIHdlYmhvb2sgVVJMLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBXZWJob29rIFVSTFxuICAgICAqIEBwYXJhbSB7SXRlbVdlYmhvb2tVcGRhdGVSZXF1ZXN0fSBpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBpdGVtV2ViaG9va1VwZGF0ZShpdGVtV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IEl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLml0ZW1XZWJob29rVXBkYXRlKGl0ZW1XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGlhYmlsaXRpZXMvZ2V0YCBlbmRwb2ludCByZXR1cm5zIHZhcmlvdXMgZGV0YWlscyBhYm91dCBhbiBJdGVtIHdpdGggbG9hbiBvciBjcmVkaXQgYWNjb3VudHMuIExpYWJpbGl0aWVzIGRhdGEgaXMgYXZhaWxhYmxlIHByaW1hcmlseSBmb3IgVVMgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgd2l0aCBzb21lIGxpbWl0ZWQgY292ZXJhZ2Ugb2YgQ2FuYWRpYW4gaW5zdGl0dXRpb25zLiBDdXJyZW50bHkgc3VwcG9ydGVkIGFjY291bnQgdHlwZXMgYXJlIGFjY291bnQgdHlwZSBgY3JlZGl0YCB3aXRoIGFjY291bnQgc3VidHlwZSBgY3JlZGl0IGNhcmRgIG9yIGBwYXlwYWxgLCBhbmQgYWNjb3VudCB0eXBlIGBsb2FuYCB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGAgb3IgYG1vcnRnYWdlYC4gVG8gbGltaXQgYWNjb3VudHMgbGlzdGVkIGluIExpbmsgdG8gdHlwZXMgYW5kIHN1YnR5cGVzIHN1cHBvcnRlZCBieSBMaWFiaWxpdGllcywgeW91IGNhbiB1c2UgdGhlIGBhY2NvdW50X2ZpbHRlcnNgIHBhcmFtZXRlciB3aGVuIFtjcmVhdGluZyBhIExpbmsgdG9rZW5dKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL2xpbmsvI2xpbmt0b2tlbmNyZWF0ZSkuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvbGlhYmlsaXRpZXMvZ2V0YC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICogQHBhcmFtIHtMaWFiaWxpdGllc0dldFJlcXVlc3R9IGxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpYWJpbGl0aWVzR2V0KGxpYWJpbGl0aWVzR2V0UmVxdWVzdDogTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlhYmlsaXRpZXNHZXQobGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIEhvc3RlZCBMaW5rIHNlc3Npb24uXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIEhvc3RlZCBMaW5rIHNlc3Npb25cbiAgICAgKiBAcGFyYW0ge0xpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3R9IGxpbmtEZWxpdmVyeUNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBsaW5rRGVsaXZlcnlDcmVhdGUobGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdDogTGlua0RlbGl2ZXJ5Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLmxpbmtEZWxpdmVyeUNyZWF0ZShsaW5rRGVsaXZlcnlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvbGlua19kZWxpdmVyeS9nZXRgIGVuZHBvaW50IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgSG9zdGVkIExpbmsgc2Vzc2lvbi5cbiAgICAgKiBAc3VtbWFyeSBHZXQgSG9zdGVkIExpbmsgc2Vzc2lvblxuICAgICAqIEBwYXJhbSB7TGlua0RlbGl2ZXJ5R2V0UmVxdWVzdH0gbGlua0RlbGl2ZXJ5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtEZWxpdmVyeUdldChsaW5rRGVsaXZlcnlHZXRSZXF1ZXN0OiBMaW5rRGVsaXZlcnlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua0RlbGl2ZXJ5R2V0KGxpbmtEZWxpdmVyeUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEV4Y2hhbmdlIGFuIE9BdXRoIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYGxpbmtfdG9rZW5gLiBUaGUgYGxpbmtfY29ycmVsYXRpb25faWRgIGlzIG9ubHkgYXZhaWxhYmxlIGZvciBcXCdwYXltZW50X2luaXRpYXRpb25cXCcgcHJvZHVjdHMgYW5kIGlzIHByb3ZpZGVkIHRvIHRoZSBjbGllbnQgdmlhIHRoZSBPQXV0aCBgcmVkaXJlY3RfdXJpYCBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gVGhlIGBsaW5rX2NvcnJlbGF0aW9uX2lkYCBpcyBlcGhlbWVyYWwgYW5kIGV4cGlyZXMgaW4gYSBicmllZiBwZXJpb2QsIGFmdGVyIHdoaWNoIGl0IGNhbiBubyBsb25nZXIgYmUgZXhjaGFuZ2VkIGZvciB0aGUgXFwnbGlua190b2tlblxcJy5cbiAgICAgKiBAc3VtbWFyeSBFeGNoYW5nZSB0aGUgTGluayBDb3JyZWxhdGlvbiBJZCBmb3IgYSBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0fSBsaW5rT0F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua09hdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlKGxpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3Q6IExpbmtPQXV0aENvcnJlbGF0aW9uSWRFeGNoYW5nZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rT2F1dGhDb3JyZWxhdGlvbklkRXhjaGFuZ2UobGlua09BdXRoQ29ycmVsYXRpb25JZEV4Y2hhbmdlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbGluay90b2tlbi9jcmVhdGVgIGVuZHBvaW50IGNyZWF0ZXMgYSBgbGlua190b2tlbmAsIHdoaWNoIGlzIHJlcXVpcmVkIGFzIGEgcGFyYW1ldGVyIHdoZW4gaW5pdGlhbGl6aW5nIExpbmsuIE9uY2UgTGluayBoYXMgYmVlbiBpbml0aWFsaXplZCwgaXQgcmV0dXJucyBhIGBwdWJsaWNfdG9rZW5gLiBGb3IgbW9zdCBQbGFpZCBwcm9kdWN0cywgdGhlIGBwdWJsaWNfdG9rZW5gIGlzIHNhdmVkIGFuZCBleGNoYW5nZWQgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIHZpYSBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCBhcyBwYXJ0IG9mIHRoZSBtYWluIExpbmsgZmxvdy4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbTGluayBmbG93IG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvI2xpbmstZmxvdy1vdmVydmlldykuICBBIGBsaW5rX3Rva2VuYCBnZW5lcmF0ZWQgYnkgYC9saW5rL3Rva2VuL2NyZWF0ZWAgaXMgYWxzbyB1c2VkIHRvIGluaXRpYWxpemUgb3RoZXIgTGluayBmbG93cywgc3VjaCBhcyB0aGUgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgZm9yIHRva2VucyB3aXRoIGV4cGlyZWQgY3JlZGVudGlhbHMsIG9yIHRoZSBJZGVudGl0eSBWZXJpZmljYXRpb24gZmxvdy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgTGluayBUb2tlblxuICAgICAqIEBwYXJhbSB7TGlua1Rva2VuQ3JlYXRlUmVxdWVzdH0gbGlua1Rva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIGxpbmtUb2tlbkNyZWF0ZShsaW5rVG9rZW5DcmVhdGVSZXF1ZXN0OiBMaW5rVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikubGlua1Rva2VuQ3JlYXRlKGxpbmtUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL2xpbmsvdG9rZW4vZ2V0YCBlbmRwb2ludCBnZXRzIGluZm9ybWF0aW9uIGFib3V0IGEgTGluayBzZXNzaW9uLCBpbmNsdWRpbmcgYWxsIGNhbGxiYWNrcyBmaXJlZCBkdXJpbmcgdGhlIHNlc3Npb24gYWxvbmcgd2l0aCB0aGVpciBtZXRhZGF0YSwgaW5jbHVkaW5nIHRoZSBwdWJsaWMgdG9rZW4uIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB3aXRoIExpbmsgZmxvd3MgdGhhdCBkb25cXCd0IHByb3ZpZGUgYSBwdWJsaWMgdG9rZW4gdmlhIGZyb250ZW5kIGNhbGxiYWNrcywgc3VjaCBhcyB0aGUgW0hvc3RlZCBMaW5rIGZsb3ddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay9ob3N0ZWQtbGluay8pIGFuZCB0aGUgW011bHRpLUl0ZW0gTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvbXVsdGktaXRlbS1saW5rLykuIEl0IGFsc28gY2FuIGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBMaW5rIFRva2VuXG4gICAgICogQHBhcmFtIHtMaW5rVG9rZW5HZXRSZXF1ZXN0fSBsaW5rVG9rZW5HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbGlua1Rva2VuR2V0KGxpbmtUb2tlbkdldFJlcXVlc3Q6IExpbmtUb2tlbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5saW5rVG9rZW5HZXQobGlua1Rva2VuR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBOZXR3b3JrIEluc2lnaHRzIGZyb20gYSBsaXN0IG9mIGBhY2Nlc3NfdG9rZW5zYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBuZXR3b3JrIGluc2lnaHRzIGZvciB0aGUgcHJvdmlkZWQgYGFjY2Vzc190b2tlbnNgXG4gICAgICogQHBhcmFtIHtOZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0fSBuZXR3b3JrSW5zaWdodHNSZXBvcnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV0d29ya0luc2lnaHRzUmVwb3J0R2V0KG5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3Q6IE5ldHdvcmtJbnNpZ2h0c1JlcG9ydEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5uZXR3b3JrSW5zaWdodHNSZXBvcnRHZXQobmV0d29ya0luc2lnaHRzUmVwb3J0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvbmV0d29yay9zdGF0dXMvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB3aGV0aGVyIFBsYWlkIGhhcyBhIG1hdGNoaW5nIHByb2ZpbGUgZm9yIHRoZSB1c2VyLiBUaGlzIGlzIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgaWYgYSB1c2VyIGlzIGVsaWdpYmxlIGZvciBhIHN0cmVhbWxpbmVkIGV4cGVyaWVuY2UsIHN1Y2ggYXMgTGF5ZXIuICBOb3RlOiBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBjaGVjayBmb3IgTGF5ZXIgZWxpZ2liaWxpdHkgaW4gdGhlIGZyb250ZW5kLiBgL25ldHdvcmsvc3RhdHVzL2dldGAgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY2hlY2tpbmcgTGF5ZXIgZWxpZ2liaWxpdHkgaWYgYSBmcm9udGVuZCBjaGVjayBpcyBub3QgcG9zc2libGUgZm9yIHlvdXIgdXNlIGNhc2UuIEZvciBpbnN0cnVjdGlvbnMgb24gcGVyZm9ybWluZyBhIGZyb250ZW5kIGVsaWdpYmlsaXR5IGNoZWNrLCBzZWUgdGhlIFtMYXllciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xheWVyLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuXG4gICAgICogQHN1bW1hcnkgQ2hlY2sgYSB1c2VyXFwncyBQbGFpZCBOZXR3b3JrIHN0YXR1c1xuICAgICAqIEBwYXJhbSB7TmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgbmV0d29ya1N0YXR1c0dldChuZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogTmV0d29ya1N0YXR1c0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5uZXR3b3JrU3RhdHVzR2V0KG5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2NyZWF0ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBjcmVhdGUgZW5kIGN1c3RvbWVycy4gVG8gY3JlYXRlIGVuZCBjdXN0b21lcnMsIGl0IHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQgb25seSwgZXZlbiB3aGVuIGNyZWF0aW5nIFNhbmRib3ggQVBJIGtleXMuIElmIGNhbGxlZCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudCwgaXQgd2lsbCByZXR1cm4gYSBzYW1wbGUgcmVzcG9uc2UsIGJ1dCBubyBjdXN0b21lciB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSBBUEkga2V5cyB3aWxsIG5vdCBiZSB2YWxpZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGVzIGEgbmV3IGVuZCBjdXN0b21lciBmb3IgYSBQbGFpZCByZXNlbGxlci5cbiAgICAgKiBAcGFyYW0ge1BhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3R9IHBhcnRuZXJDdXN0b21lckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXJ0bmVyQ3VzdG9tZXJDcmVhdGUocGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdDogUGFydG5lckN1c3RvbWVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBhcnRuZXJDdXN0b21lckNyZWF0ZShwYXJ0bmVyQ3VzdG9tZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL2VuYWJsZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byBlbmFibGUgYW4gZW5kIGN1c3RvbWVyIGluIHRoZSBmdWxsIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgRW5hYmxlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIgaW4gdGhlIFByb2R1Y3Rpb24gZW52aXJvbm1lbnQuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJFbmFibGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyRW5hYmxlKHBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckVuYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJFbmFibGUocGFydG5lckN1c3RvbWVyRW5hYmxlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9nZXRgIGVuZHBvaW50IGlzIHVzZWQgYnkgcmVzZWxsZXIgcGFydG5lcnMgdG8gcmV0cmlldmUgZGF0YSBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuXG4gICAgICogQHN1bW1hcnkgUmV0dXJucyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyR2V0KHBhcnRuZXJDdXN0b21lckdldFJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJHZXQocGFydG5lckN1c3RvbWVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGFydG5lci9jdXN0b21lci9vYXV0aF9pbnN0aXR1dGlvbnMvZ2V0YCBlbmRwb2ludCBpcyB1c2VkIGJ5IHJlc2VsbGVyIHBhcnRuZXJzIHRvIHJldHJpZXZlIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBhIHNpbmdsZSBlbmQgY3VzdG9tZXIuIFRvIGxlYXJuIGhvdyB0byBzZXQgdXAgYSB3ZWJob29rIHRvIGxpc3RlbiB0byBzdGF0dXMgdXBkYXRlIGV2ZW50cywgdmlzaXQgdGhlIFtyZXNlbGxlciBkb2N1bWVudGF0aW9uXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvcmVzZWxsZXJzLyNlbmFibGluZy1lbmQtY3VzdG9tZXJzKS5cbiAgICAgKiBAc3VtbWFyeSBSZXR1cm5zIE9BdXRoLWluc3RpdHV0aW9uIHJlZ2lzdHJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJPQXV0aEluc3RpdHV0aW9uc0dldFJlcXVlc3R9IHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBhcnRuZXJDdXN0b21lck9hdXRoSW5zdGl0dXRpb25zR2V0KHBhcnRuZXJDdXN0b21lck9BdXRoSW5zdGl0dXRpb25zR2V0UmVxdWVzdDogUGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGFydG5lckN1c3RvbWVyT2F1dGhJbnN0aXR1dGlvbnNHZXQocGFydG5lckN1c3RvbWVyT0F1dGhJbnN0aXR1dGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXJ0bmVyL2N1c3RvbWVyL3JlbW92ZWAgZW5kcG9pbnQgaXMgdXNlZCBieSByZXNlbGxlciBwYXJ0bmVycyB0byByZW1vdmUgYW4gZW5kIGN1c3RvbWVyLiBSZW1vdmluZyBhbiBlbmQgY3VzdG9tZXIgd2lsbCByZW1vdmUgaXQgZnJvbSB2aWV3IGluIHRoZSBQbGFpZCBEYXNoYm9hcmQgYW5kIGRlYWN0aXZhdGUgaXRzIEFQSSBrZXlzLiBUaGlzIGVuZHBvaW50IGNhbiBvbmx5IGJlIHVzZWQgdG8gcmVtb3ZlIGFuIGVuZCBjdXN0b21lciB0aGF0IGhhcyBub3QgeWV0IGJlZW4gZW5hYmxlZCBpbiBmdWxsIFByb2R1Y3Rpb24uXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlcyBhIFBsYWlkIHJlc2VsbGVyXFwncyBlbmQgY3VzdG9tZXIuXG4gICAgICogQHBhcmFtIHtQYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0fSBwYXJ0bmVyQ3VzdG9tZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFydG5lckN1c3RvbWVyUmVtb3ZlKHBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3Q6IFBhcnRuZXJDdXN0b21lclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXJ0bmVyQ3VzdG9tZXJSZW1vdmUocGFydG5lckN1c3RvbWVyUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvY3JlYXRlYCBlbmRwb2ludCBpcyB1c2VkIHRvIGNyZWF0ZSBhIHBheW1lbnQgY29uc2VudCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgcGF5bWVudHMgb24gYmVoYWxmIG9mIHRoZSB1c2VyLiBQYXltZW50IGNvbnNlbnRzIGFyZSBjcmVhdGVkIHdpdGggYFVOQVVUSE9SSVNFRGAgc3RhdHVzIGJ5IGRlZmF1bHQgYW5kIG11c3QgYmUgYXV0aG9yaXNlZCBieSB0aGUgdXNlciBiZWZvcmUgcGF5bWVudHMgY2FuIGJlIGluaXRpYXRlZC4gIENvbnNlbnRzIGNhbiBiZSBsaW1pdGVkIGluIHRpbWUgYW5kIHNjb3BlLCBhbmQgaGF2ZSBjb25zdHJhaW50cyB0aGF0IGRlc2NyaWJlIGxpbWl0YXRpb25zIGZvciBwYXltZW50cy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25Db25zZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL2NvbnNlbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCBjb25zZW50LCBhcyB3ZWxsIGFzIHRvIHJlY2VpdmUgYmFzaWMgaW5mb3JtYXRpb24gc3VjaCBhcyByZWNpcGllbnQgYW5kIGNvbnN0cmFpbnRzLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IGNvbnNlbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXQocGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uQ29uc2VudEdldChwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9wYXltZW50L2V4ZWN1dGVgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIGV4ZWN1dGUgcGF5bWVudHMgdXNpbmcgcGF5bWVudCBjb25zZW50LlxuICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSBzaW5nbGUgcGF5bWVudCB1c2luZyBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRQYXltZW50RXhlY3V0ZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFBheW1lbnRFeGVjdXRlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGUocGF5bWVudEluaXRpYXRpb25Db25zZW50UGF5bWVudEV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wYXltZW50X2luaXRpYXRpb24vY29uc2VudC9yZXZva2VgIGVuZHBvaW50IGNhbiBiZSB1c2VkIHRvIHJldm9rZSB0aGUgcGF5bWVudCBjb25zZW50LiBPbmNlIHRoZSBjb25zZW50IGlzIHJldm9rZWQsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBpbml0aWF0ZSBwYXltZW50cyB1c2luZyBpdC5cbiAgICAgKiBAc3VtbWFyeSBSZXZva2UgcGF5bWVudCBjb25zZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlKHBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uQ29uc2VudFJldm9rZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvbkNvbnNlbnRSZXZva2UocGF5bWVudEluaXRpYXRpb25Db25zZW50UmV2b2tlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgY3JlYXRpbmcgYSBwYXltZW50IHJlY2lwaWVudCwgeW91IGNhbiB1c2UgdGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBwYXltZW50IHRvIHRoYXQgcmVjaXBpZW50LiAgUGF5bWVudHMgY2FuIGJlIG9uZS10aW1lIG9yIHN0YW5kaW5nIG9yZGVyIChyZWN1cnJpbmcpIGFuZCBjYW4gYmUgZGVub21pbmF0ZWQgaW4gZWl0aGVyIEVVUiwgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KS4gIElmIG1ha2luZyBkb21lc3RpYyBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMsIHlvdXIgcmVjaXBpZW50IG11c3QgaGF2ZSBiZWVuIGNyZWF0ZWQgd2l0aCBCQUNTIG51bWJlcnMuIEluIGdlbmVyYWwsIEVVUi1kZW5vbWluYXRlZCBwYXltZW50cyB3aWxsIGJlIHNlbnQgdmlhIFNFUEEgQ3JlZGl0IFRyYW5zZmVyLCBHQlAtZGVub21pbmF0ZWQgcGF5bWVudHMgd2lsbCBiZSBzZW50IHZpYSB0aGUgRmFzdGVyIFBheW1lbnRzIG5ldHdvcmsgYW5kIGZvciBub24tRXVyb3pvbmUgbWFya2V0cyB0eXBpY2FsbHkgdmlhIHRoZSBsb2NhbCBwYXltZW50IHNjaGVtZSwgYnV0IHRoZSBwYXltZW50IG5ldHdvcmsgdXNlZCB3aWxsIGJlIGRldGVybWluZWQgYnkgdGhlIGluc3RpdHV0aW9uLiBQYXltZW50cyBzZW50IHZpYSBGYXN0ZXIgUGF5bWVudHMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGltbWVkaWF0ZWx5LCB3aGlsZSBwYXltZW50cyBzZW50IHZpYSBTRVBBIENyZWRpdCBUcmFuc2ZlciBvciBvdGhlciBsb2NhbCBwYXltZW50IHNjaGVtZXMgd2lsbCB0eXBpY2FsbHkgYXJyaXZlIGluIG9uZSBidXNpbmVzcyBkYXkuICBTdGFuZGluZyBvcmRlcnMgKHJlY3VycmluZyBwYXltZW50cykgbXVzdCBiZSBkZW5vbWluYXRlZCBpbiBHQlAgYW5kIGNhbiBvbmx5IGJlIHNlbnQgdG8gcmVjaXBpZW50cyBpbiB0aGUgVUsuIE9uY2UgY3JlYXRlZCwgc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgY2Fubm90IGJlIG1vZGlmaWVkIG9yIGNhbmNlbGVkIHZpYSB0aGUgQVBJLiBBbiBlbmQgdXNlciBjYW4gY2FuY2VsIG9yIG1vZGlmeSBhIHN0YW5kaW5nIG9yZGVyIGRpcmVjdGx5IG9uIHRoZWlyIGJhbmtpbmcgYXBwbGljYXRpb24gb3Igd2Vic2l0ZSwgb3IgYnkgY29udGFjdGluZyB0aGUgYmFuay4gU3RhbmRpbmcgb3JkZXJzIHdpbGwgZm9sbG93IHRoZSBwYXltZW50IHJ1bGVzIG9mIHRoZSB1bmRlcmx5aW5nIHJhaWxzIChGYXN0ZXIgUGF5bWVudHMgaW4gVUspLiBQYXltZW50cyBjYW4gYmUgc2VudCBNb25kYXkgdG8gRnJpZGF5LCBleGNsdWRpbmcgYmFuayBob2xpZGF5cy4gSWYgdGhlIHByZS1hcnJhbmdlZCBkYXRlIGZhbGxzIG9uIGEgd2Vla2VuZCBvciBiYW5rIGhvbGlkYXksIHRoZSBwYXltZW50IGlzIG1hZGUgb24gdGhlIG5leHQgd29ya2luZyBkYXkuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIGV4YWN0IHRpbWUgdGhlIHBheW1lbnQgd2lsbCByZWFjaCB0aGUgcmVjaXBpZW504oCZcyBhY2NvdW50LCBhbHRob3VnaCBhdCBsZWFzdCA5MCUgb2Ygc3RhbmRpbmcgb3JkZXIgcGF5bWVudHMgYXJlIHNlbnQgYnkgNmFtLiAgSW4gTGltaXRlZCBQcm9kdWN0aW9uLCBwYXltZW50cyBtdXN0IGJlIGJlbG93IDUgR0JQIG9yIG90aGVyIGNob3NlbiBbY3VycmVuY3ldKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3BheW1lbnQtaW5pdGlhdGlvbi8jcGF5bWVudF9pbml0aWF0aW9uLXBheW1lbnQtY3JlYXRlLXJlcXVlc3QtYW1vdW50LWN1cnJlbmN5KSwgYW5kIHN0YW5kaW5nIG9yZGVycywgdmFyaWFibGUgcmVjdXJyaW5nIHBheW1lbnRzLCBhbmQgVmlydHVhbCBBY2NvdW50cyBhcmUgbm90IHN1cHBvcnRlZC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwYXltZW50XG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25QYXltZW50Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvZ2V0YCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGVjayB0aGUgc3RhdHVzIG9mIGEgcGF5bWVudCwgYXMgd2VsbCBhcyB0byByZWNlaXZlIGJhc2ljIGluZm9ybWF0aW9uIHN1Y2ggYXMgcmVjaXBpZW50IGFuZCBwYXltZW50IGFtb3VudC4gSW4gdGhlIGNhc2Ugb2Ygc3RhbmRpbmcgb3JkZXJzLCB0aGUgYC9wYXltZW50X2luaXRpYXRpb24vcGF5bWVudC9nZXRgIGVuZHBvaW50IHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIG9mIHRoZSBvdmVyYWxsIHN0YW5kaW5nIG9yZGVyIGl0c2VsZjsgdGhlIEFQSSBjYW5ub3QgYmUgdXNlZCB0byByZXRyaWV2ZSBwYXltZW50IHN0YXR1cyBmb3IgaW5kaXZpZHVhbCBwYXltZW50cyB3aXRoaW4gYSBzdGFuZGluZyBvcmRlci5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBkZXRhaWxzXG4gICAgICogQHBhcmFtIHtQYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRHZXQocGF5bWVudEluaXRpYXRpb25QYXltZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3BheW1lbnQvbGlzdGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYWxsIGNyZWF0ZWQgcGF5bWVudHMuIEJ5IGRlZmF1bHQsIHRoZSAxMCBtb3N0IHJlY2VudCBwYXltZW50cyBhcmUgcmV0dXJuZWQuIFlvdSBjYW4gcmVxdWVzdCBtb3JlIHBheW1lbnRzIGFuZCBwYWdpbmF0ZSB0aHJvdWdoIHRoZSByZXN1bHRzIHVzaW5nIHRoZSBvcHRpb25hbCBgY291bnRgIGFuZCBgY3Vyc29yYCBwYXJhbWV0ZXJzLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgcGF5bWVudHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3QocGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudEluaXRpYXRpb25QYXltZW50TGlzdChwYXltZW50SW5pdGlhdGlvblBheW1lbnRMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV2ZXJzZSBhIHNldHRsZWQgcGF5bWVudCBmcm9tIGEgUGxhaWQgdmlydHVhbCBhY2NvdW50LiAgVGhlIG9yaWdpbmFsIHBheW1lbnQgbXVzdCBiZSBpbiBhIHNldHRsZWQgc3RhdGUgdG8gYmUgcmVmdW5kZWQuIFRvIHJlZnVuZCBwYXJ0aWFsbHksIHNwZWNpZnkgdGhlIGFtb3VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgYW1vdW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZSByZWZ1bmQgYW1vdW50IHdpbGwgYmUgZXF1YWwgdG8gYWxsIG9mIHRoZSByZW1haW5pbmcgcGF5bWVudCBhbW91bnQgdGhhdCBoYXMgbm90IGJlZW4gcmVmdW5kZWQgeWV0LiAgVGhlIHJlZnVuZCB3aWxsIGdvIGJhY2sgdG8gdGhlIHNvdXJjZSBhY2NvdW50IHRoYXQgaW5pdGlhdGVkIHRoZSBwYXltZW50LiBUaGUgb3JpZ2luYWwgcGF5bWVudCBtdXN0IGhhdmUgYmVlbiBpbml0aWF0ZWQgdG8gYSBQbGFpZCB2aXJ0dWFsIGFjY291bnQgc28gdGhhdCB0aGlzIGFjY291bnQgY2FuIGJlIHVzZWQgdG8gaW5pdGlhdGUgdGhlIHJlZnVuZC4gIFByb3ZpZGluZyBjb3VudGVycGFydHkgaW5mb3JtYXRpb24gc3VjaCBhcyBkYXRlIG9mIGJpcnRoIGFuZCBhZGRyZXNzIGluY3JlYXNlcyAgdGhlIGxpa2VsaWhvb2Qgb2YgcmVmdW5kIGJlaW5nIHN1Y2Nlc3NmdWwgd2l0aG91dCBodW1hbiBpbnRlcnZlbnRpb24uIFxuICAgICAqIEBzdW1tYXJ5IFJldmVyc2UgYW4gZXhpc3RpbmcgcGF5bWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZShwYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlUmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25QYXltZW50UmV2ZXJzZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblBheW1lbnRSZXZlcnNlKHBheW1lbnRJbml0aWF0aW9uUGF5bWVudFJldmVyc2VSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBwYXltZW50IHJlY2lwaWVudCBmb3IgcGF5bWVudCBpbml0aWF0aW9uLiAgVGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIEV1cm9wZSwgd2l0aGluIGEgY291bnRyeSB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSBTaW5nbGUgRXVybyBQYXltZW50IEFyZWEgKFNFUEEpIG9yIGEgbm9uLUV1cm96b25lIGNvdW50cnkgW3N1cHBvcnRlZF0oaHR0cHM6Ly9wbGFpZC5jb20vZ2xvYmFsKSBieSBQbGFpZC4gRm9yIGEgc3RhbmRpbmcgb3JkZXIgKHJlY3VycmluZykgcGF5bWVudCwgdGhlIHJlY2lwaWVudCBtdXN0IGJlIGluIHRoZSBVSy4gIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSBgYmFjc2AgaW4gdGhlIFVLIGFuZCBgaWJhbmAgaW4gRVUuICBUaGUgZW5kcG9pbnQgaXMgaWRlbXBvdGVudDogaWYgYSBkZXZlbG9wZXIgaGFzIGFscmVhZHkgbWFkZSBhIHJlcXVlc3Qgd2l0aCB0aGUgc2FtZSBwYXltZW50IGRldGFpbHMsIFBsYWlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGByZWNpcGllbnRfaWRgLiBcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCByZWNpcGllbnRcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50Q3JlYXRlUmVxdWVzdH0gcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGUocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRDcmVhdGVSZXF1ZXN0OiBQYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZShwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBkZXRhaWxzIGFib3V0IGEgcGF5bWVudCByZWNpcGllbnQgeW91IGhhdmUgcHJldmlvdXNseSBjcmVhdGVkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBwYXltZW50IHJlY2lwaWVudFxuICAgICAqIEBwYXJhbSB7UGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRHZXRSZXF1ZXN0fSBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudEdldFJlcXVlc3Q6IFBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0KHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcGF5bWVudF9pbml0aWF0aW9uL3JlY2lwaWVudC9saXN0YCBlbmRwb2ludCBsaXN0IHRoZSBwYXltZW50IHJlY2lwaWVudHMgdGhhdCB5b3UgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBwYXltZW50IHJlY2lwaWVudHNcbiAgICAgKiBAcGFyYW0ge1BheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3R9IHBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3QocGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdDogUGF5bWVudEluaXRpYXRpb25SZWNpcGllbnRMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnBheW1lbnRJbml0aWF0aW9uUmVjaXBpZW50TGlzdChwYXltZW50SW5pdGlhdGlvblJlY2lwaWVudExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBuZXcgcGF5bWVudCBwcm9maWxlLiBUbyBpbml0aWF0ZSB0aGUgYWNjb3VudCBsaW5raW5nIGV4cGVyaWVuY2UsIGNhbGwgYC9saW5rL3Rva2VuL2NyZWF0ZWAgYW5kIHByb3ZpZGUgdGhlIGBwYXltZW50X3Byb2ZpbGVfdG9rZW5gIGluIHRoZSBgdHJhbnNmZXIucGF5bWVudF9wcm9maWxlX3Rva2VuYCBmaWVsZC4gWW91IGNhbiB0aGVuIHVzZSB0aGUgYHBheW1lbnRfcHJvZmlsZV90b2tlbmAgd2hlbiBjcmVhdGluZyB0cmFuc2ZlcnMgdXNpbmcgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NyZWF0ZWAgYW5kIGAvdHJhbnNmZXIvY3JlYXRlYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUNyZWF0ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlQ3JlYXRlKHBheW1lbnRQcm9maWxlQ3JlYXRlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVDcmVhdGUocGF5bWVudFByb2ZpbGVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgYC9wYXltZW50X3Byb2ZpbGUvZ2V0YCBlbmRwb2ludCB0byBnZXQgdGhlIHN0YXR1cyBvZiBhIGdpdmVuIFBheW1lbnQgUHJvZmlsZS5cbiAgICAgKiBAc3VtbWFyeSBHZXQgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZUdldFJlcXVlc3R9IHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlR2V0KHBheW1lbnRQcm9maWxlR2V0UmVxdWVzdDogUGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVHZXQocGF5bWVudFByb2ZpbGVHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvcGF5bWVudF9wcm9maWxlL3JlbW92ZWAgZW5kcG9pbnQgdG8gcmVtb3ZlIGEgZ2l2ZW4gUGF5bWVudCBQcm9maWxlLiBPbmNlIGl04oCZcyByZW1vdmVkLCBpdCBjYW4gbm8gbG9uZ2VyIGJlIHVzZWQgdG8gY3JlYXRlIHRyYW5zZmVycy5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgcGF5bWVudCBwcm9maWxlXG4gICAgICogQHBhcmFtIHtQYXltZW50UHJvZmlsZVJlbW92ZVJlcXVlc3R9IHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHBheW1lbnRQcm9maWxlUmVtb3ZlKHBheW1lbnRQcm9maWxlUmVtb3ZlUmVxdWVzdDogUGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucGF5bWVudFByb2ZpbGVSZW1vdmUocGF5bWVudFByb2ZpbGVSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiAgVGhpcyBlbmRwb2ludCByZXRyaWV2ZXMgY2FjaGVkIGluZm9ybWF0aW9uLCByYXRoZXIgdGhhbiBleHRyYWN0aW5nIGZyZXNoIGluZm9ybWF0aW9uIGZyb20gdGhlIGluc3RpdHV0aW9uLiBBcyBhIHJlc3VsdCwgdGhlIGFjY291bnQgYmFsYW5jZSByZXR1cm5lZCBtYXkgbm90IGJlIHVwLXRvLWRhdGU7IGZvciByZWFsdGltZSBiYWxhbmNlIGluZm9ybWF0aW9uLCB1c2UgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGluc3RlYWQuIE5vdGUgdGhhdCBzb21lIGluZm9ybWF0aW9uIGlzIG51bGxhYmxlLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0fSBwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckFjY291bnRHZXQocHJvY2Vzc29yQWNjb3VudEdldFJlcXVlc3Q6IFByb2Nlc3NvckFjY291bnRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yQWNjb3VudEdldChwcm9jZXNzb3JBY2NvdW50R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBBcGV4IHRvIGVuYWJsZSBQbGFpZC1BcGV4IGludGVncmF0aW9ucy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgQXBleCBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGUocHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogUHJvY2Vzc29yQXBleFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckFwZXhQcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JBcGV4UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvYXV0aC9nZXRgIGVuZHBvaW50IHJldHVybnMgdGhlIGJhbmsgYWNjb3VudCBhbmQgYmFuayBpZGVudGlmaWNhdGlvbiBudW1iZXIgKHN1Y2ggYXMgdGhlIHJvdXRpbmcgbnVtYmVyLCBmb3IgVVMgYWNjb3VudHMpLCBmb3IgYSBjaGVja2luZywgc2F2aW5ncywgb3IgY2FzaCBtYW5hZ2VtZW50IGFjY291bnQgdGhhdFxcJ1xcJ3MgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYHByb2Nlc3Nvcl90b2tlbmAuIFRoZSBlbmRwb2ludCBhbHNvIHJldHVybnMgaGlnaC1sZXZlbCBhY2NvdW50IGRhdGEgYW5kIGJhbGFuY2VzIHdoZW4gYXZhaWxhYmxlLiAgVmVyc2lvbmluZyBub3RlOiBBUEkgdmVyc2lvbnMgMjAxOS0wNS0yOSBhbmQgZWFybGllciB1c2UgYSBkaWZmZXJlbnQgc2NoZW1hIGZvciB0aGUgYG51bWJlcnNgIG9iamVjdCByZXR1cm5lZCBieSB0aGlzIGVuZHBvaW50LiBGb3IgZGV0YWlscywgc2VlIFtQbGFpZCBBUEkgdmVyc2lvbmluZ10oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvdmVyc2lvbmluZy8jdmVyc2lvbi0yMDIwLTA5LTE0KS4gXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgQXV0aCBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdH0gcHJvY2Vzc29yQXV0aEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JBdXRoR2V0KHByb2Nlc3NvckF1dGhHZXRSZXF1ZXN0OiBQcm9jZXNzb3JBdXRoR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckF1dGhHZXQocHJvY2Vzc29yQXV0aEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgcmV0dXJucyB0aGUgcmVhbC10aW1lIGJhbGFuY2UgZm9yIGVhY2ggb2YgYW4gSXRlbVxcJ3MgYWNjb3VudHMuIFdoaWxlIG90aGVyIGVuZHBvaW50cyBtYXkgcmV0dXJuIGEgYmFsYW5jZSBvYmplY3QsIG9ubHkgYC9wcm9jZXNzb3IvYmFsYW5jZS9nZXRgIGZvcmNlcyB0aGUgYXZhaWxhYmxlIGFuZCBjdXJyZW50IGJhbGFuY2UgZmllbGRzIHRvIGJlIHJlZnJlc2hlZCByYXRoZXIgdGhhbiBjYWNoZWQuIFxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIEJhbGFuY2UgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3R9IHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0IFRoZSAmI3g2MDsvcHJvY2Vzc29yL2JhbGFuY2UvZ2V0JiN4NjA7IGVuZHBvaW50IHJldHVybnMgdGhlIHJlYWwtdGltZSBiYWxhbmNlIGZvciB0aGUgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiAmI3g2MDtwcm9jZXNzb3JfdG9rZW4mI3g2MDsuICBUaGUgY3VycmVudCBiYWxhbmNlIGlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnVuZHMgaW4gdGhlIGFjY291bnQuIFRoZSBhdmFpbGFibGUgYmFsYW5jZSBpcyB0aGUgY3VycmVudCBiYWxhbmNlIGxlc3MgYW55IG91dHN0YW5kaW5nIGhvbGRzIG9yIGRlYml0cyB0aGF0IGhhdmUgbm90IHlldCBwb3N0ZWQgdG8gdGhlIGFjY291bnQuICBOb3RlIHRoYXQgbm90IGFsbCBpbnN0aXR1dGlvbnMgY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgYmFsYW5jZS4gSW4gdGhlIGV2ZW50IHRoYXQgYXZhaWxhYmxlIGJhbGFuY2UgaXMgdW5hdmFpbGFibGUgZnJvbSB0aGUgaW5zdGl0dXRpb24sIFBsYWlkIHdpbGwgcmV0dXJuIGFuIGF2YWlsYWJsZSBiYWxhbmNlIHZhbHVlIG9mICYjeDYwO251bGwmI3g2MDsuXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JCYWxhbmNlR2V0KHByb2Nlc3NvckJhbGFuY2VHZXRSZXF1ZXN0OiBQcm9jZXNzb3JCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckJhbGFuY2VHZXQocHJvY2Vzc29yQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9wcm9jZXNzb3IvYmFua190cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IGJhbmsgdHJhbnNmZXIgYXMgYSBwcm9jZXNzb3JcbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBiYW5rIHRyYW5zZmVyIGFzIGEgcHJvY2Vzc29yXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlKHByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvckJhbmtUcmFuc2ZlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JCYW5rVHJhbnNmZXJDcmVhdGUocHJvY2Vzc29yQmFua1RyYW5zZmVyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2lkZW50aXR5L2dldGAgZW5kcG9pbnQgYWxsb3dzIHlvdSB0byByZXRyaWV2ZSB2YXJpb3VzIGFjY291bnQgaG9sZGVyIGluZm9ybWF0aW9uIG9uIGZpbGUgd2l0aCB0aGUgZmluYW5jaWFsIGluc3RpdHV0aW9uLCBpbmNsdWRpbmcgbmFtZXMsIGVtYWlscywgcGhvbmUgbnVtYmVycywgYW5kIGFkZHJlc3Nlcy5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJZGVudGl0eSBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJZGVudGl0eUdldFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvcklkZW50aXR5R2V0KHByb2Nlc3NvcklkZW50aXR5R2V0UmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29ySWRlbnRpdHlHZXQocHJvY2Vzc29ySWRlbnRpdHlHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9jZXNzb3IvaWRlbnRpdHkvbWF0Y2hgIGVuZHBvaW50IGdlbmVyYXRlcyBhIG1hdGNoIHNjb3JlLCB3aGljaCBpbmRpY2F0ZXMgaG93IHdlbGwgdGhlIHByb3ZpZGVkIGlkZW50aXR5IGRhdGEgbWF0Y2hlcyB0aGUgaWRlbnRpdHkgaW5mb3JtYXRpb24gb24gZmlsZSB3aXRoIHRoZSBhY2NvdW50IGhvbGRlclxcJ3MgZmluYW5jaWFsIGluc3RpdHV0aW9uLiAgRmllbGRzIHdpdGhpbiB0aGUgYGJhbGFuY2VzYCBvYmplY3Qgd2lsbCBhbHdheXMgYmUgbnVsbCB3aGVuIHJldHJpZXZlZCBieSBgL2lkZW50aXR5L21hdGNoYC4gSW5zdGVhZCwgdXNlIHRoZSBmcmVlIGAvYWNjb3VudHMvZ2V0YCBlbmRwb2ludCB0byByZXF1ZXN0IGJhbGFuY2UgY2FjaGVkIGRhdGEsIG9yIGAvYWNjb3VudHMvYmFsYW5jZS9nZXRgIGZvciByZWFsLXRpbWUgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBpZGVudGl0eSBtYXRjaCBzY29yZVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3R9IHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29ySWRlbnRpdHlNYXRjaChwcm9jZXNzb3JJZGVudGl0eU1hdGNoUmVxdWVzdDogUHJvY2Vzc29ySWRlbnRpdHlNYXRjaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JJZGVudGl0eU1hdGNoKHByb2Nlc3NvcklkZW50aXR5TWF0Y2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IHJldHVybnMgdGhlIHN0b2NrIHBvc2l0aW9uIGRhdGEgb2YgdGhlIGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gcHJvY2Vzc29yIHRva2VuLiBcbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBJbnZlc3RtZW50IEhvbGRpbmdzXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdH0gcHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0KHByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXRSZXF1ZXN0OiBQcm9jZXNzb3JJbnZlc3RtZW50c0hvbGRpbmdzR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckludmVzdG1lbnRzSG9sZGluZ3NHZXQocHJvY2Vzc29ySW52ZXN0bWVudHNIb2xkaW5nc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZXRyaWV2ZSB1cCB0byAyNCBtb250aHMgb2YgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIHRoZSBpbnZlc3RtZW50IGFjY291bnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9jZXNzb3IgdG9rZW4uICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgRHVlIHRvIHRoZSBwb3RlbnRpYWxseSBsYXJnZSBudW1iZXIgb2YgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50LCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGNvdW50IGFuZCBvZmZzZXQgcGFyYW1ldGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBgdG90YWxfaW52ZXN0bWVudF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSBpbnZlc3RtZW50IHRyYW5zYWN0aW9ucy4gIE5vdGUgdGhhdCBJbnZlc3RtZW50cyBkb2VzIG5vdCBoYXZlIGEgd2ViaG9vayB0byBpbmRpY2F0ZSB3aGVuIGluaXRpYWwgdHJhbnNhY3Rpb24gZGF0YSBoYXMgbG9hZGVkICh1bmxlc3MgeW91IHVzZSB0aGUgYGFzeW5jX3VwZGF0ZWAgb3B0aW9uKS4gSW5zdGVhZCwgaWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHJlYWR5IHdoZW4gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaXMgZmlyc3QgY2FsbGVkLCBQbGFpZCB3aWxsIHdhaXQgZm9yIHRoZSBkYXRhLiBGb3IgdGhpcyByZWFzb24sIGNhbGxpbmcgYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW1tZWRpYXRlbHkgYWZ0ZXIgTGluayBtYXkgdGFrZSB1cCB0byBvbmUgdG8gdHdvIG1pbnV0ZXMgdG8gcmV0dXJuLiAgRGF0YSByZXR1cm5lZCBieSB0aGUgYXN5bmNocm9ub3VzIGludmVzdG1lbnRzIGV4dHJhY3Rpb24gZmxvdyAod2hlbiBgYXN5bmNfdXBkYXRlYCBpcyBzZXQgdG8gdHJ1ZSkgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSBhdmFpbGFibGUgdG8gYC9wcm9jZXNzb3IvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0aGUgZGF0YSBpcyByZWFkeSB0byBiZSBmZXRjaGVkLCBsaXN0ZW4gZm9yIHRoZSBgSElTVE9SSUNBTF9VUERBVEVgIHdlYmhvb2suIElmIG5vIGludmVzdG1lbnRzIGhpc3RvcnkgaXMgcmVhZHkgd2hlbiBgL3Byb2Nlc3Nvci9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci4gIFRvIHJlY2VpdmUgSW52ZXN0bWVudHMgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW52ZXN0bWVudCB0cmFuc2FjdGlvbnMgZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29ySW52ZXN0bWVudHNUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldChwcm9jZXNzb3JJbnZlc3RtZW50c1RyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvckludmVzdG1lbnRzVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAgZW5kcG9pbnQgcmV0dXJucyB2YXJpb3VzIGRldGFpbHMgYWJvdXQgYSBsb2FuIG9yIGNyZWRpdCBhY2NvdW50LiBMaWFiaWxpdGllcyBkYXRhIGlzIGF2YWlsYWJsZSBwcmltYXJpbHkgZm9yIFVTIGZpbmFuY2lhbCBpbnN0aXR1dGlvbnMsIHdpdGggc29tZSBsaW1pdGVkIGNvdmVyYWdlIG9mIENhbmFkaWFuIGluc3RpdHV0aW9ucy4gQ3VycmVudGx5IHN1cHBvcnRlZCBhY2NvdW50IHR5cGVzIGFyZSBhY2NvdW50IHR5cGUgYGNyZWRpdGAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYGNyZWRpdCBjYXJkYCBvciBgcGF5cGFsYCwgYW5kIGFjY291bnQgdHlwZSBgbG9hbmAgd2l0aCBhY2NvdW50IHN1YnR5cGUgYHN0dWRlbnRgIG9yIGBtb3J0Z2FnZWAuICBUaGUgdHlwZXMgb2YgaW5mb3JtYXRpb24gcmV0dXJuZWQgYnkgTGlhYmlsaXRpZXMgY2FuIGluY2x1ZGUgYmFsYW5jZXMgYW5kIGR1ZSBkYXRlcywgbG9hbiB0ZXJtcywgYW5kIGFjY291bnQgZGV0YWlscyBzdWNoIGFzIG9yaWdpbmFsIGxvYW4gYW1vdW50IGFuZCBndWFyYW50b3IuIERhdGEgaXMgcmVmcmVzaGVkIGFwcHJveGltYXRlbHkgb25jZSBwZXIgZGF5OyB0aGUgbGF0ZXN0IGRhdGEgY2FuIGJlIHJldHJpZXZlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL2xpYWJpbGl0aWVzL2dldGAuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIGBsaWFiaWxpdGllc2Agd2FzIG5vdCBzcGVjaWZpZWQgYXMgYW4gaW5pdGlhbCBwcm9kdWN0IHdoZW4gY3JlYXRpbmcgdGhlIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gdG8gcmV0cmlldmUgdGhlIGFkZGl0aW9uYWwgZGF0YS5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBMaWFiaWxpdGllcyBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JMaWFiaWxpdGllc0dldFJlcXVlc3R9IHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0KHByb2Nlc3NvckxpYWJpbGl0aWVzR2V0UmVxdWVzdDogUHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yTGlhYmlsaXRpZXNHZXQocHJvY2Vzc29yTGlhYmlsaXRpZXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBBZnRlciBjYWxsaW5nIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL2RlY2lzaW9uL3JlcG9ydGAgdG8gcmVwb3J0IHdoZXRoZXIgdGhlIHRyYW5zYWN0aW9uIHdhcyBpbml0aWF0ZWQuICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBbUGxhaWQgVHJhbnNmZXIgcHJvZHVjdF0oaHR0cHM6Ly93d3cucGxhaWQuY29tL2RvY3MvdHJhbnNmZXIpIHRvIGNyZWF0ZSB0cmFuc2ZlcnMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgZW5kcG9pbnQsIGFzIFBsYWlkIGFscmVhZHkga25vd3Mgd2hldGhlciB0aGUgdHJhbnNmZXIgd2FzIGluaXRpYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydChwcm9jZXNzb3JTaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0KHByb2Nlc3NvclNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgdG8gZXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbiBhcyBhIHByb2Nlc3NvciB0byBnZXQgYSByZXR1cm4gcmlzayBhc3Nlc3NtZW50IChzdWNoIGFzIGEgcmlzayBzY29yZSBhbmQgcmlzayB0aWVyKSBhbmQgYWRkaXRpb25hbCByaXNrIHNpZ25hbHMuICBJbiBvcmRlciB0byBvYnRhaW4gYSB2YWxpZCBzY29yZSBmb3IgYW4gQUNIIHRyYW5zYWN0aW9uLCBQbGFpZCBtdXN0IGhhdmUgYW4gYWNjZXNzIHRva2VuIGZvciB0aGUgYWNjb3VudCwgYW5kIHRoZSBJdGVtIG11c3QgYmUgaGVhbHRoeSAocmVjZWl2aW5nIHByb2R1Y3QgdXBkYXRlcykgb3IgaGF2ZSByZWNlbnRseSBiZWVuIGluIGEgaGVhbHRoeSBzdGF0ZS4gSWYgdGhlIHRyYW5zYWN0aW9uIGRvZXMgbm90IG1lZXQgZWxpZ2liaWxpdHkgcmVxdWlyZW1lbnRzLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgY2F1c2UuIElmIGAvcHJvY2Vzc29yL3NpZ25hbC9ldmFsdWF0ZWAgaXMgY2FsbGVkIG9uIHRoZSBzYW1lIHRyYW5zYWN0aW9uIG11bHRpcGxlIHRpbWVzIHdpdGhpbiBhIDI0LWhvdXIgcGVyaW9kLCBjYWNoZWQgcmVzdWx0cyBtYXkgYmUgcmV0dXJuZWQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSByZWZlciB0byBvdXIgZXJyb3IgZG9jdW1lbnRhdGlvbiBvbiBbaXRlbSBlcnJvcnNdKC9kb2NzL2Vycm9ycy9pdGVtLykgYW5kIFtMaW5rIGluIFVwZGF0ZSBNb2RlXSgvZG9jcy9saW5rL3VwZGF0ZS1tb2RlLykuICBOb3RlOiBUaGlzIHJlcXVlc3QgbWF5IHRha2Ugc29tZSB0aW1lIHRvIGNvbXBsZXRlIGlmIFNpZ25hbCBpcyBiZWluZyBhZGRlZCB0byBhbiBleGlzdGluZyBJdGVtLiBUaGlzIGlzIGJlY2F1c2UgUGxhaWQgbXVzdCBjb21tdW5pY2F0ZSBkaXJlY3RseSB3aXRoIHRoZSBpbnN0aXR1dGlvbiB3aGVuIHJldHJpZXZpbmcgdGhlIGRhdGEgZm9yIHRoZSBmaXJzdCB0aW1lLiBUbyByZWR1Y2UgdGhpcyBsYXRlbmN5LCB5b3UgY2FuIGNhbGwgYC9zaWduYWwvcHJlcGFyZWAgb24gdGhlIEl0ZW0gYmVmb3JlIHlvdSBuZWVkIHRvIHJlcXVlc3QgU2lnbmFsIGRhdGEuXG4gICAgICogQHN1bW1hcnkgRXZhbHVhdGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yU2lnbmFsRXZhbHVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZShwcm9jZXNzb3JTaWduYWxFdmFsdWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbEV2YWx1YXRlKHByb2Nlc3NvclNpZ25hbEV2YWx1YXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV2hlbiBhIHByb2Nlc3NvciB0b2tlbiBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIGNhbGwgYC9wcm9jZXNzb3Ivc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IHByb2Nlc3NvciB0b2tlbiB0byB0aGUgU2lnbmFsIGRhdGEgY29sbGVjdGlvbiBwcm9jZXNzLCB3aGljaCB3aWxsIGltcHJvdmUgdGhlIGFjY3VyYWN5IG9mIHRoZSBTaWduYWwgc2NvcmUuICBJZiB0aGlzIGVuZHBvaW50IGlzIGNhbGxlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgaXQgd2lsbCByZXR1cm4gYSAyMDAgcmVzcG9uc2UgYW5kIHdpbGwgbm90IG1vZGlmeSB0aGUgcHJvY2Vzc29yIHRva2VuLlxuICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhIHByb2Nlc3NvciB0b2tlbiB0byBTaWduYWxcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0fSBwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclNpZ25hbFByZXBhcmUocHJvY2Vzc29yU2lnbmFsUHJlcGFyZVJlcXVlc3Q6IFByb2Nlc3NvclNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU2lnbmFsUHJlcGFyZShwcm9jZXNzb3JTaWduYWxQcmVwYXJlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FsbCB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL3JldHVybi9yZXBvcnRgIGVuZHBvaW50IHRvIHJlcG9ydCBhIHJldHVybmVkIHRyYW5zYWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgc2VudCB0byB0aGUgYC9wcm9jZXNzb3Ivc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIFtQbGFpZCBUcmFuc2ZlciBwcm9kdWN0XShodHRwczovL3d3dy5wbGFpZC5jb20vZG9jcy90cmFuc2ZlcikgdG8gY3JlYXRlIHRyYW5zZmVycywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBlbmRwb2ludCwgYXMgUGxhaWQgYWxyZWFkeSBrbm93cyB3aGV0aGVyIHRoZSB0cmFuc2ZlciB3YXMgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgUmVwb3J0IGEgcmV0dXJuIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb25cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3R9IHByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnQocHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdDogUHJvY2Vzc29yU2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclNpZ25hbFJldHVyblJlcG9ydChwcm9jZXNzb3JTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBTdHJpcGUgdG8gZW5hYmxlIFBsYWlkLVN0cmlwZSBpbnRlZ3JhdGlvbnMuIEZvciBhIGRldGFpbGVkIGd1aWRlIG9uIGludGVncmF0aW5nIFN0cmlwZSwgc2VlIFtBZGQgU3RyaXBlIHRvIHlvdXIgYXBwXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvcGFydG5lcnNoaXBzL3N0cmlwZS8pLiAgTm90ZSB0aGF0IHRoZSBTdHJpcGUgYmFuayBhY2NvdW50IHRva2VuIGlzIGEgb25lLXRpbWUgdXNlIHRva2VuLiBUbyBzdG9yZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGxhdGVyIHVzZSwgeW91IGNhbiB1c2UgYSBTdHJpcGUgY3VzdG9tZXIgb2JqZWN0IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4sIG9yIHlvdSBjYW4gdXNlIGEgU3RyaXBlIEN1c3RvbSBhY2NvdW50IGFuZCBjcmVhdGUgYW4gYXNzb2NpYXRlZCBleHRlcm5hbCBiYW5rIGFjY291bnQgZnJvbSB0aGUgdG9rZW4uIFRoaXMgYmFuayBhY2NvdW50IGluZm9ybWF0aW9uIHNob3VsZCB3b3JrIGluZGVmaW5pdGVseSwgdW5sZXNzIHRoZSB1c2VyXFwncyBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2hhbmdlcyBvciB0aGV5IHJldm9rZSBQbGFpZFxcJ3MgcGVybWlzc2lvbnMgdG8gYWNjZXNzIHRoZWlyIGFjY291bnQuIFN0cmlwZSBiYW5rIGFjY291bnQgaW5mb3JtYXRpb24gY2Fubm90IGJlIG1vZGlmaWVkIG9uY2UgdGhlIGJhbmsgYWNjb3VudCB0b2tlbiBoYXMgYmVlbiBjcmVhdGVkLiBJZiB5b3UgZXZlciBuZWVkIHRvIGNoYW5nZSB0aGUgYmFuayBhY2NvdW50IGRldGFpbHMgdXNlZCBieSBTdHJpcGUgZm9yIGEgc3BlY2lmaWMgY3VzdG9tZXIsIGhhdmUgdGhlIHVzZXIgZ28gdGhyb3VnaCBMaW5rIGFnYWluIGFuZCBjcmVhdGUgYSBuZXcgYmFuayBhY2NvdW50IHRva2VuIGZyb20gdGhlIG5ldyBgYWNjZXNzX3Rva2VuYC4gIFRvIHJldm9rZSBhIGJhbmsgYWNjb3VudCB0b2tlbiwgdGhlIGVudGlyZSB1bmRlcmx5aW5nIGFjY2VzcyB0b2tlbiBtdXN0IGJlIHJldm9rZWQgdXNpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIFN0cmlwZSBiYW5rIGFjY291bnQgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGUocHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclN0cmlwZUJhbmtBY2NvdW50VG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yU3RyaXBlQmFua0FjY291bnRUb2tlbkNyZWF0ZShwcm9jZXNzb3JTdHJpcGVCYW5rQWNjb3VudFRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjcmVhdGUgYSB0b2tlbiBzdWl0YWJsZSBmb3Igc2VuZGluZyB0byBvbmUgb2YgUGxhaWRcXCdzIHBhcnRuZXJzIHRvIGVuYWJsZSBpbnRlZ3JhdGlvbnMuIE5vdGUgdGhhdCBTdHJpcGUgcGFydG5lcnNoaXBzIHVzZSBiYW5rIGFjY291bnQgdG9rZW5zIGluc3RlYWQ7IHNlZSBgL3Byb2Nlc3Nvci9zdHJpcGUvYmFua19hY2NvdW50X3Rva2VuL2NyZWF0ZWAgZm9yIGNyZWF0aW5nIHRva2VucyBmb3IgdXNlIHdpdGggU3RyaXBlIGludGVncmF0aW9ucy4gSWYgdXNpbmcgbXVsdGlwbGUgcHJvY2Vzc29ycywgbXVsdGlwbGUgZGlmZmVyZW50IHByb2Nlc3NvciB0b2tlbnMgY2FuIGJlIGNyZWF0ZWQgZm9yIGEgc2luZ2xlIGFjY2VzcyB0b2tlbi4gT25jZSBjcmVhdGVkLCBhIHByb2Nlc3NvciB0b2tlbiBmb3IgYSBnaXZlbiBJdGVtIGNhbm5vdCBiZSBtb2RpZmllZCBvciB1cGRhdGVkLiBUbyByZXZva2UgdGhlIHByb2Nlc3NvclxcJ3MgYWNjZXNzLCB0aGUgZW50aXJlIEl0ZW0gbXVzdCBiZSBkZWxldGVkIGJ5IGNhbGxpbmcgYC9pdGVtL3JlbW92ZWAuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlbkNyZWF0ZShwcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuQ3JlYXRlKHByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBnZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnMuIFRoZSBgcHJvZHVjdHNgIGZpZWxkIHdpbGwgYmUgYW4gZW1wdHkgbGlzdCBpZiB0aGUgcHJvY2Vzc29yIGNhbiBhY2Nlc3MgYWxsIGF2YWlsYWJsZSBwcm9kdWN0cy5cbiAgICAgKiBAc3VtbWFyeSBHZXQgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHByb2R1Y3QgcGVybWlzc2lvbnNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc0dldChwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlZCB0byBjb250cm9sIGEgcHJvY2Vzc29yXFwncyBhY2Nlc3MgdG8gcHJvZHVjdHMgb24gdGhlIGdpdmVuIHByb2Nlc3NvciB0b2tlbi4gQnkgZGVmYXVsdCwgYSBwcm9jZXNzb3Igd2lsbCBoYXZlIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHByb2R1Y3RzIG9uIHRoZSBjb3JyZXNwb25kaW5nIGl0ZW0uIFRvIHJlc3RyaWN0IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIHByb2R1Y3RzLCBjYWxsIHRoaXMgZW5kcG9pbnQgd2l0aCB0aGUgZGVzaXJlZCBwcm9kdWN0cy4gVG8gcmVzdG9yZSBhY2Nlc3MgdG8gYWxsIGF2YWlsYWJsZSBwcm9kdWN0cywgY2FsbCB0aGlzIGVuZHBvaW50IHdpdGggYW4gZW1wdHkgbGlzdC4gVGhpcyBlbmRwb2ludCBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIHlvdXIgbmVlZHMgYW5kIHlvdXIgcHJvY2Vzc29yXFwncyBuZWVkcyBjaGFuZ2UuXG4gICAgICogQHN1bW1hcnkgQ29udHJvbCBhIHByb2Nlc3NvclxcJ3MgYWNjZXNzIHRvIHByb2R1Y3RzXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdH0gcHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0KHByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXRSZXF1ZXN0OiBQcm9jZXNzb3JUb2tlblBlcm1pc3Npb25zU2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRva2VuUGVybWlzc2lvbnNTZXQocHJvY2Vzc29yVG9rZW5QZXJtaXNzaW9uc1NldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgYWxsb3dzIHlvdSwgdGhlIHByb2Nlc3NvciwgdG8gdXBkYXRlIHRoZSB3ZWJob29rIFVSTCBhc3NvY2lhdGVkIHdpdGggYSBwcm9jZXNzb3IgdG9rZW4uIFRoaXMgcmVxdWVzdCB0cmlnZ2VycyBhIGBXRUJIT09LX1VQREFURV9BQ0tOT1dMRURHRURgIHdlYmhvb2sgdG8gdGhlIG5ld2x5IHNwZWNpZmllZCB3ZWJob29rIFVSTC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgYSBwcm9jZXNzb3IgdG9rZW5cXCdzIHdlYmhvb2sgVVJMXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0fSBwcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlKHByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3Q6IFByb2Nlc3NvclRva2VuV2ViaG9va1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUb2tlbldlYmhvb2tVcGRhdGUocHJvY2Vzc29yVG9rZW5XZWJob29rVXBkYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIFtQZW5kaW5nIGFuZCBwb3N0ZWQgdHJhbnNhY3Rpb25zXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy90cmFuc2FjdGlvbnMtZGF0YS8jcGVuZGluZy1hbmQtcG9zdGVkLXRyYW5zYWN0aW9ucykuICBEdWUgdG8gdGhlIHBvdGVudGlhbGx5IGxhcmdlIG51bWJlciBvZiB0cmFuc2FjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2Vzc29yIHRva2VuLCByZXN1bHRzIGFyZSBwYWdpbmF0ZWQuIE1hbmlwdWxhdGUgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHBhcmFtZXRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgYHRvdGFsX3RyYW5zYWN0aW9uc2AgcmVzcG9uc2UgYm9keSBmaWVsZCB0byBmZXRjaCBhbGwgYXZhaWxhYmxlIHRyYW5zYWN0aW9ucy4gIERhdGEgcmV0dXJuZWQgYnkgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBwcm9jZXNzb3IgdG9rZW4gYXMgb2YgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMuIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyBkYXRhIG11bHRpcGxlIHRpbWVzIGEgZGF5LCBidXQgdGhlc2UgY2hlY2tzIG1heSBvY2N1ciBsZXNzIGZyZXF1ZW50bHksIHN1Y2ggYXMgb25jZSBhIGRheSwgZGVwZW5kaW5nIG9uIHRoZSBpbnN0aXR1dGlvbi4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHlvdSBjYW4gdXNlIHRoZSBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YC4gUGxhaWQgd2lsbCBiZWdpbiB0byBwcmVwYXJlIHRyYW5zYWN0aW9ucyBkYXRhIHVwb24gSXRlbSBsaW5rLCBpZiBMaW5rIHdhcyBpbml0aWFsaXplZCB3aXRoIGB0cmFuc2FjdGlvbnNgLCBvciB1cG9uIHRoZSBmaXJzdCBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBpZiBpdCB3YXNuXFwndC4gSWYgbm8gdHJhbnNhY3Rpb24gaGlzdG9yeSBpcyByZWFkeSB3aGVuIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIGlzIGNhbGxlZCwgaXQgd2lsbCByZXR1cm4gYSBgUFJPRFVDVF9OT1RfUkVBRFlgIGVycm9yLiAgVG8gcmVjZWl2ZSBUcmFuc2FjdGlvbnMgd2ViaG9va3MgZm9yIGEgcHJvY2Vzc29yIHRva2VuLCBzZXQgaXRzIHdlYmhvb2sgVVJMIHZpYSB0aGUgW2AvcHJvY2Vzc29yL3Rva2VuL3dlYmhvb2svdXBkYXRlYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvY2Vzc29yLXBhcnRuZXJzLyNwcm9jZXNzb3J0b2tlbndlYmhvb2t1cGRhdGUpIGVuZHBvaW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtQcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0fSBwcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0KHByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3Q6IFByb2Nlc3NvclRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGEgcHJvY2Vzc29yIHRva2VuIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCB3aXRoIFRyYW5zYWN0aW9ucyAoZWl0aGVyIGR1cmluZyBMaW5rLCBieSBzcGVjaWZ5aW5nIGl0IGluIGAvbGluay90b2tlbi9jcmVhdGVgOyBvciBhZnRlciBMaW5rLCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCkuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCB0byByZWNlaXZlIHRoZSBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHN0cmVhbXMgYW5kIHN1YnNjcmliZSB0byB0aGUgW2BSRUNVUlJJTkdfVFJBTlNBQ1RJT05TX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jcmVjdXJyaW5nX3RyYW5zYWN0aW9uc191cGRhdGUpIHdlYmhvb2suIFRvIGtub3cgd2hlbiBoaXN0b3JpY2FsIHRyYW5zYWN0aW9ucyBoYXZlIGJlZW4gZmV0Y2hlZCwgaWYgeW91IGFyZSB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvc3luY2AgbGlzdGVuIGZvciB0aGUgW2BTWU5DX1VQREFURVNfQVZBSUxBQkxFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNTeW5jVXBkYXRlc0F2YWlsYWJsZVdlYmhvb2staGlzdG9yaWNhbC11cGRhdGUtY29tcGxldGUpIHdlYmhvb2sgYW5kIGNoZWNrIHRoYXQgdGhlIGBoaXN0b3JpY2FsX3VwZGF0ZV9jb21wbGV0ZWAgZmllbGQgaW4gdGhlIHBheWxvYWQgaXMgYHRydWVgLiBJZiB1c2luZyBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIGVuZHBvaW50IGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlIHRvIHJldHJpZXZlIHRoZSBsYXRlc3Qgc3VtbWFyeSBvZiByZWN1cnJpbmcgc3RyZWFtcy4gTGlzdGVuIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vayB0byBiZSBub3RpZmllZCB3aGVuIG5ldyB1cGRhdGVzIGFyZSBhdmFpbGFibGUuICBUbyByZWNlaXZlIFRyYW5zYWN0aW9ucyB3ZWJob29rcyBmb3IgYSBwcm9jZXNzb3IgdG9rZW4sIHNldCBpdHMgd2ViaG9vayBVUkwgdmlhIHRoZSBbYC9wcm9jZXNzb3IvdG9rZW4vd2ViaG9vay91cGRhdGVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9jZXNzb3ItcGFydG5lcnMvI3Byb2Nlc3NvcnRva2Vud2ViaG9va3VwZGF0ZSkgZW5kcG9pbnQuXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggcmVjdXJyaW5nIHRyYW5zYWN0aW9uIHN0cmVhbXNcbiAgICAgKiBAcGFyYW0ge1Byb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXQocHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnByb2Nlc3NvclRyYW5zYWN0aW9uc1JlY3VycmluZ0dldChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgYW4gb3B0aW9uYWwgZW5kcG9pbnQgZm9yIHVzZXJzIG9mIHRoZSBUcmFuc2FjdGlvbnMgcHJvZHVjdC4gSXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhIHByb2Nlc3NvciB0b2tlbi4gVGhpcyBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0YWtlcyBwbGFjZSBpbiBhZGRpdGlvbiB0byB0aGUgcGVyaW9kaWMgZXh0cmFjdGlvbnMgdGhhdCBhdXRvbWF0aWNhbGx5IG9jY3VyIG9uZSBvciBtb3JlIHRpbWVzIHBlciBkYXkgZm9yIGFueSBUcmFuc2FjdGlvbnMtZW5hYmxlZCBwcm9jZXNzb3IgdG9rZW4uIElmIGNoYW5nZXMgdG8gdHJhbnNhY3Rpb25zIGFyZSBkaXNjb3ZlcmVkIGFmdGVyIGNhbGxpbmcgYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLCBQbGFpZCB3aWxsIGZpcmUgYSB3ZWJob29rOiBmb3IgYC90cmFuc2FjdGlvbnMvc3luY2AgdXNlcnMsIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2lsbCBiZSBmaXJlZCBpZiB0aGVyZSBhcmUgYW55IHRyYW5zYWN0aW9ucyB1cGRhdGVkLCBhZGRlZCwgb3IgcmVtb3ZlZC4gRm9yIHVzZXJzIG9mIGJvdGggYC9wcm9jZXNzb3IvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvZ2V0YCwgW2BUUkFOU0FDVElPTlNfUkVNT1ZFRGBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3JlbW92ZWQpIHdpbGwgYmUgZmlyZWQgaWYgYW55IHJlbW92ZWQgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZCwgYW5kIFtgREVGQVVMVF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2RlZmF1bHRfdXBkYXRlKSB3aWxsIGJlIGZpcmVkIGlmIGFueSBuZXcgdHJhbnNhY3Rpb25zIGFyZSBkZXRlY3RlZC4gTmV3IHRyYW5zYWN0aW9ucyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgIG9yIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYC4gTm90ZSB0aGF0IHRoZSBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludCBpcyBub3Qgc3VwcG9ydGVkIGZvciBDYXBpdGFsIE9uZSAoYGluc18xMjgwMjZgKSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBhbmQgd2lsbCByZXN1bHQgaW4gYSBgUFJPRFVDVFNfTk9UX1NVUFBPUlRFRGAgZXJyb3IgaWYgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBjb250YWlucyBvbmx5IG5vbi1kZXBvc2l0b3J5IGFjY291bnRzIGZyb20gdGhhdCBpbnN0aXR1dGlvbi4gIEFzIHRoaXMgZW5kcG9pbnQgdHJpZ2dlcnMgYSBzeW5jaHJvbm91cyByZXF1ZXN0IGZvciBmcmVzaCBkYXRhLCBsYXRlbmN5IG1heSBiZSBoaWdoZXIgdGhhbiBmb3Igb3RoZXIgUGxhaWQgZW5kcG9pbnRzICh0eXBpY2FsbHkgbGVzcyB0aGFuIDEwIHNlY29uZHMsIGJ1dCBvY2Nhc2lvbmFsbHkgdXAgdG8gMzAgc2Vjb25kcyBvciBtb3JlKTsgaWYgeW91IGVuY291bnRlciBlcnJvcnMsIHlvdSBtYXkgZmluZCBpdCBuZWNlc3NhcnkgdG8gYWRqdXN0IHlvdXIgdGltZW91dCBwZXJpb2Qgd2hlbiBtYWtpbmcgcmVxdWVzdHMuICBgL3Byb2Nlc3Nvci90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaChwcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNSZWZyZXNoKHByb2Nlc3NvclRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgVGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIGludGVncmF0aW9uIG92ZXJ2aWV3XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy8jaW50ZWdyYXRpb24tb3ZlcnZpZXcpLiBJZiB5b3UgYXJlIG1pZ3JhdGluZyBmcm9tIGFuIGV4aXN0aW5nIGludGVncmF0aW9uIHVzaW5nIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9nZXRgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgU3luYyBtaWdyYXRpb24gZ3VpZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3N5bmMtbWlncmF0aW9uLykuICBUaGlzIGVuZHBvaW50IHN1cHBvcnRzIGBjcmVkaXRgLCBgZGVwb3NpdG9yeWAsIGFuZCBzb21lIGBsb2FuYC10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YCkuIEZvciBgaW52ZXN0bWVudHNgIGFjY291bnRzLCB1c2UgYC9pbnZlc3RtZW50cy90cmFuc2FjdGlvbnMvZ2V0YCBpbnN0ZWFkLiAgV2hlbiByZXRyaWV2aW5nIHBhZ2luYXRlZCB1cGRhdGVzLCB0cmFjayBib3RoIHRoZSBgbmV4dF9jdXJzb3JgIGZyb20gdGhlIGxhdGVzdCByZXNwb25zZSBhbmQgdGhlIG9yaWdpbmFsIGN1cnNvciBmcm9tIHRoZSBmaXJzdCBjYWxsIGluIHdoaWNoIGBoYXNfbW9yZWAgd2FzIGB0cnVlYDsgaWYgYSBjYWxsIHRvIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCBmYWlscyB3aGVuIHJldHJpZXZpbmcgYSBwYWdpbmF0ZWQgdXBkYXRlIChlLmcgZHVlIHRvIHRoZSBbYFRSQU5TQUNUSU9OU19TWU5DX01VVEFUSU9OX0RVUklOR19QQUdJTkFUSU9OYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9lcnJvcnMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfc3luY19tdXRhdGlvbl9kdXJpbmdfcGFnaW5hdGlvbikgZXJyb3IpLCB0aGUgZW50aXJlIHBhZ2luYXRpb24gcmVxdWVzdCBsb29wIG11c3QgYmUgcmVzdGFydGVkIGJlZ2lubmluZyB3aXRoIHRoZSBjdXJzb3IgZm9yIHRoZSBmaXJzdCBwYWdlIG9mIHRoZSB1cGRhdGUsIHJhdGhlciB0aGFuIHJldHJ5aW5nIG9ubHkgdGhlIHNpbmdsZSByZXF1ZXN0IHRoYXQgZmFpbGVkLiAgSWYgdHJhbnNhY3Rpb25zIGRhdGEgaXMgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBJdGVtLCB3aGljaCBjYW4gaGFwcGVuIGlmIHRoZSBJdGVtIHdhcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCB0cmFuc2FjdGlvbnMgZHVyaW5nIHRoZSBgL2xpbmsvdG9rZW4vY3JlYXRlYCBjYWxsIG9yIGlmIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9zeW5jYCB3aWxsIHJldHVybiBlbXB0eSB0cmFuc2FjdGlvbnMgYXJyYXlzLiAgIFBsYWlkIHR5cGljYWxseSBjaGVja3MgZm9yIG5ldyB0cmFuc2FjdGlvbnMgZGF0YSBiZXR3ZWVuIG9uZSBhbmQgZm91ciB0aW1lcyBwZXIgZGF5LCBkZXBlbmRpbmcgb24gdGhlIGluc3RpdHV0aW9uLiBUbyBmaW5kIG91dCB3aGVuIHRyYW5zYWN0aW9ucyB3ZXJlIGxhc3QgdXBkYXRlZCBmb3IgYW4gSXRlbSwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB1c2UgdGhlIGAvcHJvY2Vzc29yL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCBlbmRwb2ludC4gIFRvIGJlIGFsZXJ0ZWQgd2hlbiBuZXcgdHJhbnNhY3Rpb25zIGFyZSBhdmFpbGFibGUsIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jc3luY191cGRhdGVzX2F2YWlsYWJsZSkgd2ViaG9vay4gIFRvIHJlY2VpdmUgVHJhbnNhY3Rpb25zIHdlYmhvb2tzIGZvciBhIHByb2Nlc3NvciB0b2tlbiwgc2V0IGl0cyB3ZWJob29rIFVSTCB2aWEgdGhlIFtgL3Byb2Nlc3Nvci90b2tlbi93ZWJob29rL3VwZGF0ZWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2Nlc3Nvci1wYXJ0bmVycy8jcHJvY2Vzc29ydG9rZW53ZWJob29rdXBkYXRlKSBlbmRwb2ludC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgaW5jcmVtZW50YWwgdHJhbnNhY3Rpb24gdXBkYXRlcyBvbiBhIHByb2Nlc3NvciB0b2tlblxuICAgICAqIEBwYXJhbSB7UHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luYyhwcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogUHJvY2Vzc29yVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5wcm9jZXNzb3JUcmFuc2FjdGlvbnNTeW5jKHByb2Nlc3NvclRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9wcm9maWxlL25ldHdvcmtfc3RhdHVzL2dldGAgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBQbGFpZCBoYXMgYSBtYXRjaGluZyBwcm9maWxlIGZvciB0aGUgdXNlci5cbiAgICAgKiBAc3VtbWFyeSBDaGVjayBhIHVzZXJcXCdzIFBsYWlkIE5ldHdvcmsgc3RhdHVzXG4gICAgICogQHBhcmFtIHtQcm9maWxlTmV0d29ya1N0YXR1c0dldFJlcXVlc3R9IHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0KHByb2ZpbGVOZXR3b3JrU3RhdHVzR2V0UmVxdWVzdDogUHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikucHJvZmlsZU5ldHdvcmtTdGF0dXNHZXQocHJvZmlsZU5ldHdvcmtTdGF0dXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBiYW5rIGluY29tZSB3ZWJob29rIGluIHNhbmRib3hcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hCYW5rSW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94QmFua0luY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvYmFua190cmFuc2Zlci9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBCYW5rIFRyYW5zZmVycyB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYSBCYW5rIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEJhbmtUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hCYW5rVHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94QmFua1RyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9iYW5rX3RyYW5zZmVyL3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBOb3RlIHRoYXQgd2hpbGUgYW4gZXZlbnQgd2lsbCBiZSBzaW11bGF0ZWQgYW5kIHdpbGwgYXBwZWFyIHdoZW4gdXNpbmcgZW5kcG9pbnRzIHN1Y2ggYXMgYC9iYW5rX3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvYmFua190cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIGJhbmsgdHJhbnNmZXIgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZShzYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94QmFua1RyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEJhbmtUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hCYW5rVHJhbnNmZXJTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2NyYS9jYXNoZmxvd191cGRhdGVzL3VwZGF0ZWAgZW5kcG9pbnQgdG8gbWFudWFsbHkgdHJpZ2dlciBhbiB1cGRhdGUgZm9yIGNhc2hmbG93IHVwZGF0ZXMgKE1vbml0b3JpbmcpIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgYW4gdXBkYXRlIGZvciBDYXNoZmxvdyBVcGRhdGVzXG4gICAgICogQHBhcmFtIHtTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdH0gc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlKHNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGVSZXF1ZXN0OiBTYW5kYm94Q3JhQ2FzaGZsb3dVcGRhdGVzVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hDcmFDYXNoZmxvd1VwZGF0ZXNVcGRhdGUoc2FuZGJveENyYUNhc2hmbG93VXBkYXRlc1VwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L2luY29tZS9maXJlX3dlYmhvb2tgIGVuZHBvaW50IHRvIG1hbnVhbGx5IHRyaWdnZXIgYSBQYXlyb2xsIG9yIERvY3VtZW50IEluY29tZSB3ZWJob29rIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IE1hbnVhbGx5IGZpcmUgYW4gSW5jb21lIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3R9IHNhbmRib3hJbmNvbWVGaXJlV2ViaG9va1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SW5jb21lRmlyZVdlYmhvb2soc2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdDogU2FuZGJveEluY29tZUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJbmNvbWVGaXJlV2ViaG9vayhzYW5kYm94SW5jb21lRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zYW5kYm94L2l0ZW0vZmlyZV93ZWJob29rYCBlbmRwb2ludCBpcyB1c2VkIHRvIHRlc3QgdGhhdCBjb2RlIGNvcnJlY3RseSBoYW5kbGVzIHdlYmhvb2tzLiBUaGlzIGVuZHBvaW50IGNhbiB0cmlnZ2VyIHRoZSBmb2xsb3dpbmcgd2ViaG9va3M6ICBgREVGQVVMVF9VUERBVEVgOiBXZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbSBzaW11bGF0aW5nIGEgZGVmYXVsdCB1cGRhdGUgZXZlbnQgZm9yIHRoZSByZXNwZWN0aXZlIHByb2R1Y3QgYXMgc3BlY2lmaWVkIHdpdGggdGhlIGB3ZWJob29rX3R5cGVgIGluIHRoZSByZXF1ZXN0IGJvZHkuIFZhbGlkIFNhbmRib3ggYERFRkFVTFRfVVBEQVRFYCB3ZWJob29rIHR5cGVzIGluY2x1ZGU6IGBBVVRIYCwgYElERU5USVRZYCwgYFRSQU5TQUNUSU9OU2AsIGBJTlZFU1RNRU5UU19UUkFOU0FDVElPTlNgLCBgTElBQklMSVRJRVNgLCBgSE9MRElOR1NgLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm9kdWN0LCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYE5FV19BQ0NPVU5UU19BVkFJTEFCTEVgOiBGaXJlZCB0byBpbmRpY2F0ZSB0aGF0IGEgbmV3IGFjY291bnQgaXMgYXZhaWxhYmxlIG9uIHRoZSBJdGVtIGFuZCB5b3UgY2FuIGxhdW5jaCB1cGRhdGUgbW9kZSB0byByZXF1ZXN0IGFjY2VzcyB0byBpdC4gIGBTTVNfTUlDUk9ERVBPU0lUU19WRVJJRklDQVRJT05gOiBGaXJlZCB3aGVuIGEgZ2l2ZW4gc2FtZSBkYXkgbWljcm8tZGVwb3NpdCBpdGVtIGlzIHZlcmlmaWVkIHZpYSBTTVMgdmVyaWZpY2F0aW9uLiAgYExPR0lOX1JFUEFJUkVEYDogRmlyZWQgd2hlbiBhbiBJdGVtIHJlY292ZXJzIGZyb20gdGhlIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCB3aXRob3V0IHRoZSB1c2VyIGdvaW5nIHRocm91Z2ggdXBkYXRlIG1vZGUgaW4geW91ciBhcHAuICBgUEVORElOR19ESVNDT05ORUNUYDogRmlyZWQgd2hlbiBhbiBJdGVtIHdpbGwgc3RvcCB3b3JraW5nIGluIHRoZSBuZWFyIGZ1dHVyZSAoZS5nLiBkdWUgdG8gYSBwbGFubmVkIGJhbmsgbWlncmF0aW9uKSBhbmQgbXVzdCBiZSBzZW50IHRocm91Z2ggdXBkYXRlIG1vZGUgdG8gY29udGludWUgd29ya2luZy4gICBgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgOiBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zIHdlYmhvb2sgdG8gYmUgZmlyZWQgZm9yIGEgZ2l2ZW4gU2FuZGJveCBJdGVtLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IFJlY3VycmluZyBUcmFuc2FjdGlvbnMsIGEgYFNBTkRCT1hfUFJPRFVDVF9OT1RfRU5BQkxFRGAgZXJyb3Igd2lsbCByZXN1bHQuICBgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWA6IFRyYW5zYWN0aW9ucyB3ZWJob29rIHRvIGJlIGZpcmVkIGZvciBhIGdpdmVuIFNhbmRib3ggSXRlbS4gIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgVHJhbnNhY3Rpb25zLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYFBST0RVQ1RfUkVBRFlgOiBBc3NldHMgd2ViaG9vayB0byBiZSBmaXJlZCB3aGVuIGEgZ2l2ZW4gYXNzZXQgcmVwb3J0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBnZW5lcmF0ZWQuIElmIHRoZSBJdGVtIGRvZXMgbm90IHN1cHBvcnQgQXNzZXRzLCBhIGBTQU5EQk9YX1BST0RVQ1RfTk9UX0VOQUJMRURgIGVycm9yIHdpbGwgcmVzdWx0LiAgYEVSUk9SYDogQXNzZXRzIHdlYmhvb2sgdG8gYmUgZmlyZWQgd2hlbiBhc3NldCByZXBvcnQgZ2VuZXJhdGlvbiBoYXMgZmFpbGVkLiBJZiB0aGUgSXRlbSBkb2VzIG5vdCBzdXBwb3J0IEFzc2V0cywgYSBgU0FOREJPWF9QUk9EVUNUX05PVF9FTkFCTEVEYCBlcnJvciB3aWxsIHJlc3VsdC4gIGBVU0VSX1BFUk1JU1NJT05fUkVWT0tFRGA6IEluZGljYXRlcyBhbiBlbmQgdXNlciBoYXMgcmV2b2tlZCB0aGUgcGVybWlzc2lvbiB0aGF0IHRoZXkgcHJldmlvdXNseSBncmFudGVkIHRvIGFjY2VzcyBhbiBJdGVtLiBNYXkgbm90IGFsd2F5cyBmaXJlIHVwb24gcmV2b2NhdGlvbiwgYXMgc29tZSBpbnN0aXR1dGlvbnPigJkgY29uc2VudCBwb3J0YWxzIGRvIG5vdCB0cmlnZ2VyIHRoaXMgd2ViaG9vay4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBgVVNFUl9BQ0NPVU5UX1JFVk9LRURgOiBGaXJlZCB3aGVuIGFuIGVuZCB1c2VyIGhhcyByZXZva2VkIGFjY2VzcyB0byB0aGVpciBhY2NvdW50IG9uIHRoZSBEYXRhIFByb3ZpZGVyXFwncyBwb3J0YWwuIFRoaXMgd2ViaG9vayBpcyBjdXJyZW50bHkgc2VudCBvbmx5IGZvciBDaGFzZSBhbmQgUE5DIEl0ZW1zLCBidXQgbWF5IGJlIHNlbnQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgZmluYW5jaWFsIGluc3RpdHV0aW9ucy4gVXBvbiByZWNlaXZpbmcgdGhpcyB3ZWJob29rLCBpdCBpcyByZWNvbW1lbmRlZCB0byBkZWxldGUgYW55IHN0b3JlZCBkYXRhIGZyb20gUGxhaWQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2NvdW50IG9yIEl0ZW0uICBOb3RlIHRoYXQgdGhpcyBlbmRwb2ludCBpcyBwcm92aWRlZCBmb3IgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHRlc3Rpbmcgd2ViaG9va3M7IHdlYmhvb2tzIHdpbGwgYWxzbyBmaXJlIGluIFNhbmRib3ggdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB0aGF0IHRoZXkgd291bGQgaW4gUHJvZHVjdGlvbiAoZXhjZXB0IGZvciB3ZWJob29rcyBvZiB0eXBlIGBUUkFOU0ZFUmApLlxuICAgICAqIEBzdW1tYXJ5IEZpcmUgYSB0ZXN0IHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0fSBzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hJdGVtRmlyZVdlYmhvb2soc2FuZGJveEl0ZW1GaXJlV2ViaG9va1JlcXVlc3Q6IFNhbmRib3hJdGVtRmlyZVdlYmhvb2tSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveEl0ZW1GaXJlV2ViaG9vayhzYW5kYm94SXRlbUZpcmVXZWJob29rUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zYW5kYm94L2l0ZW0vcmVzZXRfbG9naW4vYCBmb3JjZXMgYW4gSXRlbSBpbnRvIGFuIGBJVEVNX0xPR0lOX1JFUVVJUkVEYCBzdGF0ZSBpbiBvcmRlciB0byBzaW11bGF0ZSBhbiBJdGVtIHdob3NlIGxvZ2luIGlzIG5vIGxvbmdlciB2YWxpZC4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRlc3QgTGlua1xcJ3MgW3VwZGF0ZSBtb2RlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2xpbmsvdXBkYXRlLW1vZGUpIGZsb3cgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBZnRlciBjYWxsaW5nIGAvc2FuZGJveC9pdGVtL3Jlc2V0X2xvZ2luYCwgWW91IGNhbiB0aGVuIHVzZSBQbGFpZCBMaW5rIHVwZGF0ZSBtb2RlIHRvIHJlc3RvcmUgdGhlIEl0ZW0gdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBGb3JjZSBhIFNhbmRib3ggSXRlbSBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICogQHBhcmFtIHtTYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94SXRlbVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveEl0ZW1SZXNldExvZ2luKHNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hJdGVtUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94SXRlbVJlc2V0TG9naW4oc2FuZGJveEl0ZW1SZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvc2FuZGJveC9pdGVtL3NldF92ZXJpZmljYXRpb25fc3RhdHVzYCBlbmRwb2ludCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHZlcmlmaWNhdGlvbiBzdGF0dXMgb2YgYW4gSXRlbSBpbiBpbiB0aGUgU2FuZGJveCBpbiBvcmRlciB0byBzaW11bGF0ZSB0aGUgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXQgZmxvdy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRlc3RpbmcgQXV0b21hdGVkIE1pY3JvLWRlcG9zaXRzIGluIFNhbmRib3gsIHNlZSBbQXV0aCBmdWxsIGNvdmVyYWdlIHRlc3RpbmddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXV0aC9jb3ZlcmFnZS90ZXN0aW5nIykuXG4gICAgICogQHN1bW1hcnkgU2V0IHZlcmlmaWNhdGlvbiBzdGF0dXMgZm9yIFNhbmRib3ggYWNjb3VudFxuICAgICAqIEBwYXJhbSB7U2FuZGJveEl0ZW1TZXRWZXJpZmljYXRpb25TdGF0dXNSZXF1ZXN0fSBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1cyhzYW5kYm94SXRlbVNldFZlcmlmaWNhdGlvblN0YXR1c1JlcXVlc3Q6IFNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzKHNhbmRib3hJdGVtU2V0VmVyaWZpY2F0aW9uU3RhdHVzUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2F2ZSB0aGUgc2VsZWN0ZWQgYWNjb3VudHMgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBQbGF0eXB1cyBPYXV0aCBpbnN0aXR1dGlvblxuICAgICAqIEBzdW1tYXJ5IFNhdmUgdGhlIHNlbGVjdGVkIGFjY291bnRzIHdoZW4gY29ubmVjdGluZyB0byB0aGUgUGxhdHlwdXMgT2F1dGggaW5zdGl0dXRpb25cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hPYXV0aFNlbGVjdEFjY291bnRzUmVxdWVzdH0gc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHMoc2FuZGJveE9hdXRoU2VsZWN0QWNjb3VudHNSZXF1ZXN0OiBTYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50cyhzYW5kYm94T2F1dGhTZWxlY3RBY2NvdW50c1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvc2FuZGJveC9wYXltZW50X3Byb2ZpbGUvcmVzZXRfbG9naW4vYCBmb3JjZXMgYSBQYXltZW50IFByb2ZpbGUgaW50byBhIHN0YXRlIHdoZXJlIHRoZSBsb2dpbiBpcyBubyBsb25nZXIgdmFsaWQuIFRoaXMgbWFrZXMgaXQgZWFzeSB0byB0ZXN0IHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICAgQWZ0ZXIgY2FsbGluZyBgL3NhbmRib3gvcGF5bWVudF9wcm9maWxlL3Jlc2V0X2xvZ2luYCwgY2FsbHMgdG8gdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIHdpdGggdGhlIFBheW1lbnQgUHJvZmlsZSB3aWxsIHJlc3VsdCBpbiBhIGBkZWNpc2lvbl9yYXRpb25hbGVgIGBQQVlNRU5UX1BST0ZJTEVfTE9HSU5fUkVRVUlSRURgLiBZb3UgY2FuIHRoZW4gdXNlIHVwZGF0ZSBtb2RlIGZvciBQYXltZW50IFByb2ZpbGUgdG8gcmVzdG9yZSBpdCBpbnRvIGEgZ29vZCBzdGF0ZS4gICBJbiBvcmRlciB0byBpbnZva2UgdGhpcyBlbmRwb2ludCwgeW91IG11c3QgZmlyc3QgW2NyZWF0ZSBhIFBheW1lbnQgUHJvZmlsZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy90cmFuc2Zlci9hZGQtdG8tYXBwLyNjcmVhdGUtYS1wYXltZW50LXByb2ZpbGUtb3B0aW9uYWwpIGFuZCBbZ28gdGhyb3VnaCB0aGUgTGluayBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL2FkZC10by1hcHAvI2NyZWF0ZS1hLWxpbmstdG9rZW4pLlxuICAgICAqIEBzdW1tYXJ5IFJlc2V0IHRoZSBsb2dpbiBvZiBhIFBheW1lbnQgUHJvZmlsZVxuICAgICAqIEBwYXJhbSB7U2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3R9IHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpbihzYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luUmVxdWVzdDogU2FuZGJveFBheW1lbnRQcm9maWxlUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UGF5bWVudFByb2ZpbGVSZXNldExvZ2luKHNhbmRib3hQYXltZW50UHJvZmlsZVJlc2V0TG9naW5SZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wYXltZW50L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSB2YXJpb3VzIHBheW1lbnQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBUaGlzIGVuZHBvaW50IHdpbGwgdHJpZ2dlciB0aGUgY29ycmVzcG9uZGluZyBwYXltZW50IHN0YXR1cyB3ZWJob29rLlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgcGF5bWVudCBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UGF5bWVudFNpbXVsYXRlKHNhbmRib3hQYXltZW50U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94UGF5bWVudFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQYXltZW50U2ltdWxhdGUoc2FuZGJveFBheW1lbnRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3Byb2Nlc3Nvcl90b2tlbi9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHZhbGlkIGBwcm9jZXNzb3JfdG9rZW5gIGZvciBhbiBhcmJpdHJhcnkgaW5zdGl0dXRpb24gSUQgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwcm9jZXNzb3JfdG9rZW5gIGNvcnJlc3BvbmRzIHRvIGEgbmV3IFNhbmRib3ggSXRlbS4gWW91IGNhbiB0aGVuIHVzZSB0aGlzIGBwcm9jZXNzb3JfdG9rZW5gIHdpdGggdGhlIGAvcHJvY2Vzc29yL2AgQVBJIGVuZHBvaW50cyBpbiBTYW5kYm94LiBZb3UgY2FuIGFsc28gdXNlIGAvc2FuZGJveC9wcm9jZXNzb3JfdG9rZW4vY3JlYXRlYCB3aXRoIHRoZSBbYHVzZXJfY3VzdG9tYCB0ZXN0IHVzZXJuYW1lXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20pIHRvIGdlbmVyYXRlIGEgdGVzdCBhY2NvdW50IHdpdGggY3VzdG9tIGRhdGEuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtIGFuZCBwcm9jZXNzb3IgdG9rZW5cbiAgICAgKiBAcGFyYW0ge1NhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3R9IHNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGUoc2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdDogU2FuZGJveFByb2Nlc3NvclRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hQcm9jZXNzb3JUb2tlbkNyZWF0ZShzYW5kYm94UHJvY2Vzc29yVG9rZW5DcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC9wdWJsaWNfdG9rZW4vY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSB2YWxpZCBgcHVibGljX3Rva2VuYCAgZm9yIGFuIGFyYml0cmFyeSBpbnN0aXR1dGlvbiBJRCwgaW5pdGlhbCBwcm9kdWN0cywgYW5kIHRlc3QgY3JlZGVudGlhbHMuIFRoZSBjcmVhdGVkIGBwdWJsaWNfdG9rZW5gIG1hcHMgdG8gYSBuZXcgU2FuZGJveCBJdGVtLiBZb3UgY2FuIHRoZW4gY2FsbCBgL2l0ZW0vcHVibGljX3Rva2VuL2V4Y2hhbmdlYCB0byBleGNoYW5nZSB0aGUgYHB1YmxpY190b2tlbmAgZm9yIGFuIGBhY2Nlc3NfdG9rZW5gIGFuZCBwZXJmb3JtIGFsbCBBUEkgYWN0aW9ucy4gYC9zYW5kYm94L3B1YmxpY190b2tlbi9jcmVhdGVgIGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgW2B1c2VyX2N1c3RvbWAgdGVzdCB1c2VybmFtZV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94L3VzZXItY3VzdG9tKSB0byBnZW5lcmF0ZSBhIHRlc3QgYWNjb3VudCB3aXRoIGN1c3RvbSBkYXRhLCBvciB3aXRoIFBsYWlkXFwncyBbcHJlLXBvcHVsYXRlZCBTYW5kYm94IHRlc3QgYWNjb3VudHNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC90ZXN0LWNyZWRlbnRpYWxzLykuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgdGVzdCBJdGVtXG4gICAgICogQHBhcmFtIHtTYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0fSBzYW5kYm94UHVibGljVG9rZW5DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlKHNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3Q6IFNhbmRib3hQdWJsaWNUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94UHVibGljVG9rZW5DcmVhdGUoc2FuZGJveFB1YmxpY1Rva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3NhbmRib3gvdHJhbnNmZXIvZmlyZV93ZWJob29rYCBlbmRwb2ludCB0byBtYW51YWxseSB0cmlnZ2VyIGEgYFRSQU5TRkVSX0VWRU5UU19VUERBVEVgIHdlYmhvb2sgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgTWFudWFsbHkgZmlyZSBhIFRyYW5zZmVyIHdlYmhvb2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckZpcmVXZWJob29rUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2soc2FuZGJveFRyYW5zZmVyRmlyZVdlYmhvb2tSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9vayhzYW5kYm94VHJhbnNmZXJGaXJlV2ViaG9va1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9kZXBvc2l0L3NpbXVsYXRlYCBlbmRwb2ludCB0byBzaW11bGF0ZSBhIGxlZGdlciBkZXBvc2l0IGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IFNpbXVsYXRlIGEgbGVkZ2VyIGRlcG9zaXQgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJEZXBvc2l0U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyTGVkZ2VyRGVwb3NpdFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlckRlcG9zaXRTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci9zaW11bGF0ZV9hdmFpbGFibGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGNvbnZlcnRpbmcgcGVuZGluZyBiYWxhbmNlIHRvIGF2YWlsYWJsZSBiYWxhbmNlIGZvciBhbGwgb3JpZ2luYXRvcnMgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgY29udmVydGluZyBwZW5kaW5nIGJhbGFuY2UgdG8gYXZhaWxhYmxlIGJhbGFuY2VcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlckxlZGdlclNpbXVsYXRlQXZhaWxhYmxlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGUoc2FuZGJveFRyYW5zZmVyTGVkZ2VyU2ltdWxhdGVBdmFpbGFibGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZShzYW5kYm94VHJhbnNmZXJMZWRnZXJTaW11bGF0ZUF2YWlsYWJsZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL2xlZGdlci93aXRoZHJhdy9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSBsZWRnZXIgd2l0aGRyYXcgZXZlbnQgaW4gU2FuZGJveFxuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZShzYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJMZWRnZXJXaXRoZHJhd1NpbXVsYXRlKHNhbmRib3hUcmFuc2ZlckxlZGdlcldpdGhkcmF3U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZWZ1bmQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHNpbXVsYXRlIGEgcmVmdW5kIGV2ZW50IGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiAgTm90ZSB0aGF0IHdoaWxlIGFuIGV2ZW50IHdpbGwgYmUgc2ltdWxhdGVkIGFuZCB3aWxsIGFwcGVhciB3aGVuIHVzaW5nIGVuZHBvaW50cyBzdWNoIGFzIGAvdHJhbnNmZXIvZXZlbnQvc3luY2Agb3IgYC90cmFuc2Zlci9ldmVudC9saXN0YCwgbm8gdHJhbnNhY3Rpb25zIHdpbGwgYWN0dWFsbHkgdGFrZSBwbGFjZSBhbmQgZnVuZHMgd2lsbCBub3QgbW92ZSBiZXR3ZWVuIGFjY291bnRzLCBldmVuIHdpdGhpbiB0aGUgU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBhIHJlZnVuZCBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZWZ1bmRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlZnVuZFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVmdW5kU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9yZXBheW1lbnQvc2ltdWxhdGVgIGVuZHBvaW50IHRvIHRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50LiBBcyBhIHNpZGUgZWZmZWN0IG9mIGNhbGxpbmcgdGhpcyByb3V0ZSwgYSByZXBheW1lbnQgaXMgY3JlYXRlZCB0aGF0IGluY2x1ZGVzIGFsbCB1bnJlaW1idXJzZWQgcmV0dXJucyBvZiBndWFyYW50ZWVkIHRyYW5zZmVycy4gSWYgdGhlcmUgYXJlIG5vIHN1Y2ggcmV0dXJucywgYW4gNDAwIGVycm9yIGlzIHJldHVybmVkLlxuICAgICAqIEBzdW1tYXJ5IFRyaWdnZXIgdGhlIGNyZWF0aW9uIG9mIGEgcmVwYXltZW50XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJSZXBheW1lbnRTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclJlcGF5bWVudFNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyUmVwYXltZW50U2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gc2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIE5vdGUgdGhhdCB3aGlsZSBhbiBldmVudCB3aWxsIGJlIHNpbXVsYXRlZCBhbmQgd2lsbCBhcHBlYXIgd2hlbiB1c2luZyBlbmRwb2ludHMgc3VjaCBhcyBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIG9yIGAvdHJhbnNmZXIvZXZlbnQvbGlzdGAsIG5vIHRyYW5zYWN0aW9ucyB3aWxsIGFjdHVhbGx5IHRha2UgcGxhY2UgYW5kIGZ1bmRzIHdpbGwgbm90IG1vdmUgYmV0d2VlbiBhY2NvdW50cywgZXZlbiB3aXRoaW4gdGhlIFNhbmRib3guXG4gICAgICogQHN1bW1hcnkgU2ltdWxhdGUgYSB0cmFuc2ZlciBldmVudCBpbiBTYW5kYm94XG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTaW11bGF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclNpbXVsYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2FuZGJveFRyYW5zZmVyU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU2ltdWxhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci9zd2VlcC9zaW11bGF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgc3dlZXAgYW5kIGFzc29jaWF0ZWQgZXZlbnRzIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LiBVcG9uIGNhbGxpbmcgdGhpcyBlbmRwb2ludCwgYWxsIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGBzd2VwdGAgd2lsbCBiZWNvbWUgYHN3ZXB0X3NldHRsZWRgLCBhbGwgYHBvc3RlZGAgb3IgYHBlbmRpbmdgIHRyYW5zZmVycyB3aXRoIGEgc3dlZXAgc3RhdHVzIG9mIGB1bnN3ZXB0YCB3aWxsIGJlY29tZSBgc3dlcHRgLCBhbmQgYWxsIGByZXR1cm5lZGAgdHJhbnNmZXJzIHdpdGggYSBzd2VlcCBzdGF0dXMgb2YgYHN3ZXB0YCB3aWxsIGJlY29tZSBgcmV0dXJuX3N3ZXB0YC5cbiAgICAgKiBAc3VtbWFyeSBTaW11bGF0ZSBjcmVhdGluZyBhIHN3ZWVwXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlKHNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGVSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJTd2VlcFNpbXVsYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclN3ZWVwU2ltdWxhdGUoc2FuZGJveFRyYW5zZmVyU3dlZXBTaW11bGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svYWR2YW5jZWAgZW5kcG9pbnQgdG8gYWR2YW5jZSBhIGB0ZXN0X2Nsb2NrYCBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEEgdGVzdCBjbG9jayBvYmplY3QgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCB0aW1lbGluZSBhbmQgaGFzIGEgYHZpcnR1YWxfdGltZWAgZmllbGQgaW5kaWNhdGluZyB0aGUgY3VycmVudCB0aW1lc3RhbXAgb2YgdGhlIHRpbWVsaW5lLiBBIHRlc3QgY2xvY2sgY2FuIGJlIGFkdmFuY2VkIGJ5IGluY3JlbWVudGluZyBgdmlydHVhbF90aW1lYCwgYnV0IG1heSBuZXZlciBnbyBiYWNrIHRvIGEgbG93ZXIgYHZpcnR1YWxfdGltZWAuICBJZiBhIHRlc3QgY2xvY2sgaXMgYWR2YW5jZWQsIHdlIHdpbGwgc2ltdWxhdGUgdGhlIGNoYW5nZXMgdGhhdCBvdWdodCB0byBvY2N1ciBkdXJpbmcgdGhlIHRpbWUgdGhhdCBlbGFwc2VkLiAgRm9yIGV4YW1wbGUsIGEgY2xpZW50IGNyZWF0ZXMgYSB3ZWVrbHkgcmVjdXJyaW5nIHRyYW5zZmVyIHdpdGggYSB0ZXN0IGNsb2NrIHNldCBhdCB0LiBXaGVuIHRoZSBjbGllbnQgYWR2YW5jZXMgdGhlIHRlc3QgY2xvY2sgYnkgc2V0dGluZyBgdmlydHVhbF90aW1lYCA9IHQgKyAxNSBkYXlzLCAyIG5ldyBvcmlnaW5hdGlvbnMgc2hvdWxkIGJlIGNyZWF0ZWQsIGFsb25nIHdpdGggdGhlIHdlYmhvb2sgZXZlbnRzLiAgVGhlIGFkdmFuY2VtZW50IG9mIHRoZSB0ZXN0IGNsb2NrIGZyb20gaXRzIGN1cnJlbnQgYHZpcnR1YWxfdGltZWAgc2hvdWxkIGJlIGxpbWl0ZWQgc3VjaCB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHRoYW4gMjAgb3JpZ2luYXRpb25zIHJlc3VsdGluZyBmcm9tIHRoZSBhZHZhbmNlIG9wZXJhdGlvbiBvbiBlYWNoIGByZWN1cnJpbmdfdHJhbnNmZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgYHRlc3RfY2xvY2tgLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSByZWN1cnJpbmcgdHJhbnNmZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVzdCBjbG9jayBvcmlnaW5hdGVzIG9uY2UgZXZlcnkgNCB3ZWVrcywgeW91IGNhbiBhZHZhbmNlIHRoZSBgdmlydHVhbF90aW1lYCB1cCB0byA4MCB3ZWVrcyBvbiBlYWNoIEFQSSBjYWxsLlxuICAgICAqIEBzdW1tYXJ5IEFkdmFuY2UgYSB0ZXN0IGNsb2NrXG4gICAgICogQHBhcmFtIHtTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdH0gc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlKHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2VSZXF1ZXN0OiBTYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tBZHZhbmNlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0FkdmFuY2Uoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQWR2YW5jZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC9zYW5kYm94L3RyYW5zZmVyL3Rlc3RfY2xvY2svY3JlYXRlYCBlbmRwb2ludCB0byBjcmVhdGUgYSBgdGVzdF9jbG9ja2AgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQuICBBIHRlc3QgY2xvY2sgb2JqZWN0IHJlcHJlc2VudHMgYW4gaW5kZXBlbmRlbnQgdGltZWxpbmUgYW5kIGhhcyBhIGB2aXJ0dWFsX3RpbWVgIGZpZWxkIGluZGljYXRpbmcgdGhlIGN1cnJlbnQgdGltZXN0YW1wIG9mIHRoZSB0aW1lbGluZS4gVGVzdCBjbG9ja3MgYXJlIHVzZWQgZm9yIHRlc3RpbmcgcmVjdXJyaW5nIHRyYW5zZmVycyBpbiBTYW5kYm94LiAgQSB0ZXN0IGNsb2NrIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggdXAgdG8gNSByZWN1cnJpbmcgdHJhbnNmZXJzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGUoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0NyZWF0ZShzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2dldGAgZW5kcG9pbnQgdG8gZ2V0IGEgYHRlc3RfY2xvY2tgIGluIHRoZSBTYW5kYm94IGVudmlyb25tZW50LlxuICAgICAqIEBzdW1tYXJ5IEdldCBhIHRlc3QgY2xvY2tcbiAgICAgKiBAcGFyYW0ge1NhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXQoc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0dldChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvc2FuZGJveC90cmFuc2Zlci90ZXN0X2Nsb2NrL2xpc3RgIGVuZHBvaW50IHRvIHNlZSBhIGxpc3Qgb2YgYWxsIHlvdXIgdGVzdCBjbG9ja3MgaW4gdGhlIFNhbmRib3ggZW52aXJvbm1lbnQsIGJ5IGFzY2VuZGluZyBgdmlydHVhbF90aW1lYC4gUmVzdWx0cyBhcmUgcGFnaW5hdGVkOyB1c2UgdGhlIGBjb3VudGAgYW5kIGBvZmZzZXRgIHF1ZXJ5IHBhcmFtZXRlcnMgdG8gcmV0cmlldmUgdGhlIGRlc2lyZWQgdGVzdCBjbG9ja3MuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0ZXN0IGNsb2Nrc1xuICAgICAqIEBwYXJhbSB7U2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3R9IHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdChzYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0UmVxdWVzdDogU2FuZGJveFRyYW5zZmVyVGVzdENsb2NrTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VHJhbnNmZXJUZXN0Q2xvY2tMaXN0KHNhbmRib3hUcmFuc2ZlclRlc3RDbG9ja0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3NhbmRib3gvdXNlci9yZXNldF9sb2dpbi9gIGZ1bmN0aW9ucyB0aGUgc2FtZSBhcyBgL3NhbmRib3gvaXRlbS9yZXNldF9sb2dpbmAsIGJ1dCB3aWxsIG1vZGlmeSBJdGVtcyByZWxhdGVkIHRvIGEgVXNlci4gVGhpcyBlbmRwb2ludCBmb3JjZXMgZWFjaCBJdGVtIGludG8gYW4gYElURU1fTE9HSU5fUkVRVUlSRURgIHN0YXRlIGluIG9yZGVyIHRvIHNpbXVsYXRlIGFuIEl0ZW0gd2hvc2UgbG9naW4gaXMgbm8gbG9uZ2VyIHZhbGlkLiBUaGlzIG1ha2VzIGl0IGVhc3kgdG8gdGVzdCBMaW5rXFwncyBbdXBkYXRlIG1vZGVdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvbGluay91cGRhdGUtbW9kZSkgZmxvdyBpbiB0aGUgU2FuZGJveCBlbnZpcm9ubWVudC4gIEFmdGVyIGNhbGxpbmcgYC9zYW5kYm94L3VzZXIvcmVzZXRfbG9naW5gLCBZb3UgY2FuIHRoZW4gdXNlIFBsYWlkIExpbmsgdXBkYXRlIG1vZGUgdG8gcmVzdG9yZSBJdGVtcyBhc3NvY2lhdGVkIHdpdGggdGhlIFVzZXIgdG8gYSBnb29kIHN0YXRlLiBBbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgd2ViaG9vayB3aWxsIGFsc28gYmUgZmlyZWQgYWZ0ZXIgYSBjYWxsIHRvIHRoaXMgZW5kcG9pbnQsIGlmIG9uZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIEl0ZW0uICAgSW4gdGhlIFNhbmRib3gsIEl0ZW1zIHdpbGwgdHJhbnNpdGlvbiB0byBhbiBgSVRFTV9MT0dJTl9SRVFVSVJFRGAgZXJyb3Igc3RhdGUgYXV0b21hdGljYWxseSBhZnRlciAzMCBkYXlzLCBldmVuIGlmIHRoaXMgZW5kcG9pbnQgaXMgbm90IGNhbGxlZC5cbiAgICAgKiBAc3VtbWFyeSBGb3JjZSBpdGVtKHMpIGZvciBhIFNhbmRib3ggVXNlciBpbnRvIGFuIGVycm9yIHN0YXRlXG4gICAgICogQHBhcmFtIHtTYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0fSBzYW5kYm94VXNlclJlc2V0TG9naW5SZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2FuZGJveFVzZXJSZXNldExvZ2luKHNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3Q6IFNhbmRib3hVc2VyUmVzZXRMb2dpblJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zYW5kYm94VXNlclJlc2V0TG9naW4oc2FuZGJveFVzZXJSZXNldExvZ2luUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWZ0ZXIgY2FsbGluZyBgL3NpZ25hbC9ldmFsdWF0ZWAsIGNhbGwgYC9zaWduYWwvZGVjaXNpb24vcmVwb3J0YCB0byByZXBvcnQgd2hldGhlciB0aGUgdHJhbnNhY3Rpb24gd2FzIGluaXRpYXRlZC5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgd2hldGhlciB5b3UgaW5pdGlhdGVkIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsRGVjaXNpb25SZXBvcnRSZXF1ZXN0fSBzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzaWduYWxEZWNpc2lvblJlcG9ydChzaWduYWxEZWNpc2lvblJlcG9ydFJlcXVlc3Q6IFNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnNpZ25hbERlY2lzaW9uUmVwb3J0KHNpZ25hbERlY2lzaW9uUmVwb3J0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIGAvc2lnbmFsL2V2YWx1YXRlYCB0byBldmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uIHRvIGdldCBhIHJldHVybiByaXNrIGFzc2Vzc21lbnQgKHN1Y2ggYXMgYSByaXNrIHNjb3JlIGFuZCByaXNrIHRpZXIpIGFuZCBhZGRpdGlvbmFsIHJpc2sgc2lnbmFscy4gIEluIG9yZGVyIHRvIG9idGFpbiBhIHZhbGlkIHNjb3JlIGZvciBhbiBBQ0ggdHJhbnNhY3Rpb24sIFBsYWlkIG11c3QgaGF2ZSBhbiBhY2Nlc3MgdG9rZW4gZm9yIHRoZSBhY2NvdW50LCBhbmQgdGhlIEl0ZW0gbXVzdCBiZSBoZWFsdGh5IChyZWNlaXZpbmcgcHJvZHVjdCB1cGRhdGVzKSBvciBoYXZlIHJlY2VudGx5IGJlZW4gaW4gYSBoZWFsdGh5IHN0YXRlLiBJZiB0aGUgdHJhbnNhY3Rpb24gZG9lcyBub3QgbWVldCBlbGlnaWJpbGl0eSByZXF1aXJlbWVudHMsIGFuIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQgY29ycmVzcG9uZGluZyB0byB0aGUgdW5kZXJseWluZyBjYXVzZS4gSWYgYC9zaWduYWwvZXZhbHVhdGVgIGlzIGNhbGxlZCBvbiB0aGUgc2FtZSB0cmFuc2FjdGlvbiBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYSAyNC1ob3VyIHBlcmlvZCwgY2FjaGVkIHJlc3VsdHMgbWF5IGJlIHJldHVybmVkLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgcmVmZXIgdG8gdGhlIGVycm9yIGRvY3VtZW50YXRpb24gb24gW0l0ZW0gZXJyb3JzXSgvZG9jcy9lcnJvcnMvaXRlbS8pIGFuZCBbTGluayBpbiBVcGRhdGUgTW9kZV0oL2RvY3MvbGluay91cGRhdGUtbW9kZS8pLiAgTm90ZTogVGhpcyByZXF1ZXN0IG1heSB0YWtlIHNvbWUgdGltZSB0byBjb21wbGV0ZSBpZiBTaWduYWwgaXMgYmVpbmcgYWRkZWQgdG8gYW4gZXhpc3RpbmcgSXRlbS4gVGhpcyBpcyBiZWNhdXNlIFBsYWlkIG11c3QgY29tbXVuaWNhdGUgZGlyZWN0bHkgd2l0aCB0aGUgaW5zdGl0dXRpb24gd2hlbiByZXRyaWV2aW5nIHRoZSBkYXRhIGZvciB0aGUgZmlyc3QgdGltZS5cbiAgICAgKiBAc3VtbWFyeSBFdmFsdWF0ZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxFdmFsdWF0ZVJlcXVlc3R9IHNpZ25hbEV2YWx1YXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbEV2YWx1YXRlKHNpZ25hbEV2YWx1YXRlUmVxdWVzdDogU2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsRXZhbHVhdGUoc2lnbmFsRXZhbHVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBXaGVuIGFuIEl0ZW0gaXMgbm90IGluaXRpYWxpemVkIHdpdGggU2lnbmFsLCBjYWxsIGAvc2lnbmFsL3ByZXBhcmVgIHRvIG9wdC1pbiB0aGF0IEl0ZW0gdG8gdGhlIFNpZ25hbCBkYXRhIGNvbGxlY3Rpb24gcHJvY2VzcywgZGV2ZWxvcGluZyBhIFNpZ25hbCBzY29yZS4gVGhpcyBzaG91bGQgYmUgZG9uZSBvbiBJdGVtcyB3aGVyZSBTaWduYWwgd2FzIGFkZGVkIGluIHRoZSBgYWRkaXRpb25hbF9jb25zZW50ZWRfcHJvZHVjdHNgIGFycmF5IGJ1dCBub3QgaW4gdGhlIGBwcm9kdWN0c2AsIGBvcHRpb25hbF9wcm9kdWN0c2AsIG9yIGByZXF1aXJlZF9pZl9zdXBwb3J0ZWRfcHJvZHVjdHNgIGFycmF5LiBJZiBgL3NpZ25hbC9wcmVwYXJlYCBpcyBza2lwcGVkIG9uIGFuIEl0ZW0gdGhhdCBpcyBub3QgaW5pdGlhbGl6ZWQgd2l0aCBTaWduYWwsIHRoZSBpbml0aWFsIGNhbGwgdG8gYC9zaWduYWwvZXZhbHVhdGVgIG9uIHRoYXQgSXRlbSB3aWxsIGJlIGxlc3MgYWNjdXJhdGUsIGJlY2F1c2UgU2lnbmFsIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gbGVzcyBkYXRhIGZvciBjb21wdXRpbmcgdGhlIFNpZ25hbCBzY29yZS4gIElmIHJ1biBvbiBhbiBJdGVtIHRoYXQgaXMgYWxyZWFkeSBpbml0aWFsaXplZCB3aXRoIFNpZ25hbCwgdGhpcyBlbmRwb2ludCB3aWxsIHJldHVybiBhIDIwMCByZXNwb25zZSBhbmQgd2lsbCBub3QgbW9kaWZ5IHRoZSBJdGVtLlxuICAgICAqIEBzdW1tYXJ5IE9wdC1pbiBhbiBJdGVtIHRvIFNpZ25hbFxuICAgICAqIEBwYXJhbSB7U2lnbmFsUHJlcGFyZVJlcXVlc3R9IHNpZ25hbFByZXBhcmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgc2lnbmFsUHJlcGFyZShzaWduYWxQcmVwYXJlUmVxdWVzdDogU2lnbmFsUHJlcGFyZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS5zaWduYWxQcmVwYXJlKHNpZ25hbFByZXBhcmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxsIHRoZSBgL3NpZ25hbC9yZXR1cm4vcmVwb3J0YCBlbmRwb2ludCB0byByZXBvcnQgYSByZXR1cm5lZCB0cmFuc2FjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHNlbnQgdG8gdGhlIGAvc2lnbmFsL2V2YWx1YXRlYCBlbmRwb2ludC4gWW91ciBmZWVkYmFjayB3aWxsIGJlIHVzZWQgYnkgdGhlIG1vZGVsIHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgcmlzayB0cmVuZCBpbiB5b3VyIHBvcnRmb2xpby5cbiAgICAgKiBAc3VtbWFyeSBSZXBvcnQgYSByZXR1cm4gZm9yIGFuIEFDSCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7U2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdH0gc2lnbmFsUmV0dXJuUmVwb3J0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbFJldHVyblJlcG9ydChzaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0OiBTaWduYWxSZXR1cm5SZXBvcnRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsUmV0dXJuUmVwb3J0KHNpZ25hbFJldHVyblJlcG9ydFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSBgL3NpZ25hbC9zY2hlZHVsZWAgdG8gc2NoZWR1bGUgYSBwbGFubmVkIEFDSCB0cmFuc2FjdGlvbi5cbiAgICAgKiBAc3VtbWFyeSBTY2hlZHVsZSBhIHBsYW5uZWQgQUNIIHRyYW5zYWN0aW9uXG4gICAgICogQHBhcmFtIHtTaWduYWxTY2hlZHVsZVJlcXVlc3R9IHNpZ25hbFNjaGVkdWxlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHNpZ25hbFNjaGVkdWxlKHNpZ25hbFNjaGVkdWxlUmVxdWVzdDogU2lnbmFsU2NoZWR1bGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikuc2lnbmFsU2NoZWR1bGUoc2lnbmFsU2NoZWR1bGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2Rvd25sb2FkYCBlbmRwb2ludCByZXRyaWV2ZXMgYSBzaW5nbGUgc3RhdGVtZW50IFBERiBpbiBiaW5hcnkgZm9ybWF0LiAgVGhlIHJlc3BvbnNlIHdpbGwgY29udGFpbiBhIGBQbGFpZC1Db250ZW50LUhhc2hgIGhlYWRlciBjb250YWluaW5nIGEgU0hBIDI1NiBjaGVja3N1bSBvZiB0aGUgc3RhdGVtZW50LiBUaGlzIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGF0IHRoZSBmaWxlIGJlaW5nIHNlbnQgYnkgUGxhaWQgaXMgdGhlIHNhbWUgZmlsZSB0aGF0IHdhcyBkb3dubG9hZGVkIHRvIHlvdXIgc3lzdGVtLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgc2luZ2xlIHN0YXRlbWVudC5cbiAgICAgKiBAcGFyYW0ge1N0YXRlbWVudHNEb3dubG9hZFJlcXVlc3R9IHN0YXRlbWVudHNEb3dubG9hZFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0ZW1lbnRzRG93bmxvYWQoc3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdDogU3RhdGVtZW50c0Rvd25sb2FkUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnN0YXRlbWVudHNEb3dubG9hZChzdGF0ZW1lbnRzRG93bmxvYWRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9zdGF0ZW1lbnRzL2xpc3RgIGVuZHBvaW50IHJldHJpZXZlcyBhIGxpc3Qgb2YgYWxsIHN0YXRlbWVudHMgYXNzb2NpYXRlZCB3aXRoIGFuIGl0ZW0uXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBsaXN0IG9mIGFsbCBzdGF0ZW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhbiBpdGVtLlxuICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c0xpc3RSZXF1ZXN0fSBzdGF0ZW1lbnRzTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0ZW1lbnRzTGlzdChzdGF0ZW1lbnRzTGlzdFJlcXVlc3Q6IFN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnN0YXRlbWVudHNMaXN0KHN0YXRlbWVudHNMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYC9zdGF0ZW1lbnRzL3JlZnJlc2hgIGluaXRpYXRlcyBhbiBvbi1kZW1hbmQgZXh0cmFjdGlvbiB0byBmZXRjaCB0aGUgc3RhdGVtZW50cyBmb3IgdGhlIHByb3ZpZGVkIGRhdGVzLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggc3RhdGVtZW50cyBkYXRhLlxuICAgICAqIEBwYXJhbSB7U3RhdGVtZW50c1JlZnJlc2hSZXF1ZXN0fSBzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0ZW1lbnRzUmVmcmVzaChzdGF0ZW1lbnRzUmVmcmVzaFJlcXVlc3Q6IFN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnN0YXRlbWVudHNSZWZyZXNoKHN0YXRlbWVudHNSZWZyZXNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvYmV0YS90cmFuc2FjdGlvbnMvdjEvZW5oYW5jZWAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgcHJvdmlkZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLlxuICAgICAqIEBzdW1tYXJ5IGVuaGFuY2UgbG9jYWxseS1oZWxkIHRyYW5zYWN0aW9uIGRhdGFcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0VuaGFuY2UodHJhbnNhY3Rpb25zRW5oYW5jZUdldFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VuaGFuY2VHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zRW5oYW5jZSh0cmFuc2FjdGlvbnNFbmhhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNhY3Rpb25zL2VucmljaGAgZW5kcG9pbnQgZW5yaWNoZXMgcmF3IHRyYW5zYWN0aW9uIGRhdGEgZ2VuZXJhdGVkIGJ5IHlvdXIgb3duIGJhbmtpbmcgcHJvZHVjdHMgb3IgcmV0cmlldmVkIGZyb20gb3RoZXIgbm9uLVBsYWlkIHNvdXJjZXMuXG4gICAgICogQHN1bW1hcnkgRW5yaWNoIGxvY2FsbHktaGVsZCB0cmFuc2FjdGlvbiBkYXRhXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0fSB0cmFuc2FjdGlvbnNFbnJpY2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zRW5yaWNoKHRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3Q6IFRyYW5zYWN0aW9uc0VucmljaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNFbnJpY2godHJhbnNhY3Rpb25zRW5yaWNoUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTm90ZTogQWxsIG5ldyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gdXNlIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHJhdGhlciB0aGFuIGAvdHJhbnNhY3Rpb25zL2dldGAuIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHByb3ZpZGVzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgYC90cmFuc2FjdGlvbnMvZ2V0YCBhbmQgaW1wcm92ZXMgZGV2ZWxvcGVyIGVhc2Utb2YtdXNlIGZvciBoYW5kbGluZyB0cmFuc2FjdGlvbnMgdXBkYXRlcy4gIFRoZSBgL3RyYW5zYWN0aW9ucy9nZXRgIGVuZHBvaW50IGFsbG93cyBkZXZlbG9wZXJzIHRvIHJlY2VpdmUgdXNlci1hdXRob3JpemVkIHRyYW5zYWN0aW9uIGRhdGEgZm9yIGNyZWRpdCwgZGVwb3NpdG9yeSwgYW5kIHNvbWUgbG9hbi10eXBlIGFjY291bnRzIChvbmx5IHRob3NlIHdpdGggYWNjb3VudCBzdWJ0eXBlIGBzdHVkZW50YDsgY292ZXJhZ2UgbWF5IGJlIGxpbWl0ZWQpLiBGb3IgdHJhbnNhY3Rpb24gaGlzdG9yeSBmcm9tIGludmVzdG1lbnRzIGFjY291bnRzLCB1c2UgdGhlIFtJbnZlc3RtZW50cyBlbmRwb2ludF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvaW52ZXN0bWVudHMvKSBpbnN0ZWFkLiBUcmFuc2FjdGlvbiBkYXRhIGlzIHN0YW5kYXJkaXplZCBhY3Jvc3MgZmluYW5jaWFsIGluc3RpdHV0aW9ucywgYW5kIGluIG1hbnkgY2FzZXMgdHJhbnNhY3Rpb25zIGFyZSBsaW5rZWQgdG8gYSBjbGVhbiBuYW1lLCBlbnRpdHkgdHlwZSwgbG9jYXRpb24sIGFuZCBjYXRlZ29yeS4gU2ltaWxhcmx5LCBhY2NvdW50IGRhdGEgaXMgc3RhbmRhcmRpemVkIGFuZCByZXR1cm5lZCB3aXRoIGEgY2xlYW4gbmFtZSwgbnVtYmVyLCBiYWxhbmNlLCBhbmQgb3RoZXIgbWV0YSBpbmZvcm1hdGlvbiB3aGVyZSBhdmFpbGFibGUuICBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIHJldmVyc2UtY2hyb25vbG9naWNhbCBvcmRlciwgYW5kIHRoZSBzZXF1ZW5jZSBvZiB0cmFuc2FjdGlvbiBvcmRlcmluZyBpcyBzdGFibGUgYW5kIHdpbGwgbm90IHNoaWZ0LiAgVHJhbnNhY3Rpb25zIGFyZSBub3QgaW1tdXRhYmxlIGFuZCBjYW4gYWxzbyBiZSByZW1vdmVkIGFsdG9nZXRoZXIgYnkgdGhlIGluc3RpdHV0aW9uOyBhIHJlbW92ZWQgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXBwZWFyIGluIGAvdHJhbnNhY3Rpb25zL2dldGAuICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgW1BlbmRpbmcgYW5kIHBvc3RlZCB0cmFuc2FjdGlvbnNdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zL3RyYW5zYWN0aW9ucy1kYXRhLyNwZW5kaW5nLWFuZC1wb3N0ZWQtdHJhbnNhY3Rpb25zKS4gIER1ZSB0byB0aGUgcG90ZW50aWFsbHkgbGFyZ2UgbnVtYmVyIG9mIHRyYW5zYWN0aW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gSXRlbSwgcmVzdWx0cyBhcmUgcGFnaW5hdGVkLiBNYW5pcHVsYXRlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBwYXJhbWV0ZXJzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGB0b3RhbF90cmFuc2FjdGlvbnNgIHJlc3BvbnNlIGJvZHkgZmllbGQgdG8gZmV0Y2ggYWxsIGF2YWlsYWJsZSB0cmFuc2FjdGlvbnMuICBEYXRhIHJldHVybmVkIGJ5IGAvdHJhbnNhY3Rpb25zL2dldGAgd2lsbCBiZSB0aGUgZGF0YSBhdmFpbGFibGUgZm9yIHRoZSBJdGVtIGFzIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLiBQbGFpZCB0eXBpY2FsbHkgY2hlY2tzIGZvciBuZXcgZGF0YSBtdWx0aXBsZSB0aW1lcyBhIGRheSwgYnV0IHRoZXNlIGNoZWNrcyBtYXkgb2NjdXIgbGVzcyBmcmVxdWVudGx5LCBzdWNoIGFzIG9uY2UgYSBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdGhlIEl0ZW0gd2FzIGxhc3QgdXBkYXRlZCwgdXNlIHRoZSBbSXRlbSBEZWJ1Z2dlcl0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hY2NvdW50L2FjdGl2aXR5LyN0cm91Ymxlc2hvb3Rpbmctd2l0aC1pdGVtLWRlYnVnZ2VyKSBvciBjYWxsIGAvaXRlbS9nZXRgOyB0aGUgYGl0ZW0uc3RhdHVzLnRyYW5zYWN0aW9ucy5sYXN0X3N1Y2Nlc3NmdWxfdXBkYXRlYCBmaWVsZCB3aWxsIHNob3cgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgc3VjY2Vzc2Z1bCB1cGRhdGUuIFRvIGZvcmNlIFBsYWlkIHRvIGNoZWNrIGZvciBuZXcgdHJhbnNhY3Rpb25zLCB5b3UgY2FuIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBOb3RlIHRoYXQgZGF0YSBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB0byBgL3RyYW5zYWN0aW9ucy9nZXRgLiBQbGFpZCB3aWxsIGJlZ2luIHRvIHByZXBhcmUgdHJhbnNhY3Rpb25zIGRhdGEgdXBvbiBJdGVtIGxpbmssIGlmIExpbmsgd2FzIGluaXRpYWxpemVkIHdpdGggYHRyYW5zYWN0aW9uc2AsIG9yIHVwb24gdGhlIGZpcnN0IGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvZ2V0YCwgaWYgaXQgd2FzblxcJ3QuIFRvIGJlIGFsZXJ0ZWQgd2hlbiB0cmFuc2FjdGlvbiBkYXRhIGlzIHJlYWR5IHRvIGJlIGZldGNoZWQsIGxpc3RlbiBmb3IgdGhlIFtgSU5JVElBTF9VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI2luaXRpYWxfdXBkYXRlKSBhbmQgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2tzLiBJZiBubyB0cmFuc2FjdGlvbiBoaXN0b3J5IGlzIHJlYWR5IHdoZW4gYC90cmFuc2FjdGlvbnMvZ2V0YCBpcyBjYWxsZWQsIGl0IHdpbGwgcmV0dXJuIGEgYFBST0RVQ1RfTk9UX1JFQURZYCBlcnJvci5cbiAgICAgKiBAc3VtbWFyeSBHZXQgdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc0dldCh0cmFuc2FjdGlvbnNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zR2V0KHRyYW5zYWN0aW9uc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9yZWN1cnJpbmcvZ2V0YCBlbmRwb2ludCBhbGxvd3MgZGV2ZWxvcGVycyB0byByZWNlaXZlIGEgc3VtbWFyeSBvZiB0aGUgcmVjdXJyaW5nIG91dGZsb3cgYW5kIGluZmxvdyBzdHJlYW1zIChleHBlbnNlcyBhbmQgZGVwb3NpdHMpIGZyb20gYSB1c2Vy4oCZcyBjaGVja2luZywgc2F2aW5ncyBvciBjcmVkaXQgY2FyZCBhY2NvdW50cy4gQWRkaXRpb25hbGx5LCBQbGFpZCBwcm92aWRlcyBrZXkgaW5zaWdodHMgYWJvdXQgZWFjaCByZWN1cnJpbmcgc3RyZWFtIGluY2x1ZGluZyB0aGUgY2F0ZWdvcnksIG1lcmNoYW50LCBsYXN0IGFtb3VudCwgYW5kIG1vcmUuIERldmVsb3BlcnMgY2FuIHVzZSB0aGVzZSBpbnNpZ2h0cyB0byBidWlsZCB0b29scyBhbmQgZXhwZXJpZW5jZXMgdGhhdCBoZWxwIHRoZWlyIHVzZXJzIGJldHRlciBtYW5hZ2UgY2FzaCBmbG93LCBtb25pdG9yIHN1YnNjcmlwdGlvbnMsIHJlZHVjZSBzcGVuZCwgYW5kIHN0YXkgb24gdHJhY2sgd2l0aCBiaWxsIHBheW1lbnRzLiAgVGhpcyBlbmRwb2ludCBpcyBvZmZlcmVkIGFzIGFuIGFkZC1vbiB0byBUcmFuc2FjdGlvbnMuIFRvIHJlcXVlc3QgYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQsIHN1Ym1pdCBhIFtwcm9kdWN0IGFjY2VzcyByZXF1ZXN0XShodHRwczovL2Rhc2hib2FyZC5wbGFpZC5jb20vdGVhbS9wcm9kdWN0cykgb3IgY29udGFjdCB5b3VyIFBsYWlkIGFjY291bnQgbWFuYWdlci4gIFRoaXMgZW5kcG9pbnQgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIGFuIEl0ZW0gdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggVHJhbnNhY3Rpb25zIChlaXRoZXIgZHVyaW5nIExpbmssIGJ5IHNwZWNpZnlpbmcgaXQgaW4gYC9saW5rL3Rva2VuL2NyZWF0ZWA7IG9yIGFmdGVyIExpbmssIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYCkuICAgV2hlbiB1c2luZyBSZWN1cnJpbmcgVHJhbnNhY3Rpb25zLCBmb3IgYmVzdCByZXN1bHRzLCBtYWtlIHN1cmUgdG8gdXNlIHRoZSBbYGRheXNfcmVxdWVzdGVkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2FjdGlvbnMtZGF5cy1yZXF1ZXN0ZWQpIHBhcmFtZXRlciB0byByZXF1ZXN0IGF0IGxlYXN0IDE4MCBkYXlzIG9mIGhpc3Rvcnkgd2hlbiBpbml0aWFsaXppbmcgSXRlbXMgd2l0aCBUcmFuc2FjdGlvbnMuIE9uY2UgYWxsIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlY3VycmluZy9nZXRgIHRvIHJlY2VpdmUgdGhlIFJlY3VycmluZyBUcmFuc2FjdGlvbnMgc3RyZWFtcyBhbmQgc3Vic2NyaWJlIHRvIHRoZSBbYFJFQ1VSUklOR19UUkFOU0FDVElPTlNfVVBEQVRFYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyNyZWN1cnJpbmdfdHJhbnNhY3Rpb25zX3VwZGF0ZSkgd2ViaG9vay4gVG8ga25vdyB3aGVuIGhpc3RvcmljYWwgdHJhbnNhY3Rpb25zIGhhdmUgYmVlbiBmZXRjaGVkLCBpZiB5b3UgYXJlIHVzaW5nIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGxpc3RlbiBmb3IgdGhlIFtgU1lOQ19VUERBVEVTX0FWQUlMQUJMRWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jU3luY1VwZGF0ZXNBdmFpbGFibGVXZWJob29rLWhpc3RvcmljYWwtdXBkYXRlLWNvbXBsZXRlKSB3ZWJob29rIGFuZCBjaGVjayB0aGF0IHRoZSBgaGlzdG9yaWNhbF91cGRhdGVfY29tcGxldGVgIGZpZWxkIGluIHRoZSBwYXlsb2FkIGlzIGB0cnVlYC4gSWYgdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgbGlzdGVuIGZvciB0aGUgW2BISVNUT1JJQ0FMX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jaGlzdG9yaWNhbF91cGRhdGUpIHdlYmhvb2suICBBZnRlciB0aGUgaW5pdGlhbCBjYWxsLCB5b3UgY2FuIGNhbGwgYC90cmFuc2FjdGlvbnMvcmVjdXJyaW5nL2dldGAgZW5kcG9pbnQgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmUgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdW1tYXJ5IG9mIHJlY3VycmluZyBzdHJlYW1zLiBMaXN0ZW4gdG8gdGhlIFtgUkVDVVJSSU5HX1RSQU5TQUNUSU9OU19VUERBVEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3JlY3VycmluZ190cmFuc2FjdGlvbnNfdXBkYXRlKSB3ZWJob29rIHRvIGJlIG5vdGlmaWVkIHdoZW4gbmV3IHVwZGF0ZXMgYXJlIGF2YWlsYWJsZS5cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCByZWN1cnJpbmcgdHJhbnNhY3Rpb24gc3RyZWFtc1xuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldCh0cmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSZWN1cnJpbmdHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUmVjdXJyaW5nR2V0KHRyYW5zYWN0aW9uc1JlY3VycmluZ0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgIGlzIGFuIG9wdGlvbmFsIGVuZHBvaW50IHRoYXQgaW5pdGlhdGVzIGFuIG9uLWRlbWFuZCBleHRyYWN0aW9uIHRvIGZldGNoIHRoZSBuZXdlc3QgdHJhbnNhY3Rpb25zIGZvciBhbiBJdGVtLiBUaGUgb24tZGVtYW5kIGV4dHJhY3Rpb24gdGFrZXMgcGxhY2UgaW4gYWRkaXRpb24gdG8gdGhlIHBlcmlvZGljIGV4dHJhY3Rpb25zIHRoYXQgYXV0b21hdGljYWxseSBvY2N1ciBvbmUgb3IgbW9yZSB0aW1lcyBwZXIgZGF5IGZvciBhbnkgVHJhbnNhY3Rpb25zLWVuYWJsZWQgSXRlbS4gVGhlIEl0ZW0gbXVzdCBhbHJlYWR5IGhhdmUgVHJhbnNhY3Rpb25zIGFkZGVkIGFzIGEgcHJvZHVjdCBpbiBvcmRlciB0byBjYWxsIGAvdHJhbnNhY3Rpb25zL3JlZnJlc2hgLiAgSWYgY2hhbmdlcyB0byB0cmFuc2FjdGlvbnMgYXJlIGRpc2NvdmVyZWQgYWZ0ZXIgY2FsbGluZyBgL3RyYW5zYWN0aW9ucy9yZWZyZXNoYCwgUGxhaWQgd2lsbCBmaXJlIGEgd2ViaG9vazogZm9yIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHVzZXJzLCBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdpbGwgYmUgZmlyZWQgaWYgdGhlcmUgYXJlIGFueSB0cmFuc2FjdGlvbnMgdXBkYXRlZCwgYWRkZWQsIG9yIHJlbW92ZWQuIEZvciB1c2VycyBvZiBib3RoIGAvdHJhbnNhY3Rpb25zL3N5bmNgIGFuZCBgL3RyYW5zYWN0aW9ucy9nZXRgLCBbYFRSQU5TQUNUSU9OU19SRU1PVkVEYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvcHJvZHVjdHMvdHJhbnNhY3Rpb25zLyN0cmFuc2FjdGlvbnNfcmVtb3ZlZCkgd2lsbCBiZSBmaXJlZCBpZiBhbnkgcmVtb3ZlZCB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLCBhbmQgW2BERUZBVUxUX1VQREFURWBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvYXBpL3Byb2R1Y3RzL3RyYW5zYWN0aW9ucy8jZGVmYXVsdF91cGRhdGUpIHdpbGwgYmUgZmlyZWQgaWYgYW55IG5ldyB0cmFuc2FjdGlvbnMgYXJlIGRldGVjdGVkLiBOZXcgdHJhbnNhY3Rpb25zIGNhbiBiZSBmZXRjaGVkIGJ5IGNhbGxpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCBvciBgL3RyYW5zYWN0aW9ucy9zeW5jYC4gIE5vdGUgdGhhdCB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQgaXMgbm90IHN1cHBvcnRlZCBmb3IgQ2FwaXRhbCBPbmUgKGBpbnNfMTI4MDI2YCkgbm9uLWRlcG9zaXRvcnkgYWNjb3VudHMgYW5kIHdpbGwgcmVzdWx0IGluIGEgYFBST0RVQ1RTX05PVF9TVVBQT1JURURgIGVycm9yIGlmIGNhbGxlZCBvbiBhbiBJdGVtIHRoYXQgY29udGFpbnMgb25seSBub24tZGVwb3NpdG9yeSBhY2NvdW50cyBmcm9tIHRoYXQgaW5zdGl0dXRpb24uICBBcyB0aGlzIGVuZHBvaW50IHRyaWdnZXJzIGEgc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgZnJlc2ggZGF0YSwgbGF0ZW5jeSBtYXkgYmUgaGlnaGVyIHRoYW4gZm9yIG90aGVyIFBsYWlkIGVuZHBvaW50cyAodHlwaWNhbGx5IGxlc3MgdGhhbiAxMCBzZWNvbmRzLCBidXQgb2NjYXNpb25hbGx5IHVwIHRvIDMwIHNlY29uZHMgb3IgbW9yZSk7IGlmIHlvdSBlbmNvdW50ZXIgZXJyb3JzLCB5b3UgbWF5IGZpbmQgaXQgbmVjZXNzYXJ5IHRvIGFkanVzdCB5b3VyIHRpbWVvdXQgcGVyaW9kIHdoZW4gbWFraW5nIHJlcXVlc3RzLiAgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgaXMgb2ZmZXJlZCBhcyBhbiBvcHRpb25hbCBhZGQtb24gdG8gVHJhbnNhY3Rpb25zIGFuZCBoYXMgYSBzZXBhcmF0ZSBbZmVlIG1vZGVsXSgvZG9jcy9hY2NvdW50L2JpbGxpbmcvI3Blci1yZXF1ZXN0LWZsYXQtZmVlKS4gVG8gcmVxdWVzdCBhY2Nlc3MgdG8gdGhpcyBlbmRwb2ludCwgc3VibWl0IGEgW3Byb2R1Y3QgYWNjZXNzIHJlcXVlc3RdKGh0dHBzOi8vZGFzaGJvYXJkLnBsYWlkLmNvbS90ZWFtL3Byb2R1Y3RzKSBvciBjb250YWN0IHlvdXIgUGxhaWQgYWNjb3VudCBtYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IFJlZnJlc2ggdHJhbnNhY3Rpb24gZGF0YVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3R9IHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUmVmcmVzaCh0cmFuc2FjdGlvbnNSZWZyZXNoUmVxdWVzdDogVHJhbnNhY3Rpb25zUmVmcmVzaFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSZWZyZXNoKHRyYW5zYWN0aW9uc1JlZnJlc2hSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvY3JlYXRlYCBlbmRwb2ludCBjcmVhdGVzIHRyYW5zYWN0aW9uIGNhdGVnb3JpemF0aW9uIHJ1bGVzLiAgUnVsZXMgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBJdGVtXFwncyB0cmFuc2FjdGlvbnMgcmV0dXJuZWQgaW4gYC90cmFuc2FjdGlvbnMvZ2V0YCByZXNwb25zZS4gIFRoZSBwcm9kdWN0IGlzIGN1cnJlbnRseSBpbiBiZXRhLiBUbyByZXF1ZXN0IGFjY2VzcywgY29udGFjdCB0cmFuc2FjdGlvbnMtZmVlZGJhY2tAcGxhaWQuY29tLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB0cmFuc2FjdGlvbiBjYXRlZ29yeSBydWxlXG4gICAgICogQHBhcmFtIHtUcmFuc2FjdGlvbnNSdWxlc0NyZWF0ZVJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlKHRyYW5zYWN0aW9uc1J1bGVzQ3JlYXRlUmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zUnVsZXNDcmVhdGUodHJhbnNhY3Rpb25zUnVsZXNDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvbGlzdGAgcmV0dXJucyBhIGxpc3Qgb2YgdHJhbnNhY3Rpb24gcnVsZXMgY3JlYXRlZCBmb3IgdGhlIEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBhY2Nlc3MgdG9rZW4uXG4gICAgICogQHN1bW1hcnkgUmV0dXJuIGEgbGlzdCBvZiBydWxlcyBjcmVhdGVkIGZvciB0aGUgSXRlbSBhc3NvY2lhdGVkIHdpdGggdGhlIGFjY2VzcyB0b2tlbi5cbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3R9IHRyYW5zYWN0aW9uc1J1bGVzTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2FjdGlvbnNSdWxlc0xpc3QodHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdDogVHJhbnNhY3Rpb25zUnVsZXNMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zYWN0aW9uc1J1bGVzTGlzdCh0cmFuc2FjdGlvbnNSdWxlc0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2FjdGlvbnMvcnVsZXMvdjEvcmVtb3ZlYCBlbmRwb2ludCBpcyB1c2VkIHRvIHJlbW92ZSBhIHRyYW5zYWN0aW9uIHJ1bGUuXG4gICAgICogQHN1bW1hcnkgUmVtb3ZlIHRyYW5zYWN0aW9uIHJ1bGVcbiAgICAgKiBAcGFyYW0ge1RyYW5zYWN0aW9uc1J1bGVzUmVtb3ZlUmVxdWVzdH0gdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zUnVsZXNSZW1vdmUodHJhbnNhY3Rpb25zUnVsZXNSZW1vdmVSZXF1ZXN0OiBUcmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNSdWxlc1JlbW92ZSh0cmFuc2FjdGlvbnNSdWxlc1JlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zYWN0aW9ucy9zeW5jYCBlbmRwb2ludCByZXRyaWV2ZXMgdHJhbnNhY3Rpb25zIGFzc29jaWF0ZWQgd2l0aCBhbiBJdGVtIGFuZCBjYW4gZmV0Y2ggdXBkYXRlcyB1c2luZyBhIGN1cnNvciB0byB0cmFjayB3aGljaCB1cGRhdGVzIGhhdmUgYWxyZWFkeSBiZWVuIHNlZW4uICBGb3IgaW1wb3J0YW50IGluc3RydWN0aW9ucyBvbiBpbnRlZ3JhdGluZyB3aXRoIGAvdHJhbnNhY3Rpb25zL3N5bmNgLCBzZWUgdGhlIFtUcmFuc2FjdGlvbnMgaW50ZWdyYXRpb24gb3ZlcnZpZXddKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvdHJhbnNhY3Rpb25zLyNpbnRlZ3JhdGlvbi1vdmVydmlldykuIElmIHlvdSBhcmUgbWlncmF0aW5nIGZyb20gYW4gZXhpc3RpbmcgaW50ZWdyYXRpb24gdXNpbmcgYC90cmFuc2FjdGlvbnMvZ2V0YCwgc2VlIHRoZSBbVHJhbnNhY3Rpb25zIFN5bmMgbWlncmF0aW9uIGd1aWRlXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zYWN0aW9ucy9zeW5jLW1pZ3JhdGlvbi8pLiAgVGhpcyBlbmRwb2ludCBzdXBwb3J0cyBgY3JlZGl0YCwgYGRlcG9zaXRvcnlgLCBhbmQgc29tZSBgbG9hbmAtdHlwZSBhY2NvdW50cyAob25seSB0aG9zZSB3aXRoIGFjY291bnQgc3VidHlwZSBgc3R1ZGVudGApLiBGb3IgYGludmVzdG1lbnRzYCBhY2NvdW50cywgdXNlIGAvaW52ZXN0bWVudHMvdHJhbnNhY3Rpb25zL2dldGAgaW5zdGVhZC4gICBXaGVuIHJldHJpZXZpbmcgcGFnaW5hdGVkIHVwZGF0ZXMsIHRyYWNrIGJvdGggdGhlIGBuZXh0X2N1cnNvcmAgZnJvbSB0aGUgbGF0ZXN0IHJlc3BvbnNlIGFuZCB0aGUgb3JpZ2luYWwgY3Vyc29yIGZyb20gdGhlIGZpcnN0IGNhbGwgaW4gd2hpY2ggYGhhc19tb3JlYCB3YXMgYHRydWVgOyBpZiBhIGNhbGwgdG8gYC90cmFuc2FjdGlvbnMvc3luY2AgZmFpbHMgd2hlbiByZXRyaWV2aW5nIGEgcGFnaW5hdGVkIHVwZGF0ZSAoZS5nIGR1ZSB0byB0aGUgW2BUUkFOU0FDVElPTlNfU1lOQ19NVVRBVElPTl9EVVJJTkdfUEFHSU5BVElPTmBdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3MvZXJyb3JzL3RyYW5zYWN0aW9ucy8jdHJhbnNhY3Rpb25zX3N5bmNfbXV0YXRpb25fZHVyaW5nX3BhZ2luYXRpb24pIGVycm9yKSwgdGhlIGVudGlyZSBwYWdpbmF0aW9uIHJlcXVlc3QgbG9vcCBtdXN0IGJlIHJlc3RhcnRlZCBiZWdpbm5pbmcgd2l0aCB0aGUgY3Vyc29yIGZvciB0aGUgZmlyc3QgcGFnZSBvZiB0aGUgdXBkYXRlLCByYXRoZXIgdGhhbiByZXRyeWluZyBvbmx5IHRoZSBzaW5nbGUgcmVxdWVzdCB0aGF0IGZhaWxlZC4gIElmIHRyYW5zYWN0aW9ucyBkYXRhIGlzIG5vdCB5ZXQgYXZhaWxhYmxlIGZvciB0aGUgSXRlbSwgd2hpY2ggY2FuIGhhcHBlbiBpZiB0aGUgSXRlbSB3YXMgbm90IGluaXRpYWxpemVkIHdpdGggdHJhbnNhY3Rpb25zIGR1cmluZyB0aGUgYC9saW5rL3Rva2VuL2NyZWF0ZWAgY2FsbCBvciBpZiBgL3RyYW5zYWN0aW9ucy9zeW5jYCB3YXMgY2FsbGVkIHdpdGhpbiBhIGZldyBzZWNvbmRzIG9mIEl0ZW0gY3JlYXRpb24sIGAvdHJhbnNhY3Rpb25zL3N5bmNgIHdpbGwgcmV0dXJuIGVtcHR5IHRyYW5zYWN0aW9ucyBhcnJheXMuICAgUGxhaWQgdHlwaWNhbGx5IGNoZWNrcyBmb3IgbmV3IHRyYW5zYWN0aW9ucyBkYXRhIGJldHdlZW4gb25lIGFuZCBmb3VyIHRpbWVzIHBlciBkYXksIGRlcGVuZGluZyBvbiB0aGUgaW5zdGl0dXRpb24uIFRvIGZpbmQgb3V0IHdoZW4gdHJhbnNhY3Rpb25zIHdlcmUgbGFzdCB1cGRhdGVkIGZvciBhbiBJdGVtLCB1c2UgdGhlIFtJdGVtIERlYnVnZ2VyXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FjY291bnQvYWN0aXZpdHkvI3Ryb3VibGVzaG9vdGluZy13aXRoLWl0ZW0tZGVidWdnZXIpIG9yIGNhbGwgYC9pdGVtL2dldGA7IHRoZSBgaXRlbS5zdGF0dXMudHJhbnNhY3Rpb25zLmxhc3Rfc3VjY2Vzc2Z1bF91cGRhdGVgIGZpZWxkIHdpbGwgc2hvdyB0aGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBzdWNjZXNzZnVsIHVwZGF0ZS4gVG8gZm9yY2UgUGxhaWQgdG8gY2hlY2sgZm9yIG5ldyB0cmFuc2FjdGlvbnMsIHVzZSB0aGUgYC90cmFuc2FjdGlvbnMvcmVmcmVzaGAgZW5kcG9pbnQuICBUbyBiZSBhbGVydGVkIHdoZW4gbmV3IHRyYW5zYWN0aW9ucyBhcmUgYXZhaWxhYmxlLCBsaXN0ZW4gZm9yIHRoZSBbYFNZTkNfVVBEQVRFU19BVkFJTEFCTEVgXShodHRwczovL3BsYWlkLmNvbS9kb2NzL2FwaS9wcm9kdWN0cy90cmFuc2FjdGlvbnMvI3N5bmNfdXBkYXRlc19hdmFpbGFibGUpIHdlYmhvb2suXG4gICAgICogQHN1bW1hcnkgR2V0IGluY3JlbWVudGFsIHRyYW5zYWN0aW9uIHVwZGF0ZXMgb24gYW4gSXRlbVxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zU3luY1JlcXVlc3R9IHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNhY3Rpb25zU3luYyh0cmFuc2FjdGlvbnNTeW5jUmVxdWVzdDogVHJhbnNhY3Rpb25zU3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2FjdGlvbnNTeW5jKHRyYW5zYWN0aW9uc1N5bmNSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC9iZXRhL3RyYW5zYWN0aW9ucy91c2VyX2luc2lnaHRzL3YxL2dldGAgZ2V0cyB1c2VyIGluc2lnaHRzIGZvciBjbGllbnRzIHdobyBoYXZlIGVucmljaGVkIGRhdGEgd2l0aCBgL3RyYW5zYWN0aW9ucy9lbnJpY2hgLiAgVGhlIHByb2R1Y3QgaXMgY3VycmVudGx5IGluIGJldGEuXG4gICAgICogQHN1bW1hcnkgT2J0YWluIHVzZXIgaW5zaWdodHMgYmFzZWQgb24gdHJhbnNhY3Rpb25zIHNlbnQgdGhyb3VnaCAvdHJhbnNhY3Rpb25zL2VucmljaFxuICAgICAqIEBwYXJhbSB7VHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdH0gdHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldCh0cmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0OiBUcmFuc2FjdGlvbnNVc2VySW5zaWdodHNHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNhY3Rpb25zVXNlckluc2lnaHRzR2V0KHRyYW5zYWN0aW9uc1VzZXJJbnNpZ2h0c0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9hdXRob3JpemF0aW9uL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIgYXV0aG9yaXphdGlvbi4gQSB0cmFuc2ZlciBhdXRob3JpemF0aW9uIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiB1c2VkIHRvIGNyZWF0ZSBhIHRyYW5zZmVyLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHRyYW5zZmVyIGF1dGhvcml6YXRpb25cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3R9IHRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWwodHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdDogVHJhbnNmZXJBdXRob3JpemF0aW9uQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQXV0aG9yaXphdGlvbkNhbmNlbCh0cmFuc2ZlckF1dGhvcml6YXRpb25DYW5jZWxSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvYXV0aG9yaXphdGlvbi9jcmVhdGVgIGVuZHBvaW50IHRvIGF1dGhvcml6ZSBhIHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IG11c3QgYmUgY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcgYC90cmFuc2Zlci9jcmVhdGVgLiBUaGUgdHJhbnNmZXIgYXV0aG9yaXphdGlvbiB3aWxsIGV4cGlyZSBpZiBub3QgdXNlZCBhZnRlciBvbmUgaG91ci4gKFlvdSBjYW4gY29udGFjdCB5b3VyIGFjY291bnQgbWFuYWdlciB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgYXV0aG9yaXphdGlvbiBsaWZldGltZS4pICAgVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgb3V0Y29tZXMgdG8gY2FsbGluZyB0aGlzIGVuZHBvaW50OiAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGluIHRoZSByZXNwb25zZSBpcyBgZGVjbGluZWRgLCB0aGUgcHJvcG9zZWQgdHJhbnNmZXIgaGFzIGZhaWxlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbm5vdCBwcm9jZWVkIHdpdGggdGhlIHRyYW5zZmVyLiAgICAgLSBJZiB0aGUgYGF1dGhvcml6YXRpb24uZGVjaXNpb25gIGlzIGB1c2VyX2FjdGlvbl9yZXF1aXJlZGAsIGFkZGl0aW9uYWwgdXNlciBpbnB1dCBpcyBuZWVkZWQsIHVzdWFsbHkgdG8gZml4IGEgYnJva2VuIGJhbmsgY29ubmVjdGlvbiwgYmVmb3JlIFBsYWlkIGNhbiBwcm9wZXJseSBhc3Nlc3MgdGhlIHJpc2suIFlvdSBuZWVkIHRvIGxhdW5jaCBMaW5rIGluIHVwZGF0ZSBtb2RlIHRvIGNvbXBsZXRlIHRoZSByZXF1aXJlZCB1c2VyIGFjdGlvbi4gV2hlbiBjYWxsaW5nIGAvbGluay90b2tlbi9jcmVhdGVgIHRvIGdldCBhIG5ldyBMaW5rIHRva2VuLCBpbnN0ZWFkIG9mIHByb3ZpZGluZyBgYWNjZXNzX3Rva2VuYCBpbiB0aGUgcmVxdWVzdCwgeW91IHNob3VsZCBzZXQgW2B0cmFuc2Zlci5hdXRob3JpemF0aW9uX2lkYF0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9hcGkvbGluay8jbGluay10b2tlbi1jcmVhdGUtcmVxdWVzdC10cmFuc2Zlci1hdXRob3JpemF0aW9uLWlkKSBhcyB0aGUgYGF1dGhvcml6YXRpb24uaWRgLiBBZnRlciB0aGUgTGluayBmbG93IGlzIGNvbXBsZXRlZCwgeW91IG1heSByZS1hdHRlbXB0IHRoZSBhdXRob3JpemF0aW9uLiAgICAtIElmIHRoZSBgYXV0aG9yaXphdGlvbi5kZWNpc2lvbmAgaXMgYGFwcHJvdmVkYCwgYW5kIHRoZSBgYXV0aG9yaXphdGlvbi5yYXRpb25hbGVfY29kZWAgaXMgYG51bGxgLCB0aGUgdHJhbnNmZXIgaGFzIHBhc3NlZCB0aGUgcmlzayBjaGVjayBhbmQgeW91IGNhbiBwcm9jZWVkIHRvIGNhbGwgYC90cmFuc2Zlci9jcmVhdGVgLiAgICAgIC0gSWYgdGhlIGBhdXRob3JpemF0aW9uLmRlY2lzaW9uYCBpcyBgYXBwcm92ZWRgIGFuZCB0aGUgYGF1dGhvcml6YXRpb24ucmF0aW9uYWxlX2NvZGVgIGlzIG5vbi1gbnVsbGAsIHRoZSByaXNrIGNoZWNrIGNvdWxkIG5vdCBiZSBydW46IHlvdSBtYXkgcHJvY2VlZCB3aXRoIHRoZSB0cmFuc2ZlciwgYnV0IHNob3VsZCBwZXJmb3JtIHlvdXIgb3duIHJpc2sgZXZhbHVhdGlvbi4gRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSByZXNwb25zZSBzY2hlbWEuICBJbiBQbGFpZFxcJ3MgU2FuZGJveCBlbnZpcm9ubWVudCB0aGUgZGVjaXNpb25zIHdpbGwgYmUgcmV0dXJuZWQgYXMgZm9sbG93czogICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCBgbnVsbGAgcmF0aW9uYWxlIGNvZGUsIG1ha2UgYW4gYXV0aG9yaXphdGlvbiByZXF1ZXN0IHdpdGggYW4gYGFtb3VudGAgbGVzcyB0aGFuIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBpbiB0aGUgYWNjb3VudC4gICAgLSBUbyBhcHByb3ZlIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE1BTlVBTExZX1ZFUklGSUVEX0lURU1gLCBjcmVhdGUgYW4gSXRlbSBpbiBMaW5rIHRocm91Z2ggdGhlIFtTYW1lIERheSBNaWNyby1kZXBvc2l0cyBmbG93XShodHRwczovL3BsYWlkLmNvbS9kb2NzL2F1dGgvY292ZXJhZ2UvdGVzdGluZy8jdGVzdGluZy1zYW1lLWRheS1taWNyby1kZXBvc2l0cykuICAgIC0gVG8gZ2V0IGFuIGF1dGhvcml6YXRpb24gZGVjaXNpb24gb2YgYHVzZXJfYWN0aW9uX3JlcXVpcmVkYCwgW3Jlc2V0IHRoZSBsb2dpbiBmb3IgYW4gSXRlbV0oaHR0cHM6Ly9wbGFpZC5jb20vZG9jcy9zYW5kYm94LyNpdGVtX2xvZ2luX3JlcXVpcmVkKS4gICAgLSBUbyBkZWNsaW5lIGEgdHJhbnNmZXIgd2l0aCB0aGUgcmF0aW9uYWxlIGNvZGUgYE5TRmAsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgYXV0aG9yaXphdGlvbiBgYW1vdW50YC4gU2VlIFtDcmVhdGUgU2FuZGJveCB0ZXN0IGRhdGFdKGh0dHBzOi8vcGxhaWQuY29tL2RvY3Mvc2FuZGJveC91c2VyLWN1c3RvbS8pIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjdXN0b21pemUgZGF0YSBpbiBTYW5kYm94LiAgICAtIFRvIGRlY2xpbmUgYSB0cmFuc2ZlciB3aXRoIHRoZSByYXRpb25hbGUgY29kZSBgUklTS2AsIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvbiB0aGUgYWNjb3VudCBtdXN0IGJlIGV4YWN0bHkgJDAuIFNlZSBbQ3JlYXRlIFNhbmRib3ggdGVzdCBkYXRhXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3NhbmRib3gvdXNlci1jdXN0b20vKSBmb3IgZGV0YWlscyBvbiBob3cgdG8gY3VzdG9taXplIGRhdGEgaW4gU2FuZGJveC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBhdXRob3JpemF0aW9uXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlKHRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyQXV0aG9yaXphdGlvbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckF1dGhvcml6YXRpb25DcmVhdGUodHJhbnNmZXJBdXRob3JpemF0aW9uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogKERlcHJlY2F0ZWQpIFVzZSB0aGUgYC90cmFuc2Zlci9iYWxhbmNlL2dldGAgZW5kcG9pbnQgdG8gdmlldyBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IChEZXByZWNhdGVkKSBSZXRyaWV2ZSBhIGJhbGFuY2UgaGVsZCB3aXRoIFBsYWlkXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0fSB0cmFuc2ZlckJhbGFuY2VHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJCYWxhbmNlR2V0KHRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3Q6IFRyYW5zZmVyQmFsYW5jZUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckJhbGFuY2VHZXQodHJhbnNmZXJCYWxhbmNlR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgdHJhbnNmZXIuICBBIHRyYW5zZmVyIGlzIGVsaWdpYmxlIGZvciBjYW5jZWxsYXRpb24gaWYgdGhlIGBjYW5jZWxsYWJsZWAgcHJvcGVydHkgcmV0dXJuZWQgYnkgYC90cmFuc2Zlci9nZXRgIGlzIGB0cnVlYC5cbiAgICAgKiBAc3VtbWFyeSBDYW5jZWwgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlckNhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckNhbmNlbCh0cmFuc2ZlckNhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyQ2FuY2VsKHRyYW5zZmVyQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2NhcGFiaWxpdGllcy9nZXRgIGVuZHBvaW50IHRvIGRldGVybWluZSB0aGUgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGFuIGFjY291bnQgdG8gYmUgdXNlZCB3aXRoIFRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IHdvcmtzIG9uIGFsbCBUcmFuc2Zlci1jYXBhYmxlIEl0ZW1zLCBpbmNsdWRpbmcgdGhvc2UgY3JlYXRlZCBieSBgL3RyYW5zZmVyL21pZ3JhdGVfYWNjb3VudGAuIFRvIHNpbXVsYXRlIFJUUCBlbGlnaWJpbGl0eSBpbiBTYW5kYm94LCBsb2cgaW4gdXNpbmcgdGhlIHVzZXJuYW1lIGB1c2VyX2dvb2RgIGFuZCBwYXNzd29yZCBgcGFzc19nb29kYCBhbmQgdXNlIHRoZSBmaXJzdCB0d28gY2hlY2tpbmcgYW5kIHNhdmluZ3MgYWNjb3VudHMgaW4gdGhlIFxcXCJGaXJzdCBQbGF0eXB1cyBCYW5rXFxcIiBpbnN0aXR1dGlvbiAoZW5kaW5nIGluIDAwMDAgb3IgMTExMSksIHdoaWNoIHdpbGwgcmV0dXJuIGB0cnVlYC4gQW55IG90aGVyIGFjY291bnQgd2lsbCByZXR1cm4gYGZhbHNlYC5cbiAgICAgKiBAc3VtbWFyeSBHZXQgUlRQIGVsaWdpYmlsaXR5IGluZm9ybWF0aW9uIG9mIGEgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyQ2FwYWJpbGl0aWVzR2V0UmVxdWVzdH0gdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJDYXBhYmlsaXRpZXNHZXQodHJhbnNmZXJDYXBhYmlsaXRpZXNHZXRSZXF1ZXN0OiBUcmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckNhcGFiaWxpdGllc0dldCh0cmFuc2ZlckNhcGFiaWxpdGllc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jb25maWd1cmF0aW9uL2dldGAgZW5kcG9pbnQgdG8gdmlldyB5b3VyIHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvbnMuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgY29uZmlndXJhdGlvblxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdH0gdHJhbnNmZXJDb25maWd1cmF0aW9uR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldCh0cmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0OiBUcmFuc2ZlckNvbmZpZ3VyYXRpb25HZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDb25maWd1cmF0aW9uR2V0KHRyYW5zZmVyQ29uZmlndXJhdGlvbkdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9jcmVhdGVgIGVuZHBvaW50IHRvIGluaXRpYXRlIGEgbmV3IHRyYW5zZmVyLiBUaGlzIGVuZHBvaW50IGlzIHJldHJ5YWJsZSBhbmQgaWRlbXBvdGVudDsgaWYgYSB0cmFuc2ZlciB3aXRoIHRoZSBwcm92aWRlZCBgdHJhbnNmZXJfaWRgIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCwgaXQgd2lsbCByZXR1cm4gdGhlIHRyYW5zZmVyIGRldGFpbHMgd2l0aG91dCBjcmVhdGluZyBhIG5ldyB0cmFuc2Zlci4gQSB0cmFuc2ZlciBtYXkgc3RpbGwgYmUgY3JlYXRlZCBpZiBhIDUwMCBlcnJvciBpcyByZXR1cm5lZDsgdG8gZGV0ZWN0IHRoaXMgc2NlbmFyaW8sIHVzZSBbVHJhbnNmZXIgZXZlbnRzXShodHRwczovL3BsYWlkLmNvbS9kb2NzL3RyYW5zZmVyL3JlY29uY2lsaW5nLXRyYW5zZmVycy8pLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHRyYW5zZmVyXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyQ3JlYXRlKHRyYW5zZmVyQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJDcmVhdGUodHJhbnNmZXJDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlyZC1wYXJ0eSBzZW5kZXIgY3VzdG9tZXJzIGNhbiB1c2UgYC90cmFuc2Zlci9kaWxpZ2VuY2UvZG9jdW1lbnQvdXBsb2FkYCBlbmRwb2ludCB0byB1cGxvYWQgYSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgaXRzIGVuZCBjdXN0b21lciAoaS5lLiBvcmlnaW5hdG9yKSB0byBQbGFpZC4gWW914oCZbGwgbmVlZCB0byBzZW5kIGEgcmVxdWVzdCBvZiB0eXBlIG11bHRpcGFydC9mb3JtLWRhdGEuIFlvdSBtdXN0IHByb3ZpZGUgdGhlIGBjbGllbnRfaWRgIGluIHRoZSBgUExBSUQtQ0xJRU5ULUlEYCBoZWFkZXIgYW5kIGBzZWNyZXRgIGluIHRoZSBgUExBSUQtU0VDUkVUYCBoZWFkZXIuXG4gICAgICogQHN1bW1hcnkgVXBsb2FkIHRyYW5zZmVyIGRpbGlnZW5jZSBkb2N1bWVudCBvbiBiZWhhbGYgb2YgdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWQodHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlRG9jdW1lbnRVcGxvYWRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJEaWxpZ2VuY2VEb2N1bWVudFVwbG9hZCh0cmFuc2ZlckRpbGlnZW5jZURvY3VtZW50VXBsb2FkUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2RpbGlnZW5jZS9zdWJtaXRgIGVuZHBvaW50IHRvIHN1Ym1pdCB0cmFuc2ZlciBkaWxpZ2VuY2Ugb24gYmVoYWxmIG9mIHRoZSBvcmlnaW5hdG9yIChpLmUuLCB0aGUgZW5kIGN1c3RvbWVyKS5cbiAgICAgKiBAc3VtbWFyeSBTdWJtaXQgdHJhbnNmZXIgZGlsaWdlbmNlIG9uIGJlaGFsZiBvZiB0aGUgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJEaWxpZ2VuY2VTdWJtaXRSZXF1ZXN0fSB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdCh0cmFuc2ZlckRpbGlnZW5jZVN1Ym1pdFJlcXVlc3Q6IFRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyRGlsaWdlbmNlU3VibWl0KHRyYW5zZmVyRGlsaWdlbmNlU3VibWl0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L2xpc3RgIGVuZHBvaW50IHRvIGdldCBhIGxpc3Qgb2YgdHJhbnNmZXIgZXZlbnRzIGJhc2VkIG9uIHNwZWNpZmllZCBmaWx0ZXIgY3JpdGVyaWEuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudExpc3QodHJhbnNmZXJFdmVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50TGlzdCh0cmFuc2ZlckV2ZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGAvdHJhbnNmZXIvZXZlbnQvc3luY2AgYWxsb3dzIHlvdSB0byByZXF1ZXN0IHVwIHRvIHRoZSBuZXh0IDI1IHRyYW5zZmVyIGV2ZW50cyB0aGF0IGhhcHBlbmVkIGFmdGVyIGEgc3BlY2lmaWMgYGV2ZW50X2lkYC4gVXNlIHRoZSBgL3RyYW5zZmVyL2V2ZW50L3N5bmNgIGVuZHBvaW50IHRvIGd1YXJhbnRlZSB5b3UgaGF2ZSBzZWVuIGFsbCB0cmFuc2ZlciBldmVudHMuXG4gICAgICogQHN1bW1hcnkgU3luYyB0cmFuc2ZlciBldmVudHNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyRXZlbnRTeW5jUmVxdWVzdH0gdHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJFdmVudFN5bmModHJhbnNmZXJFdmVudFN5bmNSZXF1ZXN0OiBUcmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckV2ZW50U3luYyh0cmFuc2ZlckV2ZW50U3luY1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHJhbnNmZXIgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYHRyYW5zZmVyX2lkYCBvciBgYXV0aG9yaXphdGlvbl9pZGAuIE9uZSBvZiBgdHJhbnNmZXJfaWRgIG9yIGBhdXRob3JpemF0aW9uX2lkYCBtdXN0IGJlIHBvcHVsYXRlZCBidXQgbm90IGJvdGguXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJHZXRSZXF1ZXN0fSB0cmFuc2ZlckdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckdldCh0cmFuc2ZlckdldFJlcXVlc3Q6IFRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyR2V0KHRyYW5zZmVyR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2ludGVudC9jcmVhdGVgIGVuZHBvaW50IHRvIGdlbmVyYXRlIGEgdHJhbnNmZXIgaW50ZW50IG9iamVjdCBhbmQgaW52b2tlIHRoZSBUcmFuc2ZlciBVSS5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0cmFuc2ZlciBpbnRlbnQgb2JqZWN0IHRvIGludm9rZSB0aGUgVHJhbnNmZXIgVUlcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50Q3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRDcmVhdGUodHJhbnNmZXJJbnRlbnRDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckludGVudENyZWF0ZSh0cmFuc2ZlckludGVudENyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9pbnRlbnQvZ2V0YCBlbmRwb2ludCB0byByZXRyaWV2ZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgdHJhbnNmZXIgaW50ZW50LlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYSB0cmFuc2ZlciBpbnRlbnRcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVySW50ZW50R2V0UmVxdWVzdH0gdHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJJbnRlbnRHZXQodHJhbnNmZXJJbnRlbnRHZXRSZXF1ZXN0OiBUcmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckludGVudEdldCh0cmFuc2ZlckludGVudEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGVwb3NpdGAgZW5kcG9pbnQgdG8gZGVwb3NpdCBmdW5kcyBpbnRvIFBsYWlkIExlZGdlci5cbiAgICAgKiBAc3VtbWFyeSBEZXBvc2l0IGZ1bmRzIGludG8gYSBQbGFpZCBMZWRnZXIgYmFsYW5jZVxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJEZXBvc2l0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyRGVwb3NpdCh0cmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlckRlcG9zaXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJEZXBvc2l0KHRyYW5zZmVyTGVkZ2VyRGVwb3NpdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9sZWRnZXIvZGlzdHJpYnV0ZWAgZW5kcG9pbnQgdG8gbW92ZSBhdmFpbGFibGUgYmFsYW5jZSBiZXR3ZWVuIHRoZSBsZWRnZXJzIG9mIHRoZSBwbGF0Zm9ybSBhbmQgb25lIG9mIGl0cyBvcmlnaW5hdG9ycy5cbiAgICAgKiBAc3VtbWFyeSBNb3ZlIGF2YWlsYWJsZSBiYWxhbmNlIGJldHdlZW4gdGhlIGxlZGdlcnMgb2YgdGhlIHBsYXRmb3JtIGFuZCBvbmUgb2YgaXRzIG9yaWdpbmF0b3JzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0fSB0cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlKHRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3Q6IFRyYW5zZmVyTGVkZ2VyRGlzdHJpYnV0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlckxlZGdlckRpc3RyaWJ1dGUodHJhbnNmZXJMZWRnZXJEaXN0cmlidXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL2xlZGdlci9nZXRgIGVuZHBvaW50IHRvIHZpZXcgYSBiYWxhbmNlIG9uIHRoZSBsZWRnZXIgaGVsZCB3aXRoIFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlckdldFJlcXVlc3R9IHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTGVkZ2VyR2V0KHRyYW5zZmVyTGVkZ2VyR2V0UmVxdWVzdDogVHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJMZWRnZXJHZXQodHJhbnNmZXJMZWRnZXJHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbGVkZ2VyL3dpdGhkcmF3YCBlbmRwb2ludCB0byB3aXRoZHJhdyBmdW5kcyBmcm9tIGEgUGxhaWQgTGVkZ2VyIGJhbGFuY2UuXG4gICAgICogQHN1bW1hcnkgV2l0aGRyYXcgZnVuZHMgZnJvbSBhIFBsYWlkIExlZGdlciBiYWxhbmNlXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdH0gdHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlckxlZGdlcldpdGhkcmF3KHRyYW5zZmVyTGVkZ2VyV2l0aGRyYXdSZXF1ZXN0OiBUcmFuc2ZlckxlZGdlcldpdGhkcmF3UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGVkZ2VyV2l0aGRyYXcodHJhbnNmZXJMZWRnZXJXaXRoZHJhd1JlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHRyYW5zZmVycyBhbmQgdGhlaXIgc3RhdHVzZXMuIFJlc3VsdHMgYXJlIHBhZ2luYXRlZDsgdXNlIHRoZSBgY291bnRgIGFuZCBgb2Zmc2V0YCBxdWVyeSBwYXJhbWV0ZXJzIHRvIHJldHJpZXZlIHRoZSBkZXNpcmVkIHRyYW5zZmVycy4gXG4gICAgICogQHN1bW1hcnkgTGlzdCB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyTGlzdFJlcXVlc3R9IHRyYW5zZmVyTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2Zlckxpc3QodHJhbnNmZXJMaXN0UmVxdWVzdDogVHJhbnNmZXJMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyTGlzdCh0cmFuc2Zlckxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvbWV0cmljcy9nZXRgIGVuZHBvaW50IHRvIHZpZXcgeW91ciB0cmFuc2ZlciBwcm9kdWN0IHVzYWdlIG1ldHJpY3MuXG4gICAgICogQHN1bW1hcnkgR2V0IHRyYW5zZmVyIHByb2R1Y3QgdXNhZ2UgbWV0cmljc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdH0gdHJhbnNmZXJNZXRyaWNzR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyTWV0cmljc0dldCh0cmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0OiBUcmFuc2Zlck1ldHJpY3NHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJNZXRyaWNzR2V0KHRyYW5zZmVyTWV0cmljc0dldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFzIGFuIGFsdGVybmF0aXZlIHRvIGFkZGluZyBJdGVtcyB2aWEgTGluaywgeW91IGNhbiBhbHNvIHVzZSB0aGUgYC90cmFuc2Zlci9taWdyYXRlX2FjY291bnRgIGVuZHBvaW50IHRvIG1pZ3JhdGUga25vd24gYWNjb3VudCBhbmQgcm91dGluZyBudW1iZXJzIHRvIFBsYWlkIEl0ZW1zLiBUaGlzIGVuZHBvaW50IGlzIGFsc28gcmVxdWlyZWQgd2hlbiBhZGRpbmcgYW4gSXRlbSBmb3IgdXNlIHdpdGggd2lyZSB0cmFuc2ZlcnM7IGlmIHlvdSBpbnRlbmQgdG8gY3JlYXRlIHdpcmUgdHJhbnNmZXJzIG9uIHRoaXMgYWNjb3VudCwgeW91IG11c3QgcHJvdmlkZSBgd2lyZV9yb3V0aW5nX251bWJlcmAuIE5vdGUgdGhhdCBJdGVtcyBjcmVhdGVkIGluIHRoaXMgd2F5IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIGVuZHBvaW50cyBmb3Igb3RoZXIgcHJvZHVjdHMsIHN1Y2ggYXMgYC9hY2NvdW50cy9iYWxhbmNlL2dldGAsIGFuZCBjYW4gb25seSBiZSB1c2VkIHdpdGggVHJhbnNmZXIgZW5kcG9pbnRzLiAgSWYgeW91IHJlcXVpcmUgYWNjZXNzIHRvIG90aGVyIGVuZHBvaW50cywgY3JlYXRlIHRoZSBJdGVtIHRocm91Z2ggTGluayBpbnN0ZWFkLiAgQWNjZXNzIHRvIGAvdHJhbnNmZXIvbWlncmF0ZV9hY2NvdW50YCBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0OyB0byBvYnRhaW4gYWNjZXNzLCBjb250YWN0IHlvdXIgUGxhaWQgQWNjb3VudCBNYW5hZ2VyLlxuICAgICAqIEBzdW1tYXJ5IE1pZ3JhdGUgYWNjb3VudCBpbnRvIFRyYW5zZmVyc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3R9IHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJNaWdyYXRlQWNjb3VudCh0cmFuc2Zlck1pZ3JhdGVBY2NvdW50UmVxdWVzdDogVHJhbnNmZXJNaWdyYXRlQWNjb3VudFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck1pZ3JhdGVBY2NvdW50KHRyYW5zZmVyTWlncmF0ZUFjY291bnRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIG5ldyBvcmlnaW5hdG9yIGFuZCByZXR1cm4gYW4gYG9yaWdpbmF0b3JfY2xpZW50X2lkYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBuZXcgb3JpZ2luYXRvclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9vcmlnaW5hdG9yL2Z1bmRpbmdfYWNjb3VudC91cGRhdGVgIGVuZHBvaW50IHRvIHVwZGF0ZSB0aGUgZnVuZGluZyBhY2NvdW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3JpZ2luYXRvci5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdGhlIGZ1bmRpbmcgYWNjb3VudCBhc3NvY2lhdGVkIHdpdGggdGhlIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckZ1bmRpbmdBY2NvdW50VXBkYXRlUmVxdWVzdH0gdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGUodHJhbnNmZXJPcmlnaW5hdG9yRnVuZGluZ0FjY291bnRVcGRhdGVSZXF1ZXN0OiBUcmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZSh0cmFuc2Zlck9yaWdpbmF0b3JGdW5kaW5nQWNjb3VudFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL29yaWdpbmF0b3IvZ2V0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nIHByb2Nlc3MuIFRoaXMgaW5mb3JtYXRpb24gaXMgYWxzbyBhdmFpbGFibGUgdmlhIHRoZSBUcmFuc2ZlciBwYWdlIG9uIHRoZSBQbGFpZCBkYXNoYm9hcmQuXG4gICAgICogQHN1bW1hcnkgR2V0IHN0YXR1cyBvZiBhbiBvcmlnaW5hdG9yXFwncyBvbmJvYXJkaW5nXG4gICAgICogQHBhcmFtIHtUcmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJPcmlnaW5hdG9yR2V0KHRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2Zlck9yaWdpbmF0b3JHZXQodHJhbnNmZXJPcmlnaW5hdG9yR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvb3JpZ2luYXRvci9saXN0YCBlbmRwb2ludCBnZXRzIHN0YXR1cyB1cGRhdGVzIGZvciBhbGwgb2YgeW91ciBvcmlnaW5hdG9yc1xcJyBvbmJvYXJkaW5nLiBUaGlzIGluZm9ybWF0aW9uIGlzIGFsc28gYXZhaWxhYmxlIHZpYSB0aGUgUGxhaWQgZGFzaGJvYXJkLlxuICAgICAqIEBzdW1tYXJ5IEdldCBzdGF0dXMgb2YgYWxsIG9yaWdpbmF0b3JzXFwnIG9uYm9hcmRpbmdcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0fSB0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyT3JpZ2luYXRvckxpc3QodHJhbnNmZXJPcmlnaW5hdG9yTGlzdFJlcXVlc3Q6IFRyYW5zZmVyT3JpZ2luYXRvckxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJPcmlnaW5hdG9yTGlzdCh0cmFuc2Zlck9yaWdpbmF0b3JMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vb3JpZ2luYXRvci9jcmVhdGVgIGVuZHBvaW50IGFsbG93cyBnYXRoZXJpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmF0b3Igc3BlY2lmaWMgdG8gdGhlIFNjYWxlZCBQbGF0Zm9ybSBUcmFuc2ZlciBvZmZlcmluZywgaW5jbHVkaW5nIHRoZSBvcmlnaW5hdG9yXFwncyBhZ3JlZW1lbnQgdG8gbGVnYWwgdGVybXMgcmVxdWlyZWQgYmVmb3JlIGFjY2VwdGluZyBhbnkgZnVydGhlciBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIHRoZSBvcmlnaW5hdG9yLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhbiBvcmlnaW5hdG9yIGZvciBzY2FsZWQgcGxhdGZvcm0gY3VzdG9tZXJzXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclBsYXRmb3JtT3JpZ2luYXRvckNyZWF0ZVJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlKHRyYW5zZmVyUGxhdGZvcm1PcmlnaW5hdG9yQ3JlYXRlUmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGUodHJhbnNmZXJQbGF0Zm9ybU9yaWdpbmF0b3JDcmVhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcGVyc29uL2NyZWF0ZWAgZW5kcG9pbnQgdG8gY3JlYXRlIGEgcGVyc29uIHJlY29yZCBhc3NvY2lhdGVkIHdpdGggYW4gb3JpZ2luYXRvciBhbmQgb3B0aW9uYWxseSBzdWJtaXQgcGVyc29uLXNwZWNpZmljIHJlcXVpcmVtZW50cy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSBwZXJzb24gYXNzb2NpYXRlZCB3aXRoIGFuIG9yaWdpbmF0b3JcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGUodHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUGxhdGZvcm1QZXJzb25DcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJQbGF0Zm9ybVBlcnNvbkNyZWF0ZSh0cmFuc2ZlclBsYXRmb3JtUGVyc29uQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcGxhdGZvcm0vcmVxdWlyZW1lbnQvc3VibWl0YCBlbmRwb2ludCBhbGxvd3MgcGxhdGZvcm1zIHRvIHN1Ym1pdCBvbmJvYXJkaW5nIHJlcXVpcmVtZW50cyBmb3IgYW4gb3JpZ2luYXRvciBhcyBwYXJ0IG9mIHRoZSBTY2FsZWQgUGxhdGZvcm0gVHJhbnNmZXIgb2ZmZXJpbmcuXG4gICAgICogQHN1bW1hcnkgU3VibWl0IG9uYm9hcmRpbmcgcmVxdWlyZW1lbnRzIGZvciBTY2FsZWQgUGxhdGZvcm0gb3JpZ2luYXRvcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3R9IHRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXQodHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdDogVHJhbnNmZXJQbGF0Zm9ybVJlcXVpcmVtZW50U3VibWl0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUGxhdGZvcm1SZXF1aXJlbWVudFN1Ym1pdCh0cmFuc2ZlclBsYXRmb3JtUmVxdWlyZW1lbnRTdWJtaXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9xdWVzdGlvbm5haXJlL2NyZWF0ZWAgZW5kcG9pbnQgZ2VuZXJhdGVzIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLiBSZWRpcmVjdCB0aGUgb3JpZ2luYXRvciB0byB0aGlzIFVSTCB0byBwcm92aWRlIHRoZWlyIGR1ZSBkaWxpZ2VuY2UgaW5mb3JtYXRpb24gYW5kIGFncmVlIHRvIFBsYWlk4oCZcyB0ZXJtcyBmb3IgQUNIIG1vbmV5IG1vdmVtZW50LlxuICAgICAqIEBzdW1tYXJ5IEdlbmVyYXRlIGEgUGxhaWQtaG9zdGVkIG9uYm9hcmRpbmcgVUkgVVJMLlxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZSh0cmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclF1ZXN0aW9ubmFpcmVDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJRdWVzdGlvbm5haXJlQ3JlYXRlKHRyYW5zZmVyUXVlc3Rpb25uYWlyZUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY2FuY2VsYCBlbmRwb2ludCB0byBjYW5jZWwgYSByZWN1cnJpbmcgdHJhbnNmZXIuICBTY2hlZHVsZWQgdHJhbnNmZXIgdGhhdCBoYXNuXFwndCBiZWVuIHN1Ym1pdHRlZCB0byBiYW5rIHdpbGwgYmUgY2FuY2VsbGVkLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlY3VycmluZyB0cmFuc2Zlci5cbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ2FuY2VsUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdDYW5jZWwodHJhbnNmZXJSZWN1cnJpbmdDYW5jZWxSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0NhbmNlbCh0cmFuc2ZlclJlY3VycmluZ0NhbmNlbFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVzZSB0aGUgYC90cmFuc2Zlci9yZWN1cnJpbmcvY3JlYXRlYCBlbmRwb2ludCB0byBpbml0aWF0ZSBhIG5ldyByZWN1cnJpbmcgdHJhbnNmZXIuIFRoaXMgY2FwYWJpbGl0eSBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgVHJhbnNmZXIgVUkgb3IgUGxhdGZvcm0gUGF5bWVudHMgKGJldGEpIGN1c3RvbWVycy5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSByZWN1cnJpbmcgdHJhbnNmZXJcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nQ3JlYXRlUmVxdWVzdH0gdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJSZWN1cnJpbmdDcmVhdGUodHJhbnNmZXJSZWN1cnJpbmdDcmVhdGVSZXF1ZXN0OiBUcmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclJlY3VycmluZ0NyZWF0ZSh0cmFuc2ZlclJlY3VycmluZ0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9nZXRgIGZldGNoZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlY3VycmluZyB0cmFuc2ZlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBgcmVjdXJyaW5nX3RyYW5zZmVyX2lkYC5cbiAgICAgKiBAc3VtbWFyeSBSZXRyaWV2ZSBhIHJlY3VycmluZyB0cmFuc2ZlclxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWN1cnJpbmdHZXRSZXF1ZXN0fSB0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0dldCh0cmFuc2ZlclJlY3VycmluZ0dldFJlcXVlc3Q6IFRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nR2V0KHRyYW5zZmVyUmVjdXJyaW5nR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlY3VycmluZy9saXN0YCBlbmRwb2ludCB0byBzZWUgYSBsaXN0IG9mIGFsbCB5b3VyIHJlY3VycmluZyB0cmFuc2ZlcnMgYW5kIHRoZWlyIHN0YXR1c2VzLiBSZXN1bHRzIGFyZSBwYWdpbmF0ZWQ7IHVzZSB0aGUgYGNvdW50YCBhbmQgYG9mZnNldGAgcXVlcnkgcGFyYW1ldGVycyB0byByZXRyaWV2ZSB0aGUgZGVzaXJlZCByZWN1cnJpbmcgdHJhbnNmZXJzLiBcbiAgICAgKiBAc3VtbWFyeSBMaXN0IHJlY3VycmluZyB0cmFuc2ZlcnNcbiAgICAgKiBAcGFyYW0ge1RyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3R9IHRyYW5zZmVyUmVjdXJyaW5nTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlY3VycmluZ0xpc3QodHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdDogVHJhbnNmZXJSZWN1cnJpbmdMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVjdXJyaW5nTGlzdCh0cmFuc2ZlclJlY3VycmluZ0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVc2UgdGhlIGAvdHJhbnNmZXIvcmVmdW5kL2NhbmNlbGAgZW5kcG9pbnQgdG8gY2FuY2VsIGEgcmVmdW5kLiAgQSByZWZ1bmQgaXMgZWxpZ2libGUgZm9yIGNhbmNlbGxhdGlvbiBpZiBpdCBoYXMgbm90IHlldCBiZWVuIHN1Ym1pdHRlZCB0byB0aGUgcGF5bWVudCBuZXR3b3JrLlxuICAgICAqIEBzdW1tYXJ5IENhbmNlbCBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDYW5jZWxSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZENhbmNlbCh0cmFuc2ZlclJlZnVuZENhbmNlbFJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kQ2FuY2VsKHRyYW5zZmVyUmVmdW5kQ2FuY2VsUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXNlIHRoZSBgL3RyYW5zZmVyL3JlZnVuZC9jcmVhdGVgIGVuZHBvaW50IHRvIGNyZWF0ZSBhIHJlZnVuZCBmb3IgYSB0cmFuc2Zlci4gQSB0cmFuc2ZlciBjYW4gYmUgcmVmdW5kZWQgaWYgdGhlIHRyYW5zZmVyIHdhcyBpbml0aWF0ZWQgaW4gdGhlIHBhc3QgMTgwIGRheXMuICBSZWZ1bmRzIGNvbWUgb3V0IG9mIHRoZSBhdmFpbGFibGUgYmFsYW5jZSBvZiB0aGUgbGVkZ2VyIHVzZWQgZm9yIHRoZSBvcmlnaW5hbCBkZWJpdCB0cmFuc2Zlci4gSWYgdGhlcmUgYXJlIG5vdCBlbm91Z2ggZnVuZHMgaW4gdGhlIGF2YWlsYWJsZSBiYWxhbmNlIHRvIGNvdmVyIHRoZSByZWZ1bmQgYW1vdW50LCB0aGUgcmVmdW5kIHdpbGwgYmUgcmVqZWN0ZWQuIFlvdSBjYW4gY3JlYXRlIGEgcmVmdW5kIGF0IGFueSB0aW1lLiBQbGFpZCBkb2VzIG5vdCBpbXBvc2UgYW55IGhvbGQgdGltZSBvbiByZWZ1bmRzLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJlZnVuZFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZWZ1bmRDcmVhdGVSZXF1ZXN0fSB0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclJlZnVuZENyZWF0ZSh0cmFuc2ZlclJlZnVuZENyZWF0ZVJlcXVlc3Q6IFRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyUmVmdW5kQ3JlYXRlKHRyYW5zZmVyUmVmdW5kQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlIGAvdHJhbnNmZXIvcmVmdW5kL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVmdW5kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGByZWZ1bmRfaWRgLlxuICAgICAqIEBzdW1tYXJ5IFJldHJpZXZlIGEgcmVmdW5kXG4gICAgICogQHBhcmFtIHtUcmFuc2ZlclJlZnVuZEdldFJlcXVlc3R9IHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVmdW5kR2V0KHRyYW5zZmVyUmVmdW5kR2V0UmVxdWVzdDogVHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZWZ1bmRHZXQodHJhbnNmZXJSZWZ1bmRHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9yZXBheW1lbnQvbGlzdGAgZW5kcG9pbnQgZmV0Y2hlcyByZXBheW1lbnRzIG1hdGNoaW5nIHRoZSBnaXZlbiBmaWx0ZXJzLiBSZXBheW1lbnRzIGFyZSByZXR1cm5lZCBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIgKG1vc3QgcmVjZW50IGZpcnN0KSBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gYHN0YXJ0X3RpbWVgLlxuICAgICAqIEBzdW1tYXJ5IExpc3RzIGhpc3RvcmljYWwgcmVwYXltZW50c1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVwYXltZW50TGlzdCh0cmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZXBheW1lbnRMaXN0KHRyYW5zZmVyUmVwYXltZW50TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3JlcGF5bWVudC9yZXR1cm4vbGlzdGAgZW5kcG9pbnQgcmV0cmlldmVzIHRoZSBzZXQgb2YgcmV0dXJucyB0aGF0IHdlcmUgYmF0Y2hlZCB0b2dldGhlciBpbnRvIHRoZSBzcGVjaWZpZWQgcmVwYXltZW50LiBUaGUgc3VtIG9mIGFtb3VudHMgb2YgcmV0dXJucyByZXRyaWV2ZWQgYnkgdGhpcyByZXF1ZXN0IGVxdWFscyB0aGUgYW1vdW50IG9mIHRoZSByZXBheW1lbnQuXG4gICAgICogQHN1bW1hcnkgTGlzdCB0aGUgcmV0dXJucyBpbmNsdWRlZCBpbiBhIHJlcGF5bWVudFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdH0gdHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdCh0cmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0OiBUcmFuc2ZlclJlcGF5bWVudFJldHVybkxpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikudHJhbnNmZXJSZXBheW1lbnRSZXR1cm5MaXN0KHRyYW5zZmVyUmVwYXltZW50UmV0dXJuTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBgL3RyYW5zZmVyL3N3ZWVwL2dldGAgZW5kcG9pbnQgZmV0Y2hlcyBhIHN3ZWVwIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGBzd2VlcF9pZGAuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYSBzd2VlcFxuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcEdldFJlcXVlc3R9IHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdHJhbnNmZXJTd2VlcEdldCh0cmFuc2ZlclN3ZWVwR2V0UmVxdWVzdDogVHJhbnNmZXJTd2VlcEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS50cmFuc2ZlclN3ZWVwR2V0KHRyYW5zZmVyU3dlZXBHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgYC90cmFuc2Zlci9zd2VlcC9saXN0YCBlbmRwb2ludCBmZXRjaGVzIHN3ZWVwcyBtYXRjaGluZyB0aGUgZ2l2ZW4gZmlsdGVycy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IHN3ZWVwc1xuICAgICAqIEBwYXJhbSB7VHJhbnNmZXJTd2VlcExpc3RSZXF1ZXN0fSB0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB0cmFuc2ZlclN3ZWVwTGlzdCh0cmFuc2ZlclN3ZWVwTGlzdFJlcXVlc3Q6IFRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnRyYW5zZmVyU3dlZXBMaXN0KHRyYW5zZmVyU3dlZXBMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB1c2VyIHBlcm1pc3Npb25lZCBhY2NvdW50IGRhdGEgaW5jbHVkaW5nIGlkZW50aXR5IGFuZCBJdGVtIGFjY2VzcyB0b2tlbnMuXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgVXNlciBBY2NvdW50XG4gICAgICogQHBhcmFtIHtVc2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0fSB1c2VyQWNjb3VudFNlc3Npb25HZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlckFjY291bnRTZXNzaW9uR2V0KHVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3Q6IFVzZXJBY2NvdW50U2Vzc2lvbkdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyQWNjb3VudFNlc3Npb25HZXQodXNlckFjY291bnRTZXNzaW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBzaG91bGQgYmUgY2FsbGVkIGZvciBlYWNoIG9mIHlvdXIgZW5kIHVzZXJzIGJlZm9yZSB0aGV5IGJlZ2luIGEgUGxhaWQgQ2hlY2sgb3IgSW5jb21lIGZsb3csIG9yIGEgTXVsdGktSXRlbSBMaW5rIGZsb3cuIFRoaXMgcHJvdmlkZXMgeW91IGEgc2luZ2xlIHRva2VuIHRvIGFjY2VzcyBhbGwgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHVzZXIuIFlvdSBzaG91bGQgb25seSBjcmVhdGUgb25lIHBlciBlbmQgdXNlci4gIFRoZSBgY29uc3VtZXJfcmVwb3J0X3VzZXJfaWRlbnRpdHlgIG9iamVjdCBtdXN0IGJlIHByZXNlbnQgaW4gb3JkZXIgdG8gY3JlYXRlIGEgUGxhaWQgQ2hlY2sgQ29uc3VtZXIgUmVwb3J0IGZvciBhIHVzZXIuIElmIGl0IGlzIG5vdCBwcm92aWRlZCBkdXJpbmcgdGhlIGAvdXNlci9jcmVhdGVgIGNhbGwsIGl0IGNhbiBiZSBhZGRlZCBsYXRlciBieSBjYWxsaW5nIGAvdXNlci91cGRhdGVgLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC4gIElmIHlvdSBjYWxsIHRoZSBlbmRwb2ludCBtdWx0aXBsZSB0aW1lcyB3aXRoIHRoZSBzYW1lIGBjbGllbnRfdXNlcl9pZGAsIHRoZSBmaXJzdCBjcmVhdGlvbiBjYWxsIHdpbGwgc3VjY2VlZCBhbmQgdGhlIHJlc3Qgd2lsbCBmYWlsIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaGFzIGJlZW4gY3JlYXRlZCBmb3IgdGhlIGdpdmVuIGBjbGllbnRfdXNlcl9pZGAuICBFbnN1cmUgdGhhdCB5b3Ugc3RvcmUgdGhlIGB1c2VyX3Rva2VuYCBhbG9uZyB3aXRoIHlvdXIgdXNlclxcJ3MgaWRlbnRpZmllciBpbiB5b3VyIGRhdGFiYXNlLCBhcyBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgYHVzZXJfdG9rZW5gLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSB1c2VyXG4gICAgICogQHBhcmFtIHtVc2VyQ3JlYXRlUmVxdWVzdH0gdXNlckNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyQ3JlYXRlKHVzZXJDcmVhdGVSZXF1ZXN0OiBVc2VyQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJDcmVhdGUodXNlckNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIGEgVXNlciBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgc3RhdHVzZXMuXG4gICAgICogQHN1bW1hcnkgR2V0IEl0ZW1zIGFzc29jaWF0ZWQgd2l0aCBhIFVzZXJcbiAgICAgKiBAcGFyYW0ge1VzZXJJdGVtc0dldFJlcXVlc3R9IHVzZXJJdGVtc0dldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VySXRlbXNHZXQodXNlckl0ZW1zR2V0UmVxdWVzdDogVXNlckl0ZW1zR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJJdGVtc0dldCh1c2VySXRlbXNHZXRSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBgL3VzZXIvcmVtb3ZlYCBkZWxldGVzIGEgdXNlciB0b2tlbiBhbmQgYW5kIGFzc29jaWF0ZWQgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBhbnkgSXRlbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0b2tlbi4gIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdXNlciBkb2VzIG5vdCBleGlzdC5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgdXNlclxuICAgICAqIEBwYXJhbSB7VXNlclJlbW92ZVJlcXVlc3R9IHVzZXJSZW1vdmVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclJlbW92ZSh1c2VyUmVtb3ZlUmVxdWVzdDogVXNlclJlbW92ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyUmVtb3ZlKHVzZXJSZW1vdmVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGVuZHBvaW50IGlzIHVzZWQgdG8gY3JlYXRlIGEgdGhpcmQtcGFydHkgdXNlciB0b2tlbi4gVGhpcyB0b2tlbiBjYW4gYmUgc2hhcmVkIHdpdGggYW5kIHVzZWQgYnkgYSBzcGVjaWZpZWQgdGhpcmQtcGFydHkgY2xpZW50IHRvIGFjY2VzcyBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGUgdXNlciB0aHJvdWdoIHN1cHBvcnRlZCBlbmRwb2ludHMuICBFbnN1cmUgeW91IHN0b3JlIHRoZSBgdGhpcmRfcGFydHlfdXNlcl90b2tlbmAgYWxvbmcgd2l0aCB0aGUgYHVzZXJfdG9rZW5gIGFuZCBgdGhpcmRfcGFydHlfY2xpZW50X2lkYCwgYXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJldHJpZXZlIGEgcHJldmlvdXNseSBjcmVhdGVkIGB0aGlyZF9wYXJ0eV91c2VyX3Rva2VuYC5cbiAgICAgKiBAc3VtbWFyeSBDcmVhdGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlKHVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJUaGlyZFBhcnR5VG9rZW5DcmVhdGUodXNlclRoaXJkUGFydHlUb2tlbkNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byBkZWxldGUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuLiBPbmNlIHJlbW92ZWQsIHRoZSB0b2tlbiBjYW4gbG9uZ2VyIGJlIHVzZWQgdG8gYWNjZXNzIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB1c2VyLiAgIEFueSBzdWJzZXF1ZW50IGNhbGxzIHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIHVzaW5nIHRoZSBzYW1lIHRoaXJkLXBhcnR5IHVzZXIgdG9rZW4gd2lsbCByZXN1bHQgaW4gYW4gZXJyb3Igc3RhdGluZyB0aGUgdGhpcmQtcGFydHkgdXNlciB0b2tlbiBkb2VzIG5vdCBleGlzdC5cbiAgICAgKiBAc3VtbWFyeSBSZW1vdmUgYSB0aGlyZC1wYXJ0eSB1c2VyIHRva2VuXG4gICAgICogQHBhcmFtIHtVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdH0gdXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB1c2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlKHVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmVSZXF1ZXN0OiBVc2VyVGhpcmRQYXJ0eVRva2VuUmVtb3ZlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLnVzZXJUaGlyZFBhcnR5VG9rZW5SZW1vdmUodXNlclRoaXJkUGFydHlUb2tlblJlbW92ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZW5kcG9pbnQgaXMgdXNlZCB0byB1cGRhdGUgdXNlciBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggYW4gZXhpc3RpbmcgYHVzZXJfdG9rZW5gLiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGVuYWJsZSBhbiBleGlzdGluZyBgdXNlcl90b2tlbmAgZm9yIHVzZSB3aXRoIENvbnN1bWVyIFJlcG9ydHMgYnkgUGxhaWQgQ2hlY2ssIGJ5IGFkZGluZyBhIGBjb25zdW1lcl9yZXBvcnRfdXNlcl9pZGVudGl0eWAgb2JqZWN0IHRvIHRoZSB1c2VyLiBQbGFpZCBDaGVjayBDb25zdW1lciBSZXBvcnRzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgZm9yIFVTLWJhc2VkIHVzZXJzOyB0aGUgdXNlclxcJ3MgYWRkcmVzcyBjb3VudHJ5IG11c3QgYmUgYFVTYC5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgdXNlciBpbmZvcm1hdGlvblxuICAgICAqIEBwYXJhbSB7VXNlclVwZGF0ZVJlcXVlc3R9IHVzZXJVcGRhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgdXNlclVwZGF0ZSh1c2VyVXBkYXRlUmVxdWVzdDogVXNlclVwZGF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS51c2VyVXBkYXRlKHVzZXJVcGRhdGVSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpcyB0aGUgbmV3bHkgY3JlYXRlZCBlLXdhbGxldCBvYmplY3QuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRDcmVhdGVSZXF1ZXN0fSB3YWxsZXRDcmVhdGVSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0Q3JlYXRlKHdhbGxldENyZWF0ZVJlcXVlc3Q6IFdhbGxldENyZWF0ZVJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRDcmVhdGUod2FsbGV0Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmV0Y2ggYW4gZS13YWxsZXQuIFRoZSByZXNwb25zZSBpbmNsdWRlcyB0aGUgY3VycmVudCBiYWxhbmNlLlxuICAgICAqIEBzdW1tYXJ5IEZldGNoIGFuIGUtd2FsbGV0XG4gICAgICogQHBhcmFtIHtXYWxsZXRHZXRSZXF1ZXN0fSB3YWxsZXRHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0R2V0KHdhbGxldEdldFJlcXVlc3Q6IFdhbGxldEdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRHZXQod2FsbGV0R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyBhbGwgZS13YWxsZXRzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY3JlYXRpb24uXG4gICAgICogQHN1bW1hcnkgRmV0Y2ggYSBsaXN0IG9mIGUtd2FsbGV0c1xuICAgICAqIEBwYXJhbSB7V2FsbGV0TGlzdFJlcXVlc3R9IHdhbGxldExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0TGlzdCh3YWxsZXRMaXN0UmVxdWVzdDogV2FsbGV0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRMaXN0KHdhbGxldExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGEgdHJhbnNhY3Rpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBlLXdhbGxldC4gU3BlY2lmeSB0aGUgZS13YWxsZXQgdG8gZGViaXQgZnJvbSwgdGhlIGNvdW50ZXJwYXJ0eSB0byBjcmVkaXQgdG8sIHRoZSBpZGVtcG90ZW5jeSBrZXkgdG8gcHJldmVudCBkdXBsaWNhdGUgdHJhbnNhY3Rpb25zLCB0aGUgYW1vdW50IGFuZCByZWZlcmVuY2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4gVHJhbnNhY3Rpb25zIHdpbGwgc2V0dGxlIGluIHNlY29uZHMgdG8gc2V2ZXJhbCBkYXlzLCBkZXBlbmRpbmcgb24gdGhlIHVuZGVybHlpbmcgcGF5bWVudCByYWlsLlxuICAgICAqIEBzdW1tYXJ5IEV4ZWN1dGUgYSB0cmFuc2FjdGlvbiB1c2luZyBhbiBlLXdhbGxldFxuICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdH0gd2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZSh3YWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0OiBXYWxsZXRUcmFuc2FjdGlvbkV4ZWN1dGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2FsbGV0VHJhbnNhY3Rpb25FeGVjdXRlKHdhbGxldFRyYW5zYWN0aW9uRXhlY3V0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZldGNoIGEgc3BlY2lmaWMgZS13YWxsZXQgdHJhbnNhY3Rpb25cbiAgICAgKiBAc3VtbWFyeSBGZXRjaCBhbiBlLXdhbGxldCB0cmFuc2FjdGlvblxuICAgICAqIEBwYXJhbSB7V2FsbGV0VHJhbnNhY3Rpb25HZXRSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YWxsZXRUcmFuc2FjdGlvbkdldCh3YWxsZXRUcmFuc2FjdGlvbkdldFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhbGxldFRyYW5zYWN0aW9uR2V0KHdhbGxldFRyYW5zYWN0aW9uR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBlbmRwb2ludCBsaXN0cyB0aGUgbGF0ZXN0IHRyYW5zYWN0aW9ucyBvZiB0aGUgc3BlY2lmaWVkIGUtd2FsbGV0LiBUcmFuc2FjdGlvbnMgYXJlIHJldHVybmVkIGluIGRlc2NlbmRpbmcgb3JkZXIgYnkgdGhlIGBjcmVhdGVkX2F0YCB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgZS13YWxsZXQgdHJhbnNhY3Rpb25zXG4gICAgICogQHBhcmFtIHtXYWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0fSB3YWxsZXRUcmFuc2FjdGlvbkxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2FsbGV0VHJhbnNhY3Rpb25MaXN0KHdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3Q6IFdhbGxldFRyYW5zYWN0aW9uTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YWxsZXRUcmFuc2FjdGlvbkxpc3Qod2FsbGV0VHJhbnNhY3Rpb25MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgZW50aXR5IHdhdGNobGlzdCBwcm9ncmFtLiBJZiB5b3VyIGFzc29jaWF0ZWQgcHJvZ3JhbSBoYXMgb25nb2luZyBzY3JlZW5pbmcgZW5hYmxlZCwgdGhpcyBpcyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBtb25pdG9yIHlvdXIgY3VzdG9tZXIgb3ZlciB0aW1lLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHdhdGNobGlzdCBzY3JlZW5pbmcgZm9yIGFuIGVudGl0eVxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUNyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHJpZXZlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IEdldCBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXRSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUdldFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlHZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgY2hhbmdlcyB0byB0aGUgZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgaW4gcmV2ZXJzZS1jaHJvbm9sb2dpY2FsIG9yZGVyLiBJZiB0aGUgd2F0Y2hsaXN0IHNjcmVlbmluZyBoYXMgbm90IGJlZW4gZWRpdGVkLCBubyBoaXN0b3J5IHdpbGwgYmUgcmV0dXJuZWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCBoaXN0b3J5IGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpc3RvcnlMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGlzdG9yeUxpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXN0b3J5TGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGhpdHMgZm9yIHRoZSBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpdHMgZm9yIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5SGl0TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBlbnRpdHkgc2NyZWVuaW5ncy5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5TGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgYW4gZW50aXR5IHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBzdW1tYXJ5IEdldCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1HZXQod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHN1bW1hcnkgTGlzdCBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZyBwcm9ncmFtc1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UHJvZ3JhbUxpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlQcm9ncmFtTGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0KHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgcmV2aWV3IGZvciBhbiBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ1xuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIGEgcGFydGljdWxhciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZy4gUmV2aWV3cyBhcmUgY29tcGxpYW5jZSByZXBvcnRzIGNyZWF0ZWQgYnkgdXNlcnMgaW4geW91ciBvcmdhbml6YXRpb24gcmVnYXJkaW5nIHRoZSByZWxldmFuY2Ugb2YgcG90ZW50aWFsIGhpdHMgZm91bmQgYnkgUGxhaWQuXG4gICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBlbnRpdHkgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5UmV2aWV3TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlSZXZpZXdMaXN0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIGFuIGVudGl0eSB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IFVwZGF0ZSBhbiBlbnRpdHkgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0IFRoZSBlbnRpdHkgc2NyZWVuaW5nIHdhcyBzdWNjZXNzZnVsbHkgdXBkYXRlZC5cbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdFbnRpdHlVcGRhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nRW50aXR5VXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0VudGl0eVVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBXYXRjaGxpc3QgU2NyZWVuaW5nIHRvIGNoZWNrIHlvdXIgY3VzdG9tZXIgYWdhaW5zdCB3YXRjaGxpc3RzIGRlZmluZWQgaW4gdGhlIGFzc29jaWF0ZWQgV2F0Y2hsaXN0IFByb2dyYW0uIElmIHlvdXIgYXNzb2NpYXRlZCBwcm9ncmFtIGhhcyBvbmdvaW5nIHNjcmVlbmluZyBlbmFibGVkLCB0aGlzIGlzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIHRvIG1vbml0b3IgeW91ciBjdXN0b21lciBvdmVyIHRpbWUuXG4gICAgICogQHN1bW1hcnkgQ3JlYXRlIGEgd2F0Y2hsaXN0IHNjcmVlbmluZyBmb3IgYSBwZXJzb25cbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZVJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxDcmVhdGVSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbENyZWF0ZSh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsQ3JlYXRlUmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHN1bW1hcnkgUmV0cmlldmUgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXRSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxHZXQod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEdldFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIGNoYW5nZXMgdG8gdGhlIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZyBpbiByZXZlcnNlLWNocm9ub2xvZ2ljYWwgb3JkZXIuIElmIHRoZSB3YXRjaGxpc3Qgc2NyZWVuaW5nIGhhcyBub3QgYmVlbiBlZGl0ZWQsIG5vIGhpc3Rvcnkgd2lsbCBiZSByZXR1cm5lZC5cbiAgICAgKiBAc3VtbWFyeSBMaXN0IGhpc3RvcnkgZm9yIGluZGl2aWR1YWwgd2F0Y2hsaXN0IHNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpc3RvcnlMaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXN0b3J5TGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGlzdG9yeUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IGFsbCBoaXRzIGZvdW5kIGJ5IFBsYWlkIGZvciBhIHBhcnRpY3VsYXIgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nLlxuICAgICAqIEBzdW1tYXJ5IExpc3QgaGl0cyBmb3IgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsSGl0TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxIaXRMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbEhpdExpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMaXN0IHByZXZpb3VzbHkgY3JlYXRlZCB3YXRjaGxpc3Qgc2NyZWVuaW5ncyBmb3IgaW5kaXZpZHVhbHNcbiAgICAgKiBAc3VtbWFyeSBMaXN0IEluZGl2aWR1YWwgV2F0Y2hsaXN0IFNjcmVlbmluZ3NcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxMaXN0UmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0IFxuICAgICAqIEBwYXJhbSB7Kn0gW29wdGlvbnNdIE92ZXJyaWRlIGh0dHAgcmVxdWVzdCBvcHRpb24uXG4gICAgICogQHRocm93cyB7UmVxdWlyZWRFcnJvcn1cbiAgICAgKiBAbWVtYmVyb2YgUGxhaWRBcGlcbiAgICAgKi9cbiAgICBwdWJsaWMgd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbExpc3RSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnM/OiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIFBsYWlkQXBpRnAodGhpcy5jb25maWd1cmF0aW9uKS53YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsTGlzdFJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhbiBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBzdW1tYXJ5IEdldCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbVxuICAgICAqIEBwYXJhbSB7V2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1HZXRSZXF1ZXN0fSB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUdldFJlcXVlc3Q6IFdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtR2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTGlzdCBhbGwgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nIHByb2dyYW1zXG4gICAgICogQHN1bW1hcnkgTGlzdCBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcgcHJvZ3JhbXNcbiAgICAgKiBAcGFyYW0ge1dhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdFJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFByb2dyYW1MaXN0UmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxQcm9ncmFtTGlzdCh3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUHJvZ3JhbUxpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSByZXZpZXcgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFJldmlld3MgYXJlIGNvbXBsaWFuY2UgcmVwb3J0cyBjcmVhdGVkIGJ5IHVzZXJzIGluIHlvdXIgb3JnYW5pemF0aW9uIHJlZ2FyZGluZyB0aGUgcmVsZXZhbmNlIG9mIHBvdGVudGlhbCBoaXRzIGZvdW5kIGJ5IFBsYWlkLlxuICAgICAqIEBzdW1tYXJ5IENyZWF0ZSBhIHJldmlldyBmb3IgYW4gaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3Q3JlYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdDcmVhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0NyZWF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIExpc3QgYWxsIHJldmlld3MgZm9yIHRoZSBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuXG4gICAgICogQHN1bW1hcnkgTGlzdCByZXZpZXdzIGZvciBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmdzXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsUmV2aWV3TGlzdFJlcXVlc3R9IHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0KHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxSZXZpZXdMaXN0UmVxdWVzdDogV2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3Qod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFJldmlld0xpc3RSZXF1ZXN0LCBvcHRpb25zKS50aGVuKChyZXF1ZXN0KSA9PiByZXF1ZXN0KHRoaXMuYXhpb3MsIHRoaXMuYmFzZVBhdGgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYSBzcGVjaWZpYyBpbmRpdmlkdWFsIHdhdGNobGlzdCBzY3JlZW5pbmcuIFRoaXMgZW5kcG9pbnQgY2FuIGJlIHVzZWQgdG8gYWRkIGFkZGl0aW9uYWwgY3VzdG9tZXIgaW5mb3JtYXRpb24sIGNvcnJlY3Qgb3V0ZGF0ZWQgaW5mb3JtYXRpb24sIGFkZCBhIHJlZmVyZW5jZSBpZCwgYXNzaWduIHRoZSBpbmRpdmlkdWFsIHRvIGEgcmV2aWV3ZXIsIGFuZCB1cGRhdGUgd2hpY2ggcHJvZ3JhbSBpdCBpcyBhc3NvY2lhdGVkIHdpdGguIFBsZWFzZSBub3RlIHRoYXQgeW91IG1heSBub3QgdXBkYXRlIGBzZWFyY2hfdGVybXNgIGFuZCBgc3RhdHVzYCBhdCB0aGUgc2FtZSB0aW1lIHNpbmNlIGVkaXRpbmcgYHNlYXJjaF90ZXJtc2AgbWF5IHRyaWdnZXIgYW4gYXV0b21hdGljIGBzdGF0dXNgIGNoYW5nZS5cbiAgICAgKiBAc3VtbWFyeSBVcGRhdGUgaW5kaXZpZHVhbCB3YXRjaGxpc3Qgc2NyZWVuaW5nXG4gICAgICogQHBhcmFtIHtXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdH0gd2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QgXG4gICAgICogQHBhcmFtIHsqfSBbb3B0aW9uc10gT3ZlcnJpZGUgaHR0cCByZXF1ZXN0IG9wdGlvbi5cbiAgICAgKiBAdGhyb3dzIHtSZXF1aXJlZEVycm9yfVxuICAgICAqIEBtZW1iZXJvZiBQbGFpZEFwaVxuICAgICAqL1xuICAgIHB1YmxpYyB3YXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlKHdhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGVSZXF1ZXN0OiBXYXRjaGxpc3RTY3JlZW5pbmdJbmRpdmlkdWFsVXBkYXRlUmVxdWVzdCwgb3B0aW9ucz86IGFueSkge1xuICAgICAgICByZXR1cm4gUGxhaWRBcGlGcCh0aGlzLmNvbmZpZ3VyYXRpb24pLndhdGNobGlzdFNjcmVlbmluZ0luZGl2aWR1YWxVcGRhdGUod2F0Y2hsaXN0U2NyZWVuaW5nSW5kaXZpZHVhbFVwZGF0ZVJlcXVlc3QsIG9wdGlvbnMpLnRoZW4oKHJlcXVlc3QpID0+IHJlcXVlc3QodGhpcy5heGlvcywgdGhpcy5iYXNlUGF0aCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBsYWlkIHNpZ25zIGFsbCBvdXRnb2luZyB3ZWJob29rcyBhbmQgcHJvdmlkZXMgSlNPTiBXZWIgVG9rZW5zIChKV1RzKSBzbyB0aGF0IHlvdSBjYW4gdmVyaWZ5IHRoZSBhdXRoZW50aWNpdHkgb2YgYW55IGluY29taW5nIHdlYmhvb2tzIHRvIHlvdXIgYXBwbGljYXRpb24uIEEgbWVzc2FnZSBzaWduYXR1cmUgaXMgaW5jbHVkZWQgaW4gdGhlIGBQbGFpZC1WZXJpZmljYXRpb25gIGhlYWRlci4gIFRoZSBgL3dlYmhvb2tfdmVyaWZpY2F0aW9uX2tleS9nZXRgIGVuZHBvaW50IHByb3ZpZGVzIGEgSlNPTiBXZWIgS2V5IChKV0spIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGEgSldULlxuICAgICAqIEBzdW1tYXJ5IEdldCB3ZWJob29rIHZlcmlmaWNhdGlvbiBrZXlcbiAgICAgKiBAcGFyYW0ge1dlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0fSB3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCBcbiAgICAgKiBAcGFyYW0geyp9IFtvcHRpb25zXSBPdmVycmlkZSBodHRwIHJlcXVlc3Qgb3B0aW9uLlxuICAgICAqIEB0aHJvd3Mge1JlcXVpcmVkRXJyb3J9XG4gICAgICogQG1lbWJlcm9mIFBsYWlkQXBpXG4gICAgICovXG4gICAgcHVibGljIHdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXQod2ViaG9va1ZlcmlmaWNhdGlvbktleUdldFJlcXVlc3Q6IFdlYmhvb2tWZXJpZmljYXRpb25LZXlHZXRSZXF1ZXN0LCBvcHRpb25zPzogYW55KSB7XG4gICAgICAgIHJldHVybiBQbGFpZEFwaUZwKHRoaXMuY29uZmlndXJhdGlvbikud2ViaG9va1ZlcmlmaWNhdGlvbktleUdldCh3ZWJob29rVmVyaWZpY2F0aW9uS2V5R2V0UmVxdWVzdCwgb3B0aW9ucykudGhlbigocmVxdWVzdCkgPT4gcmVxdWVzdCh0aGlzLmF4aW9zLCB0aGlzLmJhc2VQYXRoKSk7XG4gICAgfVxufVxuXG5cbiJdfQ==