{"version":3,"sources":["webpack:///./transfer/utils/session.js","webpack:///./transfer/lazy-load.js","webpack:///./transfer/lazy-components.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/@paypalcorp/pp-react-theme/dist/@paypalcorp/pp-react-theme.esm.js","webpack:///./transfer/utils/mgmUtils.js","webpack:///./transfer/utils/unified-send-analytics.js","webpack:///./transfer/utils/requestMatchesResponse.js","webpack:///./calculator/actions/utils.js","webpack:///./transfer/actions/Actions.js","webpack:///./transfer/utils/fiFailureUtils.js","webpack:///./transfer/actions/unilateral.js","webpack:///./lib/authUtils.js","webpack:///./lib/contentUtils.js","webpack:///./transfer/utils/directory-search-analytics.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/cldrjs/dist/cldr.js","webpack:///./experiments/v2.js","webpack:///./transfer/utils/contact-confidence-analytics.js","webpack:///./transfer/utils/homeInfoUtils.js","webpack:///./experiments/migrateRoutes.js","webpack:///./transfer/utils/xbFeeCalcUtils.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/griffin-paypal/number.js","webpack:///./transfer/actions/sendHelpers.js","webpack:///./transfer/utils/currencyUtils.js","webpack:///./transfer/actions/pay-request.js","webpack:///./experiments/bizSearch.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/lodash/findIndex.js","webpack:///./experiments/fiFlow.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/lodash/isUndefined.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/@babel/runtime/helpers/asyncToGenerator.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/globalize/dist/globalize.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/cldrjs/dist/node_main.js","webpack:///./transfer/utils/blockUnblockAnalytics.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/lodash/find.js","webpack:///./transfer/utils/name-utils.js","webpack:///./transfer/utils/unilateral-recipient-choice-analytics.js","webpack:///./transfer/utils/risk-hold-utils.js","webpack:///./experiments/fiFailuresEnhancement.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/griffin-paypal/lib/utils.js","webpack:///./transfer/actions/analytics-helpers.js","webpack:///./experiments/shops.js","webpack:///./lib/image-utils.js","webpack:///./experiments/defaultCurrency.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/react-loadable/lib/index.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/lib/address.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/griffin-paypal/name.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/debounce-promise/dist/index.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/awesome-imperative-promise/dist/index.es.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/awesome-debounce-promise/dist/index.es.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/awesome-only-resolves-last-promise/dist/index.es.js","webpack:///./transfer/actions/overpanels.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/globalize/dist/globalize/number.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/lodash/toNumber.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/griffin-paypal/lib/client/name.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/griffin-paypal/lib/nameCommon.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/lodash/_createFind.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/lodash/toInteger.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/lodash/toFinite.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/lodash/_baseTrim.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/lodash/_trimmedEndIndex.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/griffin-paypal/lib/client/number.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/cldrjs/dist/cldr/event.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/cldrjs/dist/cldr/supplemental.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/cldrjs/dist/cldr/unresolved.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/node_modules/griffin-paypal/lib/client/utils/numberHelpers.js","webpack:///./transfer/utils/local-storage.js","webpack:///./transfer/actions/send.js","webpack:///./transfer/utils/routeHelper.js","webpack:///./transfer/utils/funding-source-logo-map.js","webpack:///./transfer/utils/funding-option-utils/index.js","webpack:////home/jenkins/agent/workspace/rAlWnROk32481EutLuZS/config/enRTRStrings.js","webpack:///./transfer/utils/travelRuleUtils.js","webpack:///./transfer/utils/3ds-utils.js","webpack:///./transfer/actions/unified-actions.js","webpack:///./lib/unilateral-utils.js","webpack:///./lib/recipient.js","webpack:///./experiments/contact-confidence.js"],"names":["getSessionDataPayload","typedRecipient","_get","store","getState","hasSeenNote","Loading","_ref","pastDelay","React","createElement","style","margin","className","SilentLoading","loader","showLoading","arguments","length","undefined","loadable","loading","delay","Send","load","Request","ContactList","MiscFunnel","Preview","SendSuccess","BuySuccess","PayRequestSuccessRedux","RequestSuccess","MultiRequestSplitPreview","BillSplitRequest","MultiRecipient","BillSplittingPreview","BillSplittingSuccess","FundingOptionSelector","Reveal","Unilateral","UnilateralClaimMoney","GuestLogin","GuestHeader","GuestPayRequestRecipientHeader","GuestPayPalPoolsRecipientHeader","GuestPayPalPoolsPreviewRecipientHeader","GuestCreateAccount","GuestPreview","GuestLoginSuccess","SendSuccessHeader","EditContacts","SessionTimer","Overpanel","DisabledMassPayment","MoneyClaimedError","ErrorCommon","AddBillingAddressOverpanel","AddShippingAddressOverpanel","AddCardOverpanel","C2AddCardOverpanel","NotOverseasRecipient","BRRecipient","LATAMRecipient","AddCardMessenger","AboutCashAdvanceFees","ReferralCheckList","Chat","BlockContactList","GuestInfoCollection","GuestRevampPostPaySignup","MgmPSErrorPage","ULPClaimSharePage","Onboard","Profile","NextSteps","ConfirmPhone","SendToApp","PAYPAL_THEME","getTrafficSource","href","mgmTrafficSource","serverProps","getTrafficSourceFromUrl","params","parseSearch","traffic_source","setMgmTrackingCommonProps","source","Events","updateCommonProps","_objectSpread","sub_flow","pageActionMap","guestSelectFF","link","pageGroup","pageName","extra","fltp","guestSelectGS","guestRedirectTesla","guestSend","guestReview","payRequestSend","paymentChoice","sellerPaysFee","senderPaysFee","ffPreview","gsPreview","continue","selectFF","eventData","recipient","p2p_payment_type_toggle_pressed","protection_design","moneyPageOverPanel","payment_type","suggested_protection_design","suggestedDesign","selectGS","type","onFFchangePaymentType","onGSchangePaymentType","onFFclickNoteField","onGSclickNoteField","onClickSendPaymentNow","purchaseProtection","p2p_payment_type_terms_pressed","enableProtection","disableProtection","paymentChoicePanelSend","paymentChoicePanelBuy","eligiblePurchases","trackImpressionUnifiedSend","pageAction","extraAnalytics","fpti","flfr","window","trackCancelBtn","tracking","p2p_payment_type_cancel_pressed","getPageGroup","flowType","isReview","concat","getPageName","getAmountPageTrackingStrings","emailOrPhone","isEmail","trackAmountPageImpression","data","external","receiver","env","recurring_type","recurringType","rcvr_acct_type","recipientAccountType","trackAmountPageClick","linkName","trackClickUnifiedSend","extraData","Object","assign","trackClick3ds2","page","trackGuestClickPmtChoice","location","pathname","endsWith","trackGuestReturnToPagePmtChoice","pageLink","newPageName","newPageGroup","pglk","getAnalytics","selectedFundingOption","fundingOptions","preferred","getPreferredFundingSource","id","selectedFOExists","keys","dflFmxId","funding_sources","map","usingPreferred","some","isPreferred","transactionTypeMap","PAYMENT_TYPE","PURCHASE","dfl_fmxid","toString","pref_fmxid","is_pref","requestMatchesResponse","requestTime","responseTime","isZero","amount","Number","replace","ownKeys","object","enumerableOnly","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","enumerable","push","apply","target","i","forEach","key","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","currencyFormat","decimal","formatLocalizedNumber","getLocalizedNumberFormatter","formatUSNumber","getUSNumberFormatter","getAnalyticsMeta","payload","analytics","showError","err","silenceFpti","customComp","use","name","onClosed","code","trackContactBlockedErrorImpression","log","error","types","ERROR","SHOW_ERROR_OVERPANEL","meta","INSTRUMENTATION_TYPES","renderedMessage","dangerouslySetInnerHTML","__html","message","customComponent","showErrorPage","SHOW_ERROR_PAGE","handleError","dispatch","resetScrollPosition","$","document","body","animate","scrollTop","changeSelectedFundingOption","analyticsData","TRANSACTION","CHANGE_SELECTED_FUNDING_OPTION","fromChoiceToReview","changeInstallmentPlan","paymentTimes","parseInt","CHANGE_SELECTED_INSTALLMENT_PLAN","changeCountry","country","server","guestSupportedCountries","countryCanGuest","includes","USER","CHANGE_COUNTRY","changeEmail","email","CHANGE_EMAIL","changeIsPurchase","isPurchase","isToggle","shouldDefaultToSuggestedPaymentType","CHANGE_IS_PURCHASE","PAGE_CHANGE","nextPageGroup","nextPageName","trackType","hasRedirectedFromSend","HAS_REDIRECT_FROM_SEND","changeFirstName","firstName","CHANGE_FIRST_NAME","changeLastName","lastName","CHANGE_LAST_NAME","changePhoneNumber","phoneNumber","CHANGE_PHONE_NUMBER","changePrimaryCurrencyCode","primaryCurrencyCode","CHANGE_PRIMARY_CURRENCY_CODE","changeGovernmentId","governmentId","CHANGE_GOVT_ID","changeSelectedGovernmentIDType","selectedGovernmentIdType","CHANGE_SELECTED_GOVERNMENT_ID_TYPE","changeBirthDay","birthDay","CHANGE_BIRTH_DAY","changeBirthMonth","birthMonth","CHANGE_BIRTH_MONTH","changeBirthYear","birthYear","CHANGE_BIRTH_YEAR","receivedContacts","_ref2","otherContacts","topContacts","topSendContacts","topReceiveContacts","CONTACTS","RECEIVED_CONTACTS","receivedAt","Date","now","receivedSearchedContacts","_ref3","RECEIVED_SEARCHED_CONTACTS","contacts","receivedContactActivityData","_ref4","transactions","RECEIVED_CONTACT_DATA","fetchContacts","hasFetchedContacts","hasUpdatedContacts","ENV_TYPE","PISP","fetch","then","response","catch","searchContacts","query","post","updateFavorite","contactId","isFavorite","FAVORITE_CONTACT","url","patch","updatedFavorite","FAVORITED_CONTACT","fetchContactActivityData","activityData","updateContactBlock","_ref5","isBlock","UPDATE_CONTACT_BLOCK","updatedContactBlock","toggleContactBlockedOverpanel","show","toggleContactUnblockedOverpanel","_ref6","UPDATED_CONTACT_BLOCK","deleteContact","DELETE_CONTACT","deleteAjax","deletedContact","DELETED_CONTACT","fetchRecipientDetails","contact","isContact","preload","removeMailto","CROSS_BORDER","REQUEST_RECIPIENT_DETAILS","payerId","networkId","_ref7","recipientDetails","beaconClientMetaDataId","RECEIVED_RECIPIENT_DETAILS","SET_FRAUDNET_CLIENT_METADATA","triggerSenderPhoneConfirmation","TRIGGER_SENDER_PHONE_CONFIRMATION","CHANGE_HIGHLIGHTED_PAYMENT_TYPE","highlightPaymentType","paymentTypeSelectionMessage","UPDATE_PAYMENT_TYPE_SELECTION_MESSAGE","paymentTypeTogglePersonalMessage","UPDATE_PAYMENT_TYPE_TOGGLE_PERSONAL_MESSAGE","paymentTypeTogglePurchaseMessage","UPDATE_PAYMENT_TYPE_TOGGLE_PURCHASE_MESSAGE","CHANGE_RECOMMENDED_PAYMENT_TYPE","recommendedPaymentType","paymentTypeTransitions","_isEmpty","UPDATE_PAYMENT_TYPE_TRANSITIONS","UnifiedActions","selectContact","prepareXBInitialState","setXBInitialState","recipientCurrencyCode","recipientCurrencies","recipientCurrencyMap","AMOUNT","UPDATE_RECIPIENT_CURRENCIES","updateRecipientCurrencies","recipientCountryIsInferred","changeUnilateralCountryCode","recipientCountryCode","routeTo","getUrlFragment","advanceToRequestReview","pn","pg","transaction","transactionIds","businessAccountInfo","isEnrolledInBillSplitting","billSplitting","partnerDisplayName","partnerName","counterParty","category","multiRecipient","recipients","requestBeaconType","isBusinessUser","flnm","mname","pp_flow","contact_count","ACTION_WITH_DATA","selectUnilateralContact","RECIPIENT","SELECT_UNILATERAL_CONTACT","enableAnalytics","urlPathName","isGiftRoute","flowTypes","find","flow","mapDefaultCurrencyKeys","decorateContact","SELECT_CONTACT","multiSelectContact","RECIPIENTS","removeRecipient","REMOVE_RECIPIENT","changeSelectedRecipientIndex","index","CHANGE_SELECTED_RECIPIENT_INDEX","changeRecipient","recipientIsEmail","recipientIsPhone","isPhone","isRecipientValid","CHANGE_RECIPIENT","changeTypedRecipient","CHANGE_TYPED_RECIPIENT","changeCurrentRecipient","currentRecipient","CHANGE_CURRENT_RECIPIENT","changeCurrentRecipientDisplayName","displayName","CHANGE_CURRENT_RECIPIENT_DISPLAY_NAME","resetMultiRecipients","RESET_RECIPIENTS","changeAmount","CHANGE_AMOUNT","changeCVVCode","cvv","CHANGE_CVV_CODE","toggleSenderAccountInfo","TOGGLE_SENDER_HELPER_INFORMATION","changeCurrency","newCurrency","currencyCode","CHANGE_CURRENCY","changeRequestCurrency","CHANGE_REQUEST_CURRENCY","requestCurrencyCode","changeNote","note","NOTE","CHANGE_NOTE","mandatoryNoteMissing","missing","REQUIRED_FIELD_ERROR","changeGiftOption","giftOption","GIFT_OPTIONS","CHANGE_OPTION","routeToPPDG","protocol","host","changeGiftAidCheckbox","flag","EXTERNAL","CHANGE_GIFTAID","requestedMoney","REQUESTED_MONEY","requestedAt","isAgreementConsentRequired","userAgreementConsentRequired","hasResolvedUserAgreementConsent","requestMoney","_ref8","purchaseConsentChecked","purchaseConsentRequired","userAgreementConsentMinVersion","userAgreementConsentMaxVersion","recipientField","_recipient","psd2","token","psd2Token","hasConfirmedEmail","ct_cnt","REQUEST_MONEY","persistKey","description","trim","active_consent_disclaimer_agree_pressed","policy_major_version","policy_minor_version","responseData","ppmeClaimUrl","showPPMeIframe","amountFormatted","requestId","requestLegId","payRequestLink","requestedMoneyPayload","addCPLData","req_id","trid","setPersistentData","result","pStudioContent","finally","RESOLVE_USER_AGREEMENT_CONSENT","leavingSuccessPage","LEAVING_SUCCESS_PAGE","cancelledTransaction","CANCELLED_TRANSACTION","submittingRecipient","selectedType","SUBMITTING_RECIPIENT","changeDestinationCurrencyCode","_ref9","shouldFireAnalytics","pagename","CHANGE_DESTINATION_CURRENCY_CODE","rcur","changeOriginCurrencyCode","_ref10","fromCurrencyCode","CHANGE_ORIGIN_CURRENCY_CODE","sndcc","fetchOriginAmount","getFetch","toCurrencyCode","preFetchAction","requestOriginAmount","onFetchSuccessAction","receiveOriginAmount","fetchDestinationAmount","requestDestinationAmount","receiveDestinationAmount","fetchExchangeRate","currentTime","REQUEST_EXCHANGE_RATE","requestExchangeRate","latestExchangeRateFetchTime","dataToSend","toCountryCode","fromCountryCode","requestedTime","json","crossBorder","RECEIVED_EXCHANGE_RATE","updateFxQuoteId","fxQuoteId","handleErrorFromFailedRequest","changePurchaseLocation","mtgplace","CHANGE_PURCHASE_LOCATION","changeItemCategory","CHANGE_ITEM_CATEGORY","RECEIVED_FX_QUOTE_ID","options","previousAmount","previousCurrencyCode","currencyChanged","preciseAmount","invariant","amountNumber","parseFloat","isValidAmount","amountDiffers","amountChanged","_isUndefined","currencyCodeDiffers","currencyCodeChanged","hasValidAmountAndCode","shouldFetch","shouldFetchNewAmount","dataWithPreciseAmount","latestAmountFetchTime","RECEIVED_FEE","fees","toAmountRaw","FETCH_CONVERSION_FAILED","changeDestinationAmount","amountPrecise","CHANGE_DESTINATION_AMOUNT","amountIsZero","isInDebounceWindow","Promise","reject","changeOriginAmount","CHANGE_ORIGIN_AMOUNT","REQUEST_ORIGIN_AMOUNT","preciseAmounts","getAmountsForPrecision","RECEIVED_ORIGIN_AMOUNT","ACTION","fromAmount","toAmount","fromAmountRaw","fromAmountPrecise","toAmountPrecise","REQUEST_DESTINATION_AMOUNT","RECEIVED_DESTINATION_AMOUNT","SET_INITIAL_STATE","noFundingSource","unavailableFI","NO_FUNDING_SOURCE","triggerExternalHook","hook","initXBState","currencyMap","user","countryCode","currencyCodeList","currency","symbol","x","fromCurrencyCodeList","showXBCalculator","toCurrencySymbolMap","toCurrencyCodeList","initFXCalculator","defaultCurrencyCodeList","isInitialAmountEntry","toggleShareAddress","shouldShareAddress","TOGGLE_SHARE_ADDRESS","setIsLoading","isLoading","SET_IS_LOADING","captureExternalParams","RECEIVED_EXTERNAL_PARAMS","captureExternalIntegrationParams","RECEIVED_EXTERNAL_INTEGRATION_PARAMS","redirect","ROUTER","REDIRECT","setSuggestedTransactionType","transactionType","SET_SUGGESTED_TRANSACTION_TYPE","setServiceReturnedPaymentType","SET_SERVICE_RETURNED_PAYMENT_TYPE","setPaymentTypeSelected","paymentTypeIsSelected","SELECT_PAYMENT_TYPE","isInstrumentDebitFailedError","hasFIFailuresEnhancementTrmnt","SEND_MONEY_ERRORS","INSTRUMENT_DEBIT_FAILED","changeUnilateralName","UNILATERAL","CHANGE_UNILATERAL_NAME","CHANGE_UNILATERAL_COUNTRY_CODE","resendMail","transactionId","RESEND_MAIL_STATUS","status","put","resp","sendNotification","isOneTouchUser","requestLoginAction","DONATE","getCfpbContentKey","isCFPBEnabledCountry","accountType","contentKey","isCFPBEnabled","getCfpbDynamicContentKey","subscriptionType","match","SEND_PAGE_NAME","REQUEST_PAGE_NAME","PAGE_VARIANT_MAP","SIGNUP_FOR_NETWORK_ID","UPGRADE_NETWORK_ID","PROVIDE_ADDITIONAL_NETWORK_ID_CONSENT","trackSearchResultImpression","isRequestFlow","device_contacts_count","paypal_contacts_count","int_err_code","int_err_code_desc","trackImpression","trackDirectorySearchClick","trackLinkWithData","trackContactClick","recipient_ppme_member_y_n","Boolean","hasNetworkId","account_type","isUnilateral","trackConsentImpression","actionType","isPreFlow","variant","hasOwnProperty","page_variant","trackConsentClick","merge","arrayIsArray","Array","isArray","obj","prototype","call","pathNormalize","path","attributes","join","Error","split","arraySome","array","callback","coreLikelySubtags","Cldr","cldr","subtags","language","script","sep","localeSep","territory","variants","slice","get","test","force","coreRemoveLikelySubtags","maxLanguageId","coreSubtags","locale","aux","arrayForEach","bundleLookup","minLanguageId","availableBundleMap","_availableBundleMap","availableBundleMapQueue","_availableBundleMapQueue","bundle","existing","maxBundle","minBundle","splice","createError","JSON","stringify","objectKeys","attribute","validate","check","validatePresence","value","validateType","expected","validateTypePath","validateTypePlainObject","resourceGet","node","coreSetAvailableBundles","main","indexOf","alwaysArray","somethingOrArray","jsonMerge","destination","sources","prop","coreLoad","jsons","j","itemGetResolved","normalizedPath","_resolved","this","init","_alwaysArray","_coreLoad","_createError","_itemGetResolved","_jsonMerge","_pathNormalize","_resourceGet","_validatePresence","_validateType","_validateTypePath","_validateTypePlainObject","unicodeLocaleExtensions","unicodeLocaleExtensionsRaw","pop","region","omittedFlows","POOLS","isV2PhaseTwo","pxp","isV2PricingReq","getContactConfidenceAnalyticsData","isRestricted","recipient_ppmember_y_n","recipient_restricted_account_y_n","recipient_phone_y_n","recipient_contact_y_n","trackContactConfidenceImpression","trackContactConfidenceCancel","trackLink","trackContactConfidenceSubmit","handleInterstitialCipFlow","param","flowIntent","getFlowType","feature","thumbnailUrl","subFlow","externalUrl","purchaseCipUrl","personalCipUrl","fullName","PAY_REQUEST","homeinfoPayLoad","entryPoint","mainWindow","isIframe","top","redirectURL","logger","hasFIPayRequestPostMigration","hasAddFiPostMigration","availableCurrencies","isCrossBorderRecipient","rate","senderCountryCode","recipientCountryName","senderLocalCurrency","currencyList","toCountryName","module","exports","rankingPreferencesHelper","conversionType","instrumentIds","preselectedFundingOption","ranking","preselected_funding_option_id","instrument_ids","currencyConversionType","currency_conversion_type","formatAmount","griffinPresetKey","maximumFractionDigits","warn","griffinMetadata","getGriffinMetadata","griffinNumberHandler","griffinNumber","createHandler","normalizedAmount","normalizeNumber","formatCurrency","formatCanonicalAmount","getAmountParts","separator","amountAsFloat","parseLocalizedNumberAsFloat","CURRENCY_FORMAT_SYMBOLISOCURRENCY","parts","sortCurrencyList","currencySymbolMap","sort","showCurrencySymbol","currencyDecimal","part","fetchFundingOptions","handleFISelectorNext","paymentCardId","recipientFullName","recipientCountry","address","selectedShippingAddress","shippingAddressId","goods","successfullyAddedFundingInstrumentIds","requireSenderInstrumentAddition","Actions","redirectToAddFI","FETCH_FUNDING_OPTIONS","paymentCard","instrument_type","INSTRUMENT_TYPES","PAYMENT_CARD","preferences","browserData","collectBrowserContext","browserContext","screenHeight","browser_screen_height","screenWidth","browser_screen_width","colorDepth","browser_color_depth","timezoneOffsetMinutes","browser_timezone_offset_minutes","browser_language","javaEnabled","browser_java_enabled","receivedFundingOptions","handlePayRequestSubmit","fundingOptionId","selectedInstallmentPlan","installmentTerm","payRequestData","installment_term","travelRuleRequirements","calculateAttributesToCollect","travelRuleUtils","legId","paidRequest","travelRuleData","POST_TRAVEL_RULE_DATA","POSTED_TRAVEL_RULE_DATA","postTravelRuleAndPayRequest","payment_details","compliance_info","regulatory_information","remittance_transfer_rule","action","payment_id","flavor","txn_amt","PAID_REQUEST","paymentDetails","complianceInfo","isBizSearchTreatment","baseFindIndex","baseIteratee","toInteger","nativeMax","Math","max","predicate","fromIndex","generateFIFlowUrl","generateGenericFlowURL","_objectWithoutProperties","_excluded","generateNegBalFlowUrl","_excluded2","urlPrefix","_excluded3","flowData","reduce","res","encodeURIComponent","getFILinkName","groupFeatures","isMoneyNodeWebAddFISupported","canAddBankOnly","isMoneyNodeWebAddBankOnlySupported","canOnlyAddBank","WALLET","NEW_BANK","NEW_CARD","isOpenBankingTreatment","LINK_BANK_CARD","asyncGeneratorStep","gen","resolve","_next","_throw","arg","info","done","fn","self","args","__esModule","factory","formatMessage","variable","objectExtend","partsPush","runtimeStringify","_key","runtimeKey","stringOrArray","validateCldr","skipBoolean","skip","pathRe","validateParameterPresence","validateParameterType","validateParameterTypeLocale","isPlainObject","alwaysCldr","localeOrCldr","validateLikelySubtags","once","Globalize","_formatMessage","_formatMessageToParts","lastOffset","nameIncludingBrackets","offset","_isPlainObject","_objectExtend","_partsJoin","_partsPush","_regexpEscape","string","_runtimeBind","runtimeArgs","argsStr","fnName","matches","exec","functionName","hash","str","charCodeAt","abs","generatorString","_stringPad","count","right","String","_validate","_validateCldr","_validateDefaultLocale","_validateParameterPresence","_validateParameterRange","minimum","maximum","_validateParameterTypePlainObject","_validateParameterType","BLOCK_CONTACT_PAGE_GROUP","BLOCK_CONTACT_PAGE_NAME","BLOCKED_CONTACTS_PAGE_GROUP","BLOCKED_CONTACTS_PAGE_NAME","BLOCK_ERROR_PAGE_GROUP","BLOCK_ERROR_PAGE_NAME","trackBlockContactClick","trackBlockContactImpression","trackBlockConfirmationClick","trackBlockCancelClick","trackBlockContactSuccessImpression","message_shown","trackViewBlockedContactsLink","trackBlockedContactsImpression","trackUnblockContactLink","encr_rcvr_id","trackUnblockContactSuccessImpression","createFind","getInformalName","givenName","surname","informalName","griffinNameHandler","griffinName","NAME_FORMAT_INFORMAL","nameObject","formatName","exception","trackUnilateralRecipientChoiceImpression","trackUnilateralRecipientChoiceCancel","trackUnilateralRecipientChoiceSubmit","i18n","content","VARIANTS","GENERIC","SECURITY","ACCOUNT_TAKEOVER","ACCOUNT_TAKEOVER_WITH_AVATAR","PAGE_NAME","PAGE_GROUP","trackRiskHoldImpression","additionalDisclosureActions","riskHoldOverpanelVariant","trackingData","mParticleTracking","trackButtonClick","buttonName","overpanelVariant","eventName","hasTwentyFourHourHoldsVariant","getHeaderContent","getParagraphContent","isOmittedFlow","getSymbolArray","output","charCode","charAt","findUniqueElementArray","arr","unifiedString","trackEditContacts","hasMultiItemCartShops","preloadImage","Image","src","usePreloadImage","useMemo","shouldFetchRecipientDetails","keyMap","recipientLocalCurrency","acc","curr","_typeof","Symbol","iterator","constructor","_classCallCheck","instance","Constructor","TypeError","_possibleConstructorReturn","ReferenceError","_inherits","subClass","superClass","create","writable","configurable","setPrototypeOf","__proto__","PropTypes","ALL_INITIALIZERS","READY_INITIALIZERS","promise","state","loaded","loadMap","promises","all","render","props","default","createLoadableComponent","loadFn","_class","_temp","opts","timeout","webpack","modules","getModuleIds","every","moduleId","_React$Component","LoadableComponent","_this","retry","setState","timedOut","_loadModule","componentWillMount","_mounted","_this2","context","moduleName","report","_delay","setTimeout","_timeout","update","_clearTimeouts","componentWillUnmount","clearTimeout","Component","contextTypes","shape","func","isRequired","Loadable","Map","Capture","_React$Component2","getChildContext","Children","only","children","flushInitializers","initializers","propTypes","childContextTypes","preloadAll","preloadReady","isHideShippingAddress","shippingAddressCollectionPreference","SHIPPING_ADDRESS_COLLECTION_PREFERENCES","HIDE","getWait","wait","defer","deferred","lastCallAt","timer","pendingArgs","currentWait","getTime","isCold","_len","leading","accumulate","flush","bind","argsIndex","results","thisDeferred","createImperativePromise","promiseArg","wrappedPromise","_resolve","_reject","val","reason","cancel","__assign","t","s","n","p","DefaultOptions","_args","_i","onlyResolvesLast","DebounceCache","config","debounceSingleton","debounceCache","_createDebouncedFunction","asyncFunction","cancelPrevious","debouncedFunc","initialPromise","_a","getDebouncedFunction","finalOptions","debouncedFn","toggleAddShippingAddressOverpanel","authUtils","newOverpanelKey","OVERPANELS","TOGGLE_ADD_SHIPPING_ADDRESS_OVERPANEL","toggleRiskHoldsOverpanel","TOGGLE_RISK_HOLDS_OVERPANEL","toggleConfirmIdentityOverpanel","TOGGLE_CONFIRM_IDENTITY_OVERPANEL","onRiskHoldsConfirm","CONFIRMED_RISK_HOLDS","toggleAddBillingAddressOverpanel","TOGGLE_ADD_BILLING_ADDRESS_OVERPANEL","toggleAddCardOverpanel","showTransactionContextContent","TOGGLE_ADD_CARD_OVERPANEL","toggleCurrencyConversionOverpanel","TOGGLE_CURRENCY_CONVERSION_OVERPANEL","toggle3DS2ChallengeOverpanel","TOGGLE_THREEDS2_CHALLENGE_OVERPANEL","toggle3DS2SpinnerOverpanel","TOGGLE_THREEDS2_SPINNER_OVERPANEL","toggle3DSecureOverpanel","closeManually","opened","success","failure","TOGGLE_3D_SECURE_OVERPANEL","toggleSendingLimitOverpanel","TOGGLE_SENDING_LIMIT_OVERPANEL","IMPRESSION","toggleFundingOptionsOverpanel","_ref11","TOGGLE_FUNDING_OPTIONS_OVERPANEL","toggleContactDetailsOverpanel","_ref12","TOGGLE_CONTACT_DETAILS_OVERPANEL","toggleErrorOverpanel","_ref13","TOGGLE_ERROR_OVERPANEL","addOpenOverpanel","ADD_OPEN_OVERPANEL","subtractClosedOverpanel","SUBTRACT_CLOSED_OVERPANEL","toggleContactConfidenceOverpanel","_ref14","TOGGLE_CONTACT_CONFIDENCE_OVERPANEL","toggleCashAdvanceFeesOverpanel","_ref15","flr","TOGGLE_CASH_ADVANCE_FEES_DISCLOSURE_OVERPANEL","TOGGLE_CASH_ADVANCE_FEES_ABOUT_OVERPANEL","toggleUnilateralRecipientChoiceOverpanel","TOGGLE_UNILATERAL_RECIPIENT_CHOICE_OVERPANEL","toggleSearchConsentOverpanel","_ref16","TOGGLE_SEARCH_CONSENT_OVERPANEL","updateHasShownSearchConsentOverpanel","_ref19","hasShown","UPDATE_HAS_SHOWN_SEARCH_CONSENT_OVERPANEL","toggleOpenBankingOverpanel","_ref20","TOGGLE_OPEN_BANKING_OVERPANEL","toggleBlockContactOverpanel","_ref21","TOGGLE_BLOCK_CONTACT_OVERPANEL","toggleBlockedContactsOverpanel","_ref22","TOGGLE_BLOCKED_CONTACTS_OVERPANEL","_ref23","TOGGLE_CONTACT_BLOCKED_OVERPANEL","_ref24","TOGGLE_CONTACT_UNBLOCKED_OVERPANEL","toggleChatBlockContactOverpanel","_ref25","TOGGLE_CHAT_BLOCK_CONTACT_OVERPANEL","toggleUnilateralEmailConfirmationPopup","_ref26","TOGGLE_UNILATERAL_EMAIL_CONFIRMATION_OVERPANEL","setPurchaseToPersonalTransactionPanelVisibility","purchaseToPersonalTransactionPanelVisibility","PURCHASE_TO_PERSONAL_TRANSACTION_OVERPANEL","partsJoin","regexpEscape","runtimeBind","stringPad","validateDefaultLocale","validateParameterRange","validateParameterTypePlainObject","createErrorUnsupportedFeature","validateParameterTypeNumber","validateParameterTypeString","numberNumberingSystem","nu","numberNumberingSystemDigitsMap","supplemental","_type","_digits","numberPatternRe","numberPatternProperties","pattern","aux1","aux2","fractionPattern","integerFractionOrSignificantPattern","integerPattern","maximumSignificantDigits","minimumFractionDigits","minimumIntegerDigits","minimumSignificantDigits","padding","prefix","primaryGroupingSize","roundIncrement","scientificNotation","secondaryGroupingSize","significantPattern","suffix","_match","minimumSignificantDigitsMatch","maximumSignificantDigitsMatch","lastIndexOf","numberSymbol","numberSymbolName","numberSymbolMap","symbolMap","numberTruncate","isNaN","NaN","numberFormatProperties","negativePattern","negativePrefix","negativeProperties","negativeSuffix","positivePattern","roundFn","properties","method","getOptions","propertyIndex","round","incrementOrExp","exp","increment","exponent","toExponential","compact","compactType","maxExponent","newObject","compactKey","numberExponent","pluralForm","numberCompact","useGrouping","min","regexpCfG","regexpDashG","regexpZsG","looseMatching","numberParse","grammar","invertedNuDigitsMap","invertedSymbolMap","negative","number","prefixNSuffix","tokenizer","_value","statement","lexeme","character","Infinity","parse","tokenizeNParse","objectMap","pair","removeLiteralQuotes","numberParseProperties","decimalSymbolRe","digitsRe","groupingSeparatorRe","infinitySymbol","nanSymbol","nuDigitsMap","numberTokenizer","formatProperties","numberSymbolInvertedMap","localizedDigit","literal","infinity","RegExp","nan","numberPattern","numberCompactPatternRe","numberToPrecision","precision","roundOrder","ceil","numberFormat","pluralGenerator","compactMap","stringToParts","compactPattern","compactProperties","divisor","numberType","digit","etc","isFinite","floor","other","pow","toFixed","numberFormatIntegerFractionDigits","atMinimum","atMaximum","numberFormatSignificantDigits","_garbage","space","currentGroupingSize","ret","switchToSecondary","numberFormatGroupingSeparator","numberToPartsFormatterFn","numberFormatter","numberToPartsFormatter","returnFn","numberFormatterFn","fnArgs","on","raw","off","validateDigits","numberParser","numberParserFn","formatNumber","formatNumberToParts","parseNumber","_createErrorUnsupportedFeature","_numberNumberingSystem","_numberNumberingSystemDigitsMap","_numberPattern","_numberSymbol","_looseMatching","_removeLiteralQuotes","_validateParameterTypeNumber","_validateParameterTypeString","baseTrim","isObject","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","valueOf","isBinary","core","assertion","basic","assertType","getValueOrDefault","assertRange","objectAssign","nameCommon","NameHandler","nameFields","businessNameFields","messages","NAME_SCRIPT_VALIDATION_ERROR","NAME_REQUIRED_FIELD_MISSING","NAME_FORMAT_NOT_FOUND","styles","NAME_FORMAT_INPUT","NAME_FORMAT_FULL","NAME_FORMAT_BUSINESS_INFORMAL","transformTypes","ONE_SURNAME","TWO_SURNAMES","transformType","styleValues","getMetadata","handler","metadata","definePrivateProperty","propertyName","propertyValue","nameValidations","getCountry","validations","nameStrings","territorySection","strings","nameMeta","styleObject","scope","getStyleObject","errorMessage","layoutType","layout","detectScript","languageDefaultScript","languageDefaultNameScript","field","isLatin","isLatinName","defaultScript","countryDefaultNameScript","getNameMeta","assertName","parameterName","fields","mapAttribute","attributeMap","_","nationality","validationsMeta","validateName","businessName","businessType","validateOptions","validateBusinessName","transformName","formatOptions","assertStyle","layoutElement","property","labels","label","required","optional","optionalLabel","formatToNameInput","formattedName","toTextOutput","layoutMeta","separatorWaiting","realFieldSeen","newField","getPartsOutput","griffin","generalMessages","errors","METADATA_INVALID","useMetadata","NAME_ALL_PUNCTUATION_ERROR","NAME_CHARACTER_REPETITION_ERROR","NAME_ALL_HONORIFICS_ERROR","NAME_KEYBOARD_BANGING_ERROR","NAME_SINGLE_CHARACTER_ERROR","NAME_NATIONALITY_SCRIPT_VALIDATION_ERROR","NAME_MIXED_SCRIPT_VALIDATION_ERROR","NAME_INVALID_PATTERN_ERROR","NAME_ALL_NUMBER_ERROR","NAME_ALL_RESTRICTED_ERROR","NAME_ALL_REGISTERED_ACCOUNT_ERROR","BUSINESS_NAME_ALL_PUNCTUATION_ERROR","getBusinessNameSupportedScripts","supportedScriptsByCountry","supportedScripts","objectGet","DEFAULT","getOffensiveNameError","offensiveNameRegex","detail","errorMap","NAME_INVALID_PATTERN_ERROR_OFFENSIVE","negativePaternName","validateOffensiveName","nameField","scriptBasedRegexes","offensive","isNameInValidList","validList","validListRegex","isCharacterRangeMatch","characterRange","isMatch","uniqueCharArr","getNameScript","characterRangeRegex","nameConcat","item","scripts","scriptValidations","currentScript","filterErrors","getErrorMessagesForFields","errorCode","getPunctuationNameError","punctuationRegex","validatePunctuation","punctuation","validateRepetition","repetition","repetitionResult","repetitionRegex","validateHonorifics","honorificsVariation","honorificsRegex","validateBoundaryValidation","boundaryValidation","boundaryValidationRegex","bvResult","NAME_INVALID_PATTERN_ERROR_BOUNDARY","validateKeyboardBanging","keyboardBanging","kbResult","keyboardBangingRegex","validateSingleCharacter","singleCharacterValidation","singleCharacterRegexPat","validateNonVowel","nonVowel","nonVowelRegex","singleCharacterRegex","boundaryRegex","initialsRange","initialsRangeRegex","isInitialName","NAME_INVALID_PATTERN_ERROR_NON_VOWEL","replaceDoubleSpaces","delimiter","namePart","replaceRe","assertTransformType","optionType","transformValues","filterFields","requiredFieldErrors","missingField","layoutEntry","validateRequiredField","scriptErrors","validRangeForCountryRegex","validRegExString","codePoint","invalidCodePointFromString","nationalityScripts","personal","INTERNATIONAL","getNationalityScripts","isNationalityValid","validateScript","validateField","transformedName","fromType","toType","re","surnames","secondSurname","businessNameValidations","businessScriptValidations","registeredBusinessType","bName","businessNameKey","getBusinessKey","registeredBusinessTypeKey","getRegisteredBusinessTypeKey","consolidatedCharacterRange","getBusinessNameCharacterRangeForScripts","bScripts","getBusinessNameScripts","numberRegex","restrictedNameRegex","registeredNameValidation","registeredNameValidationResult","isArrayLike","findIndexFunc","collection","iterable","iteratee","toFinite","remainder","toNumber","trimmedEndIndex","reTrimStart","reWhitespace","assert","assertMetadata","numberHelpers","assertCanonicalNumberType","assertLocalizedNumberType","setFractionDigits","NumberHandler","optionsPrototype","outputType","currencyDisplay","NUMBER_FORMAT","CURRENCY_PRESETS","CURRENCY_FORMAT","CURRENCY_FORMAT_ISOCURRENCY","presetName","presetValue","CURRENCY_PRESET_VALUES","symbolForCurrency","currencyMeta","cldrCurrencies","currencyStyles","newCurrencyStyles","didCurrencyLevelOverride","currency_override","currencySymbol","svalueA","svalueB","valueA","valueB","equivalency","position","fuzzyMatch","currencyPatternByStyle","globalize","currencyValue","parameter","parameterValue","currencyDigits","currencyInfo","digits","digitsForCurrency","localeNumberStyles","cldrNumbers","numberStyles","localeCurrencyStyles","formattedCurrency","formatBinder","numberOptions","patternElements","minusSign","C","griffinNumberMeta","cldrLocale","cldrMain","numbers","currencies","assertNumberMeta","EventEmitter","proto","indexOfListener","listeners","listener","alias","getListeners","evt","events","_getEvents","flattenListeners","flatListeners","getListenersAsObject","addListener","listenerIsWrapped","addOnceListener","defineEvent","defineEvents","evts","removeListener","addListeners","manipulateListeners","removeListeners","remove","single","multiple","removeEvent","_events","removeAllListeners","emitEvent","_getOnceReturnValue","trigger","emit","setOnceReturnValue","_onceReturnValue","noConflict","originalGlobalValue","superGet","superInit","validateTypeFunction","globalEe","validateTypeEvent","validateThenCall","event","getOverload","ee","_eventInit","supplementalMain","prepend","weekData","firstDay","minDays","timeData","allowed","initSuper","lookup","itemLookup","childLocale","parent","_raw","substr","bundleParentLookup","resourceSet","condition","assertCanonicalNumberTypeStrict","getCartStorage","userId","localStorage","getItem","handleProductDetails","ppshopsGuestId","sellerId","productId","productQuantity","cart","product","quantity","ex","makeFundingOptionsCall","isExternal","fundingOptionsRefetched","shouldShowSelectFundingOptionsPage","isMgm","accountId","recipientId","recipientIdType","pispRecipientType","pispRecipientId","selectedShippingAddressId","serviceReturnedType","shippingType","unilateral","unilateralCountry","theme","themeId","poolId","anonymousPayment","donationContext","recurring","donateToken","fromUL","sdkMeta","targetMeta","transaction_attribute","donate","donationAnonymousStatus","ignorePreferred","shouldSendShippingAddress","PPSHOPS","SHIPPING_ADDRESS_OPTIONS","NO_ADDRESS_NEEDED","moneyPageExperience","PP_ME","FLOW_TYPES","items","destinationAmount","responseJSON","showUnilateral","OverpanelActions","CLIENT_MISSING_REQUIRED_NOTE_FIELD","fundingData","disallowedSources","isPaypalAccount","xbActualRecipientCountry","xbChosenCountry","xbCountryMismatch","isCrowdFundingCampaign","isPreferredSourceDisallowed","showFISelector","selectedFundingOptionId","fundingOptionIdFromSession","showStateMandatedWarning","paymentReviewDisclosureMessage","paymentTypeReviewMessage","shippingDetails","purchaseConsentPreChecked","purchaseConsentLabel","userAgreementConsentLabel","xbData","card","addedCards","fundingSourceIdsOfLastSelectedFundingOption","sourceIdsToMatch","isPortable","option","preselected_funding_option","newestAddedCard","getAutoSelectedFundingOption","getSingleFundingOption","getOptionById","shouldForceAutoSelectedOption","ddcCalls","collect3ds2DDCCalls","STORE_ALL_DDC","storeAllDDC","newFundingOptionIsAvailable","isFundingOptionAvailable","toggleFIUnavailableWarning","analyticsMeta","contingencies","hasCVVContingency","contingency","iscvvshown","REFETCHED_FUNDING_OPTIONS","RECEIVED_FUNDING_OPTIONS","three_d_secure_protocol","threeDSecureProtocol","jwt","three_ds_reference_id","threeDS2ReferenceId","device_data_collection_url","deviceDataCollectionUrl","device_data_collection_mode","deviceDataCollectionMode","endDDCCall","END_DDC_CALL","startDDCCall","ddcInfo","START_DDC_CALL","clearFundingOptions","CLEAR_FUNDING_OPTIONS","setPurchaseConsentValue","PURCHASE_CONSENT_IS_CHECKED","refetchFundingOption3DS","REFETCH_FUNDING_OPTIONS_3DS","resolveDDC","sendSubmit","isGuest","_asyncToGenerator","refetchedFundingOptionFor3DS","startTime","performance","trackAction","cardinalDDCCallPromise","endTime","timeDiff","track3ds2PostDDCAnalytics","isDDCSuccess","threeDS2contingency","THREE_DS2_SECURE_AUTH_REQUIRED","DDC_RESOLVED","_x","_x2","handleCVV","sendData","REQUEST_CVV","RESOLVE_CVV","handlePurchaseConsent","REQUEST_PURCHASE_CONSENT","RESOLVE_PURCHASE_CONSENT","handleThreeDS2Success","threeDS2Contingency","RESOLVED_3DS2_AUTH_CONTINGENCY","handleThreeDS2Failure","FAILED_3DS2_AUTH_CONTINGENCY","handleThreeDS","RESOLVE_3DS","errorThreeDS","setDualControlContext","handleNext","SET_DUALCONTROL_CONTEXT","handleSendMoneyRequest","SEND_MONEY","payee","country_code","is_paypal_account","payment_amount","PERSONAL","getDCSendMoneyReqPayload","sentMoney","handleSendSubmit","isRecurring","donationGiftAidCheckbox","slug_name","actions","getRecentActions","send","postTravelRuleAndSend","xsell","paymentTypes","showSuccessPage","is3DS2ChallengeRequired","overpanelShownToUser","MONEY_PAGE","CONTROL_WEB","has_note","extract3DS2Contingency","has3DS2Contingency","is_3ds_eligible","challenge_shown","SENT_MONEY","XSELL","DONE_XSELL_CONTENT","targetUrl","userCountryCode","FeaturesConfig","defaultUnilateralRecipientCountry","SHOW_UNILATERAL","setPreferredFundingSource","fundingSourceId","POST_PREFERRED_FUNDING_SOURCE","targetSourceId","POSTED_PREFERRED_FUNDING_SOURCE","optionsWithPreferredAdded","removePreferredFromSourcesInOption","addPreferredToSourceInOption","selectedOptionWithPreferredRemoved","selectedOptionWithPreferredAdded","UPDATE_PREFERRED_IN_CLIENT_DATA","resolveRTBContingency","base64EncodedJWTErrorFromWallet","trackFIContingency","CONTINGENCY","INVALID_CREDENTIALS","REFRESH","RESOLVE_RTB_CONTINGENCY","isRTBSuccess","reviewRequired","bankWithEcheck","batch","eCheck","RESOLVED_RTB_CONTINGENCY","bankLoginRequired","RTB_INVALID_CREDENTIALS","newContingency","fundingOption","fundingSource","getRelevantFundingSource","buildFundingSourceAccountType","RTB_ERROR","scrollTo","behavior","_x3","_x4","saveSuccessfullyAddedFundingInstrumentIds","SAVE_SUCCESS_ID","setOpenBankingError","openBankingError","SET_OPEN_BANKING_ERROR","UNAVAILABLE_FI","redirectToBankLogin","postJson","redirectUrl","getAddFIPayload","override","isPPShops","unilateralName","unilateralCountryCode","mayCashAdvanceFeesApply","personalContextID","purchaseContextID","obFlow","OPEN_BANKING_FLOWS","ADD_BANK","isAShop","p2p_add_fi_screen_shown","fiFlowUrl","handleUserAgreementConsent","handleSubmit","REQUEST_USER_AGREEMENT_CONSENT","targetRoute","fullPath","getFullURL","refresh","reduxStore","rootURL","back","goBack","clydesdale","elo","maestro","regions","virgin","banorte","cofifis","mastercard","santander","barclays","cofinoga","hiper","nationwide","solo","visa","hipercard","natwest","aura","cb","credit","holding","star","yorkshire","aurire","cetelem","delta","hsbc","suntrust","aurora","chase","diners","huntington","switch","banamex","discover","jcb","pnc","td","bancomer","kiwi","postepay","us","citi","ec","lloyds","rbs","usaa","CDN_HOST_NAME","StyleSheet","externalProviderLogo","width","height","verticleLine","display","border","marginLeft","marginRight","marginFixProviderLogo","marginTop","buildBalanceToggleDisplayName","balanceSource","userAccountType","total_funds_in","currency_code","strippedNumber","formattedAmount","_BodyText","strong","generateSourceLogoUrls","isCardArtEnabled","thumbnail_logo_url","sourceName","getFundingSourceName","normalizedSourceName","toLowerCase","sourceLogoMap","normalizedInstrumentType","buildMultiCurrencyBalanceDisplayName","formattedCurrencyCodes","safelyGetDynamicPropertiesValue","safelyGetDynamicPropertiesValueENRTR","enRTRStrings","buildFundingSourceDisplayName","staticUtils","choice_name","shouldShowPaymentType","CREDIT","paymentType","lastFour","fi_last_4_content","cardName","buildFundingSourceDisplayNameENRTR","getFundingSourceNameENRTR","showENSubTextRTR","providerLogoUrl","css","alt","getPPCreditSpecialOfferText","workaroundScoreBot","setInnerHTML","ppcreditPromoFinancingOffer","PP_CREDIT_PROMO_STATE","NOT_APPLICABLE","ELIGIBLE","INELIGIBLE","HOLDING","getSingleBalanceName","getPaymentCardNetwork","PAYMENT_TOKEN","getPaymentTokenSourceName","getCreditName","BANK_ACCOUNT","bank_name","getSingleBalanceNameENRTR","getPaymentCardNetworkENRTR","getCreditNameENRTR","getUnclaimedBalanceDisplayName","getUnclaimedBalanceDisplaySubText","PAYMENT_TOKEN_TYPES","AMEX_P2P_PASS","generic_issuer_name","network","PAYMENT_CARDS","VISA","MASTERCARD","MASTER_CARD","MAESTRO","AMEX","DISCOVER","CHINA_UNION_PAY","provider","CREDIT_PROVIDERS","PLUS_CARD","VIRTUAL_LINE","EBAY_CARD","PAYPAL_CREDIT","buildBankDetails","bankDetails","title","getFundingNameType","funding_source","fi_name","fi_type","hasFundingBalanceInfo","getFundingSourceBalanceInfo","balance","LIVE_HOST_NAME","successHeader","successShopsHeader","giftSuccessHeader","youSent","youPaid","fee","recipientName","reactConversionRate","fundsAvailabilityDate","thirdPartyFees","giftBlurb","SPECIAL_LIMITS","NO_SPECIAL_LIMITS_VERIFIED_PPZ","NO_SPECIAL_LIMITS_VERIFIED_NO_PPZ_SEND_ENABLED","NO_SPECIAL_LIMITS_UNVERIFIED_SEND_ENABLED","NO_SPECIAL_LIMITS_NO_SEND_ENABLED","UNAVAILABLE","RECIPIENT_HAS_RESERVES_OR_RESTRICTIONS","needToCancel","needToCancelContent","aboutDisputes","aboutDisputesContent","agencyInfo","consumerFinance","optionsNewCreditCardExchangeRate","infoFee","infoLookForFee","infoBetterFee","infoSimpleFeeDisclaimer","instructionsNewForeignExchangeDisclaimer","infoNewFeeDisclaimer","outlookCopyQuestion","outlookCopyAnswer","outlookCopyHelpCenter","LINKS","US","PAYPAL_CREDIT_SEE_TERMS_LINK","isDOBValid","day","month","year","month_in_date","getMonth","contingencyNeedingDataCollection","_find","attributesToCollect","isTravelRule","isTravelRuleGovernmentId","isTravelRuleAddress","isGovernmentIdValid","GOVT_ID_TYPES","SSN","ITIN","ALIEN","PASSPORT","hasPOBox","poBoxContainMatches","poBoxExactMatches","testString","poBoxString","isCityPOBox","city","cityPOBoxes","hasAllNeededTravelRuleInfo","newTravelRuleAddress","hasPostcodeError","line1","line2","postcode","isTravelRuleAddressValid","massageTravelRuleDataForPost","trData","identifierIssuer","identifierValue","street1","street2","postalCode","browserColorDepth","screen","getTimezoneOffset","navigator","track3DS2PageImpression","fi_id","sel_fmx_tp","track3ds2PageStartDDC","sharedAnalytics","version","resp_duration","ddc_wait_time","ddc_start_time","analyticsPage","lookup_start_time","Spinner_start_time","Spinner_end_time","lookup_end_time","track3DS2EndDDC","wasSuccessful","ddc_end_time","was_successful","resolved","origin","removeEventListener","addEventListener","isFireAndForget","ddcCall","isBrowserBackPressedFor3DSFlow","hasResolvedDDCContingencies","hasResolved3DS2Contingencies","history","hasDDCContingency","fetchUnilateralRecipientChoices","onSingleRecipient","REQUEST_UNILATERAL_RECIPIENT_CHOICES","emails","phones","RECEIVED_UNILATERAL_RECIPIENT_CHOICES","updatedContact","ViewActions","enableContactConfidence","getRecipientFromContact","lastTransactionType","transaction_type","checkSenderElgibilty","isSenderPersonalPaymentDisabled","isSenderPurchasePaymentDisabled","checkandRedirectToHomeinfo","handleRecipientDetails","trackServiceAndClientDecision","serviceContext","suggestedPaymentType","default_payment_type","defaultPaymentType","ui_variant","payment_type_selection_behavior","selectionBehavior","suggested_payment_type","service_client_match","e","cal_correlation_id","correlationId","product_entry_point","productEntryPoint","usage_mode","usageMode","trackActivity","event_name","updateTxn","updateTxnSuccess","isV2","phoneConfirmData","STOP_LOADING","UPDATE_MONEY_PAGE","SendActions","togglePaymentTypeChoiceOverpanel","updateTxnFail","sendMoreInfoToAssessCapabilities","UPDATE_TOKEN","moreInfoIsNeededForAssessCapabilities","paymentTypeSelectionDecision","UPDATE_SUGGESTED_DESIGN","setContextID","CHANGE_IS_HARD_DEFAULT","isHardDefault","receiverFee","ADD_RECEIVER_FEE","PAYMENT_TYPE_FLOW_MAP","redirectToDolphin","DISABLE_PERSONAL_PAYMENT","DISABLE_PURCHASE_PAYMENT","REQUIRE_INSTRUMENT_ADDITION","phoneConfirmationPayload","redirectToHomeinfo","REDIRECT_TO_HOMEINFO","proceedWithClaim","CLAIM_PROCESS_LINKING","filteredPathArray","idx","txnNum","skipV2","contextData","CLAIM_ERROR","isLinkingFailed","linkingType","CLAIM_SUCCESS","isLinkingSuccess","ERROR_COMPLIANCE_DENIED","TRANSFER_BASE_URL","ERROR_PAYMENT_FAILURE","settingsError","settingsErrorCode","p2p_payment_type_screen_shown","receiver_country","receiver_currency","sender_currency","receiver_account_type","note_character_length","payment_type_selection_message","TOGGLE_PAYMENT_TYPE_CHOICE_OVERPANEL","updateTransactionData","hasFetchedFundingOptions","PayRequestActions","clearPurchaseProtection","INSTRUMENTATION","CLEAR_PURCHASE_PROTECTION","changedPurchaseProtection","PURCHASE_PROTECTION","SET_SUGGESTED_INSTRUMENT_CONTEXT","isRecipientCurrencyRestricted","RECIPIENT_CURRENCY_RESTRICTED","isNoteRestricted","NOTE_FIELD_IS_RESTRICTED","searchedContacts","isGSOnlyRecipient","isPhoneNumberMaybe","countryFeatures","defaultUnilateralRecipientToSenderCountry","hasSentToRecipient","getHasSentToContact","findRecipientInContacts","getHasSentToRecipient","isConfidentInRecipient","skipPaymentType","handleTransactionDetails","getIsConfidentInRecipient","getSkipPaymentType","fetchPeers","fetchBlockedPeers","LOADING_BLOCKED_CONTACTS","blockedContacts","RECEIVED_BLOCKED_CONTACTS","receivedBlockedPeers","retrievePeersDebounced","awesomeDebouncePromise","getSearchDebounceTime","time","searchDebounceTime","searchPeers","includeDirect","includeNonDirect","PEERS","SEARCHING_PEERS","identifier","PRODUCT_FLOWS","REQUEST","SEND","direct","include","nonDirect","bizDirect","bizNonDirect","yourContacts","directContacts","peopleOnPaypal","nonDirectContacts","receivedSearchedPeers","RETRIEVED_PEERS","SEARCH_ERROR","nonDirectTotalPages","bizDirectContacts","bizNonDirectContacts","bizNonDirectTotalPages","RECEIVED_SEARCHED_PEERS","showSearchError","receivedLoadedPeers","RECEIVED_LOADED_PEERS","receivedLoadedBusinesses","RECEIVED_LOADED_BUSINESSES","fetchContactActivities","receivedContactActivities","initializeMGMFlow","MGM_INIT","togglePhoneConfirmation","TOGGLE_PHONE_CONFIRMATION","initializeMGMAmount","MGM_CUSTOM_FIELDS","showMgmRecipientError","MGM_RECIPIENT_ERROR","toggleEncryptionFailed","ENCRYPTION_FAILED","funnelStarted","funnel","FUNNEL_STARTED","contactEngaged","CONTACT_ENGAGED","fetchFundingOptionsAndShowFundingOptionsOverpanel"],"mappings":"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","file":"138.esm.js","sourcesContent":["import _ from 'lodash'\nimport store from '../stores/configureStore'\n\nexport function getSessionDataPayload() {\n const typedRecipient = _.get(store.getState(), 'recipient.typedRecipient', '')\n const hasSeenNote = _.get(store.getState(), 'transaction.hasSeenNote', false)\n return { typedRecipient, hasSeenNote }\n}\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport loadable from 'react-loadable'\n\nconst Loading = ({ pastDelay }) =>\n pastDelay ? (\n
\n ) : null\n\nLoading.propTypes = {\n pastDelay: PropTypes.bool.isRequired,\n}\n\n/**\n * Do not show anything while loading\n * Useful when the loading component does not block user interaction\n */\nconst SilentLoading = () => null\n\nexport default (loader, showLoading = true) =>\n loadable({\n loader,\n loading: showLoading ? Loading : SilentLoading,\n delay: 900,\n })\n","import load from './lazy-load'\n\nexport const Send = load(() =>\n import(/* webpackChunkName: \"send-page\" */ './components/homepage/send-page')\n)\nexport const Request = load(() =>\n import(\n /* webpackChunkName: \"request-page\" */ './components/homepage/request-page'\n )\n)\nexport const ContactList = load(() =>\n import(\n /* webpackChunkName: \"contact-list\" */ './components/contacts/contact-list'\n )\n)\n\nexport const MiscFunnel = load(() =>\n import(\n /* webpackChunkName: \"more-funnel\" */ './components/homepage/more-funnel'\n )\n)\n\nexport const Preview = load(() =>\n import(\n /* webpackChunkName: \"universal-preview\" */ './components/preview/preview'\n )\n)\n\nexport const SendSuccess = load(() =>\n import(\n /* webpackChunkName: \"send-success\" */ './components/send-success-wrapper'\n )\n)\nexport const BuySuccess = load(() =>\n import(\n // bundle it together with send success as they are mostly the same and often loaded together\n /* webpackChunkName: \"send-success\" */ './components/buy-success-wrapper'\n )\n)\n\nexport const PayRequestSuccessRedux = load(() =>\n import(\n /* webpackChunkName: \"pay-request-success\" */ './components/pay-request-success'\n )\n)\nexport const Recipient = load(() =>\n import(\n /* webpackChunkName: \"recipient-redux\" */ './components/recipient-redux'\n )\n)\n\nexport const MGMLandingPage = load(() =>\n import(\n /* webpackChunkName: \"mgm-landing\" */ './components/mgm/mgmLandingPage'\n )\n)\n\n// Request flow\nexport const RequestSuccess = load(() =>\n import(\n /* webpackChunkName: \"request-success\" */ './components/requestSuccess'\n )\n)\n\n// bundle request preview in one file\nexport const MultiRequestSplitPreview = load(() =>\n import(\n /* webpackChunkName: \"request-preview\" */ './components/multi-split-request-preview'\n )\n)\n\n// Bill Splitting flow\nexport const BillSplitRequest = load(() =>\n import(\n // this is using the new request-base component, bundle them together\n /* webpackChunkName: \"request-page\" */ './components/homepage/request-page/request-layout-billsplit'\n )\n)\nexport const MultiRecipient = load(() =>\n import(\n /* webpackChunkName: \"multi-recipient-redux\" */ './components/multi-recipient-redux'\n )\n)\n\nexport const BillSplittingPreview = load(() =>\n import(\n /* webpackChunkName: \"request-preview\" */ './components/bill-splitting-preview'\n )\n)\nexport const BillSplittingSuccess = load(() =>\n import(\n /* webpackChunkName: \"request-success\" */ './components/bill-splitting-success'\n )\n)\n\nexport const FundingOptionSelector = load(() =>\n import(\n /* webpackChunkName: \"funding-option-selector\" */ './components/funding-option-selector'\n )\n)\n\n// Reveal flow\nexport const Reveal = load(() =>\n import(/* webpackChunkName: \"reveal\" */ './components/reveal')\n)\n\nexport const Unilateral = load(() =>\n import(\n /* webpackChunkName: \"unilateralMoneyClaimed\" */ './components/unilateralMoneyClaimed'\n )\n)\n\nexport const UnilateralClaimMoney = load(() =>\n import(\n /* webpackChunkName: \"unilateral-claim-money\" */ './components/unilateral-claim-money'\n )\n)\n\n// Guest flow, put all guest related stuff in one bundle for now\nexport const GuestLogin = load(() =>\n import(/* webpackChunkName: \"guest\" */ './containers/guest/guestLogin')\n)\nexport const GuestHeader = load(() =>\n import(/* webpackChunkName: \"guest\" */ './components/guestHeader')\n)\n\nexport const GuestPayRequestRecipientHeader = load(() =>\n import(\n /* webpackChunkName: \"guest\" */ './containers/guest/recipient-header-pay-request'\n )\n)\nexport const GuestPayPalPoolsRecipientHeader = load(() =>\n import(\n /* webpackChunkName: \"guest\" */ './containers/guest/recipient-header-pools'\n )\n)\nexport const GuestPayPalPoolsPreviewRecipientHeader = load(() =>\n import(\n /* webpackChunkName: \"guest\" */ './containers/guest/recipient-header-pools-preview'\n )\n)\nexport const GuestCreateAccount = load(() =>\n import(\n /* webpackChunkName: \"guest\" */ './containers/guest/createAccount/createAccount'\n )\n)\nexport const GuestPreview = load(() =>\n import(/* webpackChunkName: \"guest\" */ './containers/guest/preview')\n)\nexport const GuestLoginSuccess = load(() =>\n import(/* webpackChunkName: \"guest\" */ './containers/guest/guestLoginSuccess')\n)\nexport const SendSuccessHeader = load(() =>\n import(/* webpackChunkName: \"guest\" */ './containers/sendSuccessHeader')\n)\n\nexport const EditContacts = load(() =>\n import(\n /* webpackChunkName: \"edit-contacts\" */ './components/edit-contacts-bot'\n )\n)\n\nexport const SessionTimer = load(\n () =>\n import(\n /* webpackChunkName: \"sessionTimer\" */ 'react-components/sessionTimer'\n ),\n false\n)\n\n// other stuff\nexport const Overpanel = load(\n () =>\n import(/* webpackChunkName: \"overpanel\" */ 'react-components/overpanel'),\n false\n)\n\nexport const DisabledMassPayment = load(() =>\n import(\n /* webpackChunkName: \"disabled-mass-payment\" */ './components/errors/disabled-mass-payment'\n )\n)\nexport const MoneyClaimedError = load(() =>\n import(\n /* webpackChunkName: \"moneyClaimedError\" */ './components/moneyClaimedError'\n )\n)\n\nexport const ErrorCommon = load(\n () =>\n import(/* webpackChunkName: \"errorCommon\" */ './components/errorCommon'),\n false\n)\nexport const AddBillingAddressOverpanel = load(\n () =>\n import(\n /* webpackChunkName: \"addBillingAddressOverpanel\" */ './components/addBillingAddressOverpanel'\n ),\n false\n)\nexport const AddShippingAddressOverpanel = load(\n () =>\n import(\n /* webpackChunkName: \"addShippingAddressOverpanel\" */ './components/addShippingAddressOverpanel'\n ),\n false\n)\nexport const AddCardOverpanel = load(\n () =>\n import(\n /* webpackChunkName: \"addCardOverpanel\" */ './components/addCardOverpanel'\n ),\n false\n)\nexport const C2AddCardOverpanel = load(\n () =>\n import(\n /* webpackChunkName: \"c2AddCardOverpanel\" */ './components/c2AddCardOverpanel'\n ),\n false\n)\nexport const NotOverseasRecipient = load(\n () =>\n import(\n /* webpackChunkName: \"not-overseas-recipient\" */ './components/errors/not-overseas-recipient'\n ),\n false\n)\nexport const BRRecipient = load(\n () =>\n import(\n /* webpackChunkName: \"br-recipient\" */ './components/errors/br-recipient'\n ),\n false\n)\nexport const LATAMRecipient = load(\n () =>\n import(\n /* webpackChunkName: \"latam-recipient\" */ './components/errors/latam-recipient'\n ),\n false\n)\n\nexport const AddCardMessenger = load(() =>\n import(\n /* webpackChunkName: \"addCardMessenger\" */ './containers/addCardMessenger'\n )\n)\n\nexport const AboutCashAdvanceFees = load(() =>\n import(\n /* webpackChunkName: \"aboutCashAdvanceFees\" */ './components/cash-advance-fees-overpanel/cash-advance-fees-about'\n )\n)\n\nexport const ReferralCheckList = load(() =>\n import(\n /* webpackChunkName: \"ReferralChecklist\" */ './components/mgm/referral-checklist'\n )\n)\n\nexport const Chat = load(() =>\n import(/* webpackChunkName: \"chatComponent\" */ './components/chat')\n)\n\nexport const BlockContactList = load(() =>\n import(\n /* webpackChunkName: \"blockedContactList\" */ './components/contacts/blocked-contacts'\n )\n)\n\n/**\n * FEAT. Guest flow revamp: Info Collection page with OB integration.\n */\nexport const GuestInfoCollection = load(() =>\n import(\n /* webpackChunkName: \"guest\" */ './containers/guest/createAccount/guestRevampInfoCollection'\n )\n)\n\n/**\n * FEAT. Guest flow revamp: Info Collection page with OB integration.\n */\nexport const GuestRevampPostPaySignup = load(() =>\n import(\n /* webpackChunkName: \"guest\" */ './containers/guest/createAccount/guestRevampPostPaySignup'\n )\n)\n\n/**\n * FEAT. Guest flow revamp: Info Collection page with OB integration.\n */\nexport const MgmPSErrorPage = load(() =>\n import(/* webpackChunkName: \"guest\" */ './components/errors/mgm-ps-error')\n)\n\n/**\n * ULP Claim Share: Landing page for educating reciever about their emails and allowing to resending them again.\n */\nexport const ULPClaimSharePage = load(() =>\n import(/* webpackChunkName: \"guest\" */ './components/unilateral-claim-share')\n)\n\n/**\n * Visa Plus Screens (Onboard, Profile, NextSteps)\n */\nexport const Onboard = load(() =>\n import(\n /* webpackChunkName: \"VisaPlusOnboard\" */ './components/visa-plus/onboard'\n )\n)\n\nexport const Profile = load(() =>\n import(\n /* webpackChunkName: \"VisaPlusProfile\" */ './components/visa-plus/profile'\n )\n)\n\nexport const NextSteps = load(() =>\n import(\n /* webpackChunkName: \"VisaPlusNextSteps\" */ './components/visa-plus/nextsteps'\n )\n)\n\nexport const ConfirmPhone = load(() =>\n import(\n /* webpackChunkName: \"VisaPlusConfirmPhone\" */ './components/visa-plus/confirmPhone'\n )\n)\n\nexport const SendToApp = load(() =>\n import(\n /* webpackChunkName: \"VisaPlusSendToApp\" */ './components/visa-plus/sendToApp'\n )\n)\n","const PAYPAL_THEME = {\n \"name\": \"paypal\",\n \"mode\": \"light\",\n \"sysSizeIconXs\": \"1.125rem\",\n \"sysSizeIconSm\": \"1.5rem\",\n \"sysSizeIconMd\": \"2rem\",\n \"sysSizeIconLg\": \"3rem\",\n \"sysSizeIconXl\": \"4rem\",\n \"sysSizePictogramSm\": \"6rem\",\n \"sysSizePictogramMd\": \"8.5rem\",\n \"sysSizePictogramLg\": \"10rem\",\n \"sysSizeCircleXs\": \"1.5rem\",\n \"sysSizeCircleSm\": \"2rem\",\n \"sysSizeCircleMd\": \"3rem\",\n \"sysSizeCircleLg\": \"4rem\",\n \"sysSizeCircleXl\": \"6rem\",\n \"sysSizeTapTargetXs\": \"2.5rem\",\n \"sysSizeTapTargetSm\": \"2.75rem\",\n \"sysSizeTapTargetDefault\": \"3rem\",\n \"sysSizeTapTargetLg\": \"4rem\",\n \"sysSizePointerWidthSm\": \"0.75rem\",\n \"sysSizePointerWidthLg\": \"1rem\",\n \"sysSizeIndicatorXs\": \"0.1875rem\",\n \"sysSizeIndicatorSm\": \"0.25rem\",\n \"sysSizeIndicatorMd\": \"0.375rem\",\n \"sysSizeIndicatorLg\": \"0.5rem\",\n \"sysSizeFieldSm\": \"3rem\",\n \"sysSizeFieldLg\": \"4rem\",\n \"sysSizeMediaXs\": \"22rem\",\n \"sysSizeMediaSm\": \"36rem\",\n \"sysSizeMediaMd\": \"47rem\",\n \"sysSizeMediaLg\": \"64rem\",\n \"sysSizeMediaXl\": \"72rem\",\n \"sysSizeMediaXxl\": \"90rem\",\n \"sysSpaceTiny\": \"0.125rem\",\n \"sysSpaceXs\": \"0.25rem\",\n \"sysSpaceSm\": \"0.5rem\",\n \"sysSpaceMd\": \"0.75rem\",\n \"sysSpaceLg\": \"1rem\",\n \"sysSpaceXl\": \"1.5rem\",\n \"sysSpaceJumbo\": \"2rem\",\n \"sysElevationLevel1Yoffset\": \"0.0625rem\",\n \"sysElevationLevel1Opacity\": 0.08,\n \"sysElevationLevel1Blur\": \"0.75rem\",\n \"sysElevationLevel2Yoffset\": \"0.125rem\",\n \"sysElevationLevel2Opacity\": 0.1,\n \"sysElevationLevel2Blur\": \"0.875rem\",\n \"sysElevationLevel3Yoffset\": \"0.125rem\",\n \"sysElevationLevel3Opacity\": 0.1,\n \"sysElevationLevel3Blur\": \"1.125rem\",\n \"sysElevationBlurCurve\": 1,\n \"sysElevationBlurSlope\": -1,\n \"sysElevationBlurBase\": \"0.625rem\",\n \"sysElevationOpacity\": 0.15,\n \"sysElevationBrightenFactor\": 0.02,\n \"sysElevationVerticalOffsetRatio\": 1,\n \"sysElevationHorizontalOffsetRatio\": 0,\n \"sysMotionTimingX1\": 0,\n \"sysMotionTimingY1\": 0.9,\n \"sysMotionTimingX2\": 0.3,\n \"sysMotionTimingY2\": 1,\n \"sysMotionDurationHover\": \"0.10s\",\n \"sysMotionDurationAction\": \"0.20s\",\n \"sysMotionDurationArrive\": \"0.50s\",\n \"sysMotionDurationDepart\": \"0.30s\",\n \"sysMotionDurationRepeat\": \"1.30s\",\n \"sysMotionDurationLinger\": \"7.00s\",\n \"sysBorderThicknessNormal\": \"0.0625rem\",\n \"sysBorderThicknessEmphasis\": \"0.125rem\",\n \"sysBorderThicknessFocus\": \"0.1875rem\",\n \"sysBorderThicknessFocusOutline\": \"0.375rem\",\n \"sysBorderRadiusXs\": \"0.125rem\",\n \"sysBorderRadiusSm\": \"0.25rem\",\n \"sysBorderRadiusMd\": \"0.5rem\",\n \"sysBorderRadiusLg\": \"0.75rem\",\n \"sysBorderRadiusInteractive\": \"50%\",\n \"sysTypographyDisplayFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyDisplaySize\": \"4.5rem\",\n \"sysTypographyDisplayWeight\": 400,\n \"sysTypographyDisplayLineHeight\": \"4.875rem\",\n \"sysTypographyDisplayMaxScaleFactor\": 1.25,\n \"sysTypographyHeadingLgFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyHeadingLgSize\": \"2.75rem\",\n \"sysTypographyHeadingLgWeight\": 400,\n \"sysTypographyHeadingLgLineHeight\": \"3rem\",\n \"sysTypographyHeadingLgMaxScaleFactor\": 1.5,\n \"sysTypographyHeadingSmFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyHeadingSmSize\": \"1.75rem\",\n \"sysTypographyHeadingSmWeight\": 400,\n \"sysTypographyHeadingSmLineHeight\": \"2.25rem\",\n \"sysTypographyHeadingSmMaxScaleFactor\": 1.5,\n \"sysTypographyTitleStrongFamily\": \"PayPalOpen-Bold\",\n \"sysTypographyTitleStrongSize\": \"1.375rem\",\n \"sysTypographyTitleStrongWeight\": 400,\n \"sysTypographyTitleStrongLineHeight\": \"1.75rem\",\n \"sysTypographyTitleStrongMaxScaleFactor\": 2,\n \"sysTypographyTitleFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyTitleSize\": \"1.375rem\",\n \"sysTypographyTitleWeight\": 400,\n \"sysTypographyTitleLineHeight\": \"1.75rem\",\n \"sysTypographyTitleMaxScaleFactor\": 2,\n \"sysTypographyBodyStrongFamily\": \"PayPalOpen-Bold\",\n \"sysTypographyBodyStrongSize\": \"1.125rem\",\n \"sysTypographyBodyStrongWeight\": 400,\n \"sysTypographyBodyStrongLineHeight\": \"1.5rem\",\n \"sysTypographyBodyStrongMaxScaleFactor\": 2,\n \"sysTypographyBodyFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyBodySize\": \"1.125rem\",\n \"sysTypographyBodyWeight\": 400,\n \"sysTypographyBodyLineHeight\": \"1.5rem\",\n \"sysTypographyBodyMaxScaleFactor\": 2,\n \"sysTypographyCaptionStrongFamily\": \"PayPalOpen-Bold\",\n \"sysTypographyCaptionStrongSize\": \"0.875rem\",\n \"sysTypographyCaptionStrongWeight\": 400,\n \"sysTypographyCaptionStrongLineHeight\": \"1.25rem\",\n \"sysTypographyCaptionStrongMaxScaleFactor\": 2,\n \"sysTypographyCaptionFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyCaptionSize\": \"0.875rem\",\n \"sysTypographyCaptionWeight\": 400,\n \"sysTypographyCaptionLineHeight\": \"1.25rem\",\n \"sysTypographyCaptionMaxScaleFactor\": 2,\n \"sysTypographyButtonLgFamily\": \"PayPalOpen-Bold\",\n \"sysTypographyButtonLgSize\": \"1.125rem\",\n \"sysTypographyButtonLgWeight\": 400,\n \"sysTypographyButtonLgLineHeight\": \"1.5rem\",\n \"sysTypographyButtonLgMaxScaleFactor\": 2,\n \"sysTypographyButtonSmFamily\": \"PayPalOpen-Bold\",\n \"sysTypographyButtonSmSize\": \"0.875rem\",\n \"sysTypographyButtonSmWeight\": 400,\n \"sysTypographyButtonSmLineHeight\": \"1.25rem\",\n \"sysTypographyButtonSmMaxScaleFactor\": 2,\n \"sysTypographyFieldLabelLgFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyFieldLabelLgSize\": \"1.125rem\",\n \"sysTypographyFieldLabelLgWeight\": 400,\n \"sysTypographyFieldLabelLgLineHeight\": \"1.5rem\",\n \"sysTypographyFieldLabelLgMaxScaleFactor\": 2,\n \"sysTypographyFieldLabelSmFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyFieldLabelSmSize\": \"0.875rem\",\n \"sysTypographyFieldLabelSmWeight\": 400,\n \"sysTypographyFieldLabelSmLineHeight\": \"1.25rem\",\n \"sysTypographyFieldLabelSmMaxScaleFactor\": 2,\n \"sysTypographyFieldValueXlFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyFieldValueXlSize\": \"2.75rem\",\n \"sysTypographyFieldValueXlWeight\": 400,\n \"sysTypographyFieldValueXlLineHeight\": \"3rem\",\n \"sysTypographyFieldValueXlMaxScaleFactor\": 1.5,\n \"sysTypographyFieldValueLgFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyFieldValueLgSize\": \"1.75rem\",\n \"sysTypographyFieldValueLgWeight\": 400,\n \"sysTypographyFieldValueLgLineHeight\": \"2.25rem\",\n \"sysTypographyFieldValueLgMaxScaleFactor\": 2,\n \"sysTypographyFieldValueSmFamily\": \"PayPalOpen-Regular\",\n \"sysTypographyFieldValueSmSize\": \"1.125rem\",\n \"sysTypographyFieldValueSmWeight\": 400,\n \"sysTypographyFieldValueSmLineHeight\": \"1.5rem\",\n \"sysTypographyFieldValueSmMaxScaleFactor\": 2,\n \"sysColorBackgroundMain\": \"#faf8f5\",\n \"sysColorBackgroundAlt\": \"#f1ede8\",\n \"sysColorBackgroundSurface\": \"#ffffff\",\n \"sysColorBackgroundSurfaceHover\": \"#faf8f5\",\n \"sysColorBackgroundSurfaceActive\": \"#f1ede8\",\n \"sysColorBackgroundHighContrast\": \"#001435\",\n \"sysColorBackgroundMediumContrast\": \"#545d68\",\n \"sysColorPrimaryMain\": \"#003087\",\n \"sysColorPrimaryMainHover\": \"#0070e0\",\n \"sysColorPrimaryMainActive\": \"#001c64\",\n \"sysColorPrimaryContrast\": \"#ffffff\",\n \"sysColorPrimaryContrastHover\": \"#b9effc\",\n \"sysColorPrimaryContrastActive\": \"#5bbbfc\",\n \"sysColorSecondaryMain\": \"#0070e0\",\n \"sysColorSecondaryMainHover\": \"#5bbbfc\",\n \"sysColorSecondaryMainActive\": \"#003087\",\n \"sysColorSecondaryContrast\": \"#ffffff\",\n \"sysColorTertiaryMain\": \"#faf8f5\",\n \"sysColorTertiaryMainHover\": \"#f1ede8\",\n \"sysColorTertiaryMainActive\": \"#e6e0d9\",\n \"sysColorTertiaryContrast\": \"#003087\",\n \"sysColorFeaturedMain\": \"#ffd140\",\n \"sysColorFeaturedMainHover\": \"#ffe888\",\n \"sysColorFeaturedMainActive\": \"#ff9100\",\n \"sysColorFeaturedContrast\": \"#003087\",\n \"sysColorUnselectedMain\": \"#e6e0d9\",\n \"sysColorUnselectedMainHover\": \"#faf8f5\",\n \"sysColorUnselectedMainActive\": \"#f1ede8\",\n \"sysColorUnselectedContrast\": \"#545d68\",\n \"sysColorSelectedMain\": \"#0070e0\",\n \"sysColorSelectedMainHover\": \"#5bbbfc\",\n \"sysColorSelectedMainActive\": \"#003087\",\n \"sysColorSelectedContrast\": \"#ffffff\",\n \"sysColorSelectedRangeMain\": \"#b9effc\",\n \"sysColorSelectedRangeMainHover\": \"#5bbbfc\",\n \"sysColorSelectedRangeMainActive\": \"#0070e0\",\n \"sysColorSelectedRangeContrast\": \"#003087\",\n \"sysColorLinkMain\": \"#0070e0\",\n \"sysColorLinkMainHover\": \"#003087\",\n \"sysColorLinkMainActive\": \"#003087\",\n \"sysColorLinkAlt\": \"#001435\",\n \"sysColorLinkAltHover\": \"#001435\",\n \"sysColorLinkAltActive\": \"#001435\",\n \"sysColorLinkContrast\": \"#ffffff\",\n \"sysColorLinkContrastHover\": \"#b9effc\",\n \"sysColorLinkContrastActive\": \"#5bbbfc\",\n \"sysColorOverlayMain\": \"rgba(0, 0, 0, 0.55)\",\n \"sysColorOverlayMainHover\": \"rgba(0, 0, 0, 0.4)\",\n \"sysColorOverlayMainActive\": \"rgba(0, 0, 0, 0.7)\",\n \"sysColorOverlayContrast\": \"#ffffff\",\n \"sysColorAccent1Main\": \"#003087\",\n \"sysColorAccent1Contrast\": \"#ffffff\",\n \"sysColorAccent2Main\": \"#e02d50\",\n \"sysColorAccent2Contrast\": \"#ffffff\",\n \"sysColorAccent3Main\": \"#388c00\",\n \"sysColorAccent3Contrast\": \"#ffffff\",\n \"sysColorAccent4Main\": \"#7252cc\",\n \"sysColorAccent4Contrast\": \"#ffffff\",\n \"sysColorErrorMain\": \"#c40b0b\",\n \"sysColorErrorMainHover\": \"#ff5a6d\",\n \"sysColorErrorMainActive\": \"#9b0021\",\n \"sysColorErrorContrast\": \"#ffffff\",\n \"sysColorWarningMain\": \"#ffbe4a\",\n \"sysColorWarningMainHover\": \"#ffe888\",\n \"sysColorWarningMainActive\": \"#ff9100\",\n \"sysColorWarningAlt\": \"#e85e00\",\n \"sysColorWarningContrast\": \"#001435\",\n \"sysColorSuccessMain\": \"#0f7013\",\n \"sysColorSuccessMainHover\": \"#6fc400\",\n \"sysColorSuccessMainActive\": \"#388c00\",\n \"sysColorSuccessContrast\": \"#ffffff\",\n \"sysColorSystemMain\": \"#001435\",\n \"sysColorSystemMainHover\": \"#929496\",\n \"sysColorSystemMainActive\": \"#545d68\",\n \"sysColorSystemContrast\": \"#ffffff\",\n \"sysColorInfoMain\": \"#e6e0d9\",\n \"sysColorInfoMainHover\": \"#faf8f5\",\n \"sysColorInfoMainActive\": \"#f1ede8\",\n \"sysColorInfoContrast\": \"#001435\",\n \"sysColorSpecialtyMain\": \"#7252cc\",\n \"sysColorSpecialtyMainHover\": \"#b976ff\",\n \"sysColorSpecialtyMainActive\": \"#24247f\",\n \"sysColorSpecialtyContrast\": \"#ffffff\",\n \"sysColorStructureBorderHighContrast\": \"#929496\",\n \"sysColorStructureBorderLowContrast\": \"rgba(0, 0, 0, 0.1)\",\n \"sysColorStructureDivider\": \"#f1ede8\",\n \"sysColorStructureFocus\": \"#097ff5\",\n \"sysColorStructureFocusOutline\": \"rgba(209, 229, 249, 0.9)\",\n \"sysColorStructureErrorOutline\": \"rgba(224, 45, 80, 0.16)\",\n \"sysColorStructureScrim\": \"rgba(0, 0, 0, 0.4)\",\n \"sysColorStructureShimmer\": \"#e6e0d9\",\n \"sysColorStructureShimmerInverse\": \"#545d68\",\n \"sysColorStructureSheen\": \"rgba(255, 255, 255, 0.7)\",\n \"sysColorStructureShadow\": \"#000000\"\n};\n\nexport { PAYPAL_THEME };\n","import Events from 'lib/analytics/eventTags'\nimport { parseSearch } from './url-utils'\nimport serverProps from './serverProps'\n\nconst MGM_SUB_FLOW = 'mgm_send_money'\n\nexport function getTrafficSource(href) {\n const { mgmTrafficSource = '' } = serverProps\n return mgmTrafficSource || getTrafficSourceFromUrl(href)\n}\n\nexport function getTrafficSourceFromUrl(href) {\n const params = href ? parseSearch(href) : parseSearch()\n const { traffic_source = '' } = params\n return traffic_source\n}\n\nexport function setMgmTrackingCommonProps(href) {\n const source = getTrafficSource(href)\n Events.updateCommonProps({\n sub_flow: MGM_SUB_FLOW,\n ...(source && { source }),\n })\n}\n","// @flow\n/*\n * Unprotected Goods and Services has some weird analytic page names.\n */\n\nimport * as fpti from '../../lib/analytics/fpti'\nimport { tracking } from '../../lib/analytics/mParticle'\nimport Events from '../../lib/analytics/eventTags'\nimport { isEmail } from '../../../../shared/validators'\nimport { getPreferredFundingSource } from './funding-option-utils'\nimport { PAYMENT_TYPE, transactionTypeMap } from '../../../../lib/constants'\nimport store from '../stores/configureStore'\n\nconst pageActionMap = {\n // start of guest specific analytics\n guestSelectFF: {\n link: 'chooseFF',\n pageGroup: 'main:p2p:unified:flow::option',\n pageName: 'main:p2p:unified:flow::option:node::',\n extra: {\n fltp: 'f&f',\n },\n },\n guestSelectGS: {\n link: 'chooseGS',\n pageGroup: 'main:p2p:unified:flow::option',\n pageName: 'main:p2p:unified:flow::option:node::',\n extra: {\n fltp: 'g&s',\n },\n },\n guestRedirectTesla: {\n link: 'signUpAndCreateAcct',\n pageGroup: 'main:p2p:guest:start',\n pageName: 'main:p2p:guest:start::',\n extra: {},\n },\n guestSend: {\n link: 'Continue',\n pageGroup: 'main:p2p:guest:start',\n pageName: 'main:p2p:guest:start::',\n },\n guestReview: {\n link: 'Agree and send money',\n pageGroup: 'main:p2p:guest:preview',\n pageName: 'main:p2p:guest:preview::',\n },\n // end of guest specific analytics\n // pay request send button\n payRequestSend: {\n link: 'Send',\n pageGroup: 'main:p2p:payrequest::review',\n pageName: 'main:p2p:payrequest::review::',\n extra: {},\n },\n // establish set of canonical field names\n paymentChoice: {\n pageGroup: 'main:p2p:unified:flow::option',\n pageName: 'main:p2p:unified:flow::option:node::',\n extra: {},\n },\n sellerPaysFee: {\n link: 'sellerpays',\n pageGroup: 'main:p2p:unified:flow::option',\n pageName: 'main:p2p:unified:flow::option:node::',\n extra: {},\n },\n senderPaysFee: {\n link: 'buyercovers',\n pageGroup: 'main:p2p:unified:flow::option',\n pageName: 'main:p2p:unified:flow::option:node::',\n extra: {},\n },\n ffPreview: {\n pageGroup: 'main:p2p:unified:send::review',\n pageName: 'main:p2p:unified:send::review:node::',\n extra: {},\n },\n gsPreview: {\n pageGroup: 'main:p2p:unified:buy::review',\n pageName: 'main:p2p:unified:buy::review:node::',\n extra: {},\n },\n continue: {\n link: 'continue',\n pageGroup: 'main:p2p:unified:flow::option',\n pageName: 'main:p2p:unified:flow::option:node::',\n extra: {},\n },\n selectFF: {\n link: 'friendsnfamily',\n eventData: () => {\n const { recipient } = store.getState()\n\n return Events.p2p_payment_type_toggle_pressed({\n protection_design: recipient.moneyPageOverPanel,\n payment_type: 'personal',\n suggested_protection_design: recipient.suggestedDesign,\n })\n },\n pageGroup: 'main:p2p:unified:flow::option',\n pageName: 'main:p2p:unified:flow::option:node::',\n extra: {},\n },\n selectGS: {\n link: 'goodsnservices',\n type: 'cl',\n eventData: () => {\n const { recipient } = store.getState()\n\n return Events.p2p_payment_type_toggle_pressed({\n protection_design: recipient.moneyPageOverPanel,\n payment_type: 'purchase',\n suggested_protection_design: recipient.suggestedDesign,\n })\n },\n pageGroup: 'main:p2p:unified:flow::option',\n pageName: 'main:p2p:unified:flow::option:node::',\n extra: {},\n },\n onFFchangePaymentType: {\n link: 'change',\n pageGroup: 'main:p2p:unified:send::review',\n pageName: 'main:p2p:unified:send::review:node::',\n extra: {},\n },\n onGSchangePaymentType: {\n link: 'change',\n pageGroup: 'main:p2p:unified:buy::review',\n pageName: 'main:p2p:unified:buy::review:node::',\n extra: {},\n },\n onFFclickNoteField: {\n link: 'note',\n pageGroup: 'main:p2p:unified:send::review',\n pageName: 'main:p2p:unified:send::review:node::',\n extra: {},\n },\n onGSclickNoteField: {\n link: 'note',\n pageGroup: 'main:p2p:unified:buy::review',\n pageName: 'main:p2p:unified:buy::review:node::',\n extra: {},\n },\n onClickSendPaymentNow: {\n link: 'Send Payment Now',\n pageGroup: 'main:p2p::cards:authenticate_with_card_network',\n pageName: 'main:p2p::cards:authenticate_with_card_network::',\n extra: {},\n },\n purchaseProtection: {\n link: 'purchaseprotection',\n eventData: () => {\n const { recipient } = store.getState()\n\n return Events.p2p_payment_type_terms_pressed({\n protection_design: recipient.moneyPageOverPanel,\n suggested_protection_design: recipient.suggestedDesign,\n })\n },\n pageGroup: 'main:p2p:unified:flow::option',\n pageName: 'main:p2p:unified:flow::option:node::',\n extra: {},\n },\n // checkbox variant\n enableProtection: {\n link: 'changeEnabled',\n pageGroup: 'main:p2p:unified:buy::review',\n pageName: 'main:p2p:unified:buy::review:node::',\n extra: {},\n },\n disableProtection: {\n link: 'changeDisabled',\n pageGroup: 'main:p2p:unified:send::review',\n pageName: 'main:p2p:unified:send::review:node::',\n extra: {},\n },\n paymentChoicePanelSend: {\n pageGroup: 'main:p2p:unified:flow:send:option',\n pageName: 'main:p2p:unified:flow:send:option:node::',\n extra: {},\n },\n paymentChoicePanelBuy: {\n pageGroup: 'main:p2p:unified:flow:buy:option',\n pageName: 'main:p2p:unified:flow:buy:option:node::',\n extra: {},\n },\n eligiblePurchases: {\n link: 'eligiblepurchases',\n pageGroup: 'main:p2p:unified:flow::option',\n pageName: 'main:p2p:unified:flow::option:node::',\n extra: {},\n },\n}\n\nexport function getUnifiedSendAnalyticInfo(pageAction: string) {\n return pageActionMap[pageAction]\n}\n\nexport function trackImpressionUnifiedSend(\n pageAction: string,\n extraAnalytics: any = {}\n) {\n const { pageGroup, pageName, extra } = pageActionMap[pageAction]\n fpti.trackImpression(pageGroup, pageName, {\n ...extra,\n flfr: window.flfr,\n ...extraAnalytics,\n })\n}\n\nexport function trackCancelBtn() {\n const { recipient } = store.getState()\n tracking(\n Events.p2p_payment_type_cancel_pressed({\n suggested_protection_design: recipient.suggestedDesign,\n protection_design: recipient.moneyPageOverPanel,\n })\n )\n fpti.trackLinkWithData(\n 'cancel',\n 'main:p2p:unified:flow::option',\n 'main:p2p:unified:flow::option:node::',\n {},\n 'link',\n {}\n )\n}\n\nexport function getPageGroup(\n flowType: string,\n recipient: string,\n isReview: boolean\n) {\n if (flowType === 'payRequest') {\n return `main:p2p:payrequest::review`\n }\n\n return `main:p2p:unified:${flowType === 'buy' ? 'buy' : 'send'}::review`\n}\n\nexport function getPageName(\n flowType: string,\n recipient: string,\n isReview: boolean\n) {\n if (isReview) {\n if (flowType === 'payRequest') {\n return `main:p2p:payrequest::review:node::`\n }\n\n return `main:p2p:unified:${\n flowType === 'buy' ? 'buy' : 'send'\n }::review:node::`\n }\n return getAmountPageTrackingStrings(flowType, recipient).pageName\n}\n\nexport function getAmountPageTrackingStrings(\n flowType: string,\n recipient: string\n) {\n const emailOrPhone = isEmail(recipient) ? 'email' : 'phone'\n const pageGroup = `main:p2p:unified:${flowType}::${emailOrPhone}`\n const pageName = `main:p2p:unified:${flowType}::${emailOrPhone}:node::`\n\n return {\n pageGroup,\n pageName,\n }\n}\n\nexport function trackAmountPageImpression(\n flowType: string,\n recipient: string,\n data: any = {}\n) {\n /* This is to track the recurring type for protections experiment. This\n does not include the external flow.\n */\n const { external, recipient: receiver } = store.getState()\n if (!external.env && receiver) {\n data.recurring_type = receiver.recurringType || 'none'\n data.rcvr_acct_type = receiver.recipientAccountType || ''\n }\n\n const { pageGroup, pageName } = getAmountPageTrackingStrings(\n flowType,\n recipient\n )\n fpti.trackImpression(pageGroup, pageName, data)\n}\n\nexport function trackAmountPageClick(\n flowType: string,\n recipient: string,\n linkName: string\n) {\n const { pageGroup, pageName } = getAmountPageTrackingStrings(\n flowType,\n recipient\n )\n fpti.trackLinkWithData(linkName, pageGroup, pageName, {}, 'link', {})\n}\n\nexport function trackClickUnifiedSend(\n pageAction: string,\n extraData: Object = {}\n) {\n const { link, pageGroup, pageName, extra, eventData } = pageActionMap[\n pageAction\n ]\n if (typeof eventData === 'function') {\n // eventData property recently added for mParticle data or any other future tracking sdk\n tracking(eventData())\n }\n fpti.trackLinkWithData(\n link,\n pageGroup,\n pageName,\n Object.assign(extra, extraData),\n 'link',\n {}\n )\n}\n\nexport function trackClick3ds2(page: string, extraAnalytics: any = {}) {\n const { link, pageGroup, pageName } = pageActionMap[page]\n fpti.trackLinkWithData(link, pageGroup, pageName, extraAnalytics, 'link', {})\n}\n\n/* Track payment choice, page and pgrp changes depending on current page\n * Please see section titled: Clicking on 'Change Payment Type' button\n * https://engineering.paypalcorp.com/confluence/pages/viewpage.action?pageId=375228475\n */\nexport function trackGuestClickPmtChoice() {\n const pageName = location.pathname.endsWith('/preview')\n ? 'main:p2p:guest:preview:'\n : 'main:p2p:guest:start:::'\n\n const pageGroup = location.pathname.endsWith('/preview')\n ? 'main:p2p:guest:preview'\n : 'main:p2p:guest:start'\n\n const linkName = 'ChangePmtType'\n\n fpti.trackLinkWithData(linkName, pageGroup, pageName, {}, 'link', {})\n}\n\n/* Tracks when guest returns to page after selecting payment choice\n * Please see section titled: Return to Guest Start Page\n * https://engineering.paypalcorp.com/confluence/pages/viewpage.action?pageId=375228475\n *\n */\nexport function trackGuestReturnToPagePmtChoice(pageAction: string) {\n const { pageGroup, link, extra } = pageActionMap[pageAction]\n const pageLink = `${pageGroup}|${link}`\n\n const newPageName = location.pathname.endsWith('/preview')\n ? 'main:p2p:guest:preview:'\n : 'main:p2p:guest:start:::'\n const newPageGroup = location.pathname.endsWith('/preview')\n ? 'main:p2p:guest:preview'\n : 'main:p2p:guest:start'\n\n const data = {\n pglk: pageLink,\n }\n\n if (extra.fltp) {\n fpti.setPersistentBeaconData('fltp', extra.fltp)\n }\n\n fpti.trackImpression(newPageGroup, newPageName, data)\n}\n\nexport function getAnalytics({\n selectedFundingOption,\n fundingOptions,\n flowType = '',\n}: {\n selectedFundingOption: FundingOption,\n fundingOptions: FundingOption[],\n flowType: string,\n}) {\n const preferred = getPreferredFundingSource(fundingOptions) || { id: '' }\n const selectedFOExists = !!Object.keys(selectedFundingOption).length\n const dflFmxId =\n selectedFOExists &&\n selectedFundingOption.funding_sources.map(source => source.id)\n const usingPreferred =\n selectedFOExists &&\n selectedFundingOption.funding_sources.some(source => source.isPreferred)\n\n const paymentType = transactionTypeMap[flowType]\n const fltp = paymentType === PAYMENT_TYPE.PURCHASE ? 'g&s' : 'f&f'\n const dfl_fmxid = dflFmxId ? dflFmxId.toString() : 'nodefault'\n const pref_fmxid = preferred.id || 'notset'\n const is_pref = usingPreferred ? 'Y' : 'N'\n // indicating user lands on preview page without coming from funding option selection page\n const flfr = 'start'\n\n return { fltp, dfl_fmxid, pref_fmxid, is_pref, flfr }\n}\n","// the mismatch of latestAmountFetchTime and requestedTime means there's other requests issued\n// during the fetch time. Discard the response since it no longer contains the correct amount\nexport function requestMatchesResponse(requestTime = 0, responseTime = 0) {\n return requestTime.toString() === responseTime.toString()\n}\n","/**\n * Action Utils - Helpers for the Actions file\n */\n\nimport { isUndefined } from 'lodash'\nimport invariant from 'invariant'\n\n/**\n * We only get fetch the new amount if the amount is valid and one of the following are true:\n * - The previousAmount is specified and different from the amount\n * - The previousCurrencyCode is specified and different from the currencyCode\n *\n * If the amount is what changed, then the previousAmount should be specified.\n * If the currency code is what changed, then the previousCurrencyCode should be specified.\n *\n * @param {String} amount - the new amount (with US formatting)\n * @param {String} previousAmount - the previous amount (with US formatting) if that's what changed\n * @param {String} currencyCode - the currencyCode of the amount\n * @param {String} previousCurrencyCode - the previous currency code if that's what changed\n * @return {Boolean} whether the data provided should be used to fetch a new amount\n */\nfunction shouldFetchNewAmount(\n amount,\n previousAmount,\n currencyCode,\n previousCurrencyCode\n) {\n invariant(\n typeof amount === 'string' || typeof amount === 'undefined',\n 'Amount should always be a string'\n )\n invariant(\n typeof previousAmount === 'string' || typeof previousAmount === 'undefined',\n 'Amount should always be a string'\n )\n invariant(\n arguments.length >= 4,\n 'shouldFetchNewAmount is missing required arguments'\n )\n\n // parse the amount to make sure it seems legit\n const amountNumber = parseFloat(amount)\n const isValidAmount = amountNumber > 0\n\n // amount changed if the previous amount was undefined\n // or if the new amount is diff than the old amount\n const amountDiffers = amountNumber !== parseFloat(previousAmount)\n const amountChanged = isUndefined(previousAmount) || amountDiffers\n\n // also check if the currency code changed\n const currencyCodeDiffers = currencyCode !== previousCurrencyCode\n const currencyCodeChanged =\n isUndefined(previousCurrencyCode) || currencyCodeDiffers\n\n // if the new amount/code are valid and at least one thing changed, we should fetch\n const hasValidAmountAndCode = isValidAmount && currencyCode\n const shouldFetch =\n hasValidAmountAndCode && (amountChanged || currencyCodeChanged)\n\n return shouldFetch\n}\n\n/**\n * returns true if the given amount string is 0\n * @param {String} amount the amount to test\n * @return {Boolean} whether it's 0\n */\nfunction isZero(amount: string) {\n return Number(amount.replace(/\\D+/g, '')) === 0\n}\n\n// all exports should go here (at the bottom) to make finding the exposed API easier\nexport { shouldFetchNewAmount, isZero }\n","/**\n * This file (for now) contains all actions that can be dispatched (store.dispatch({})).\n * These are all the actions that can be dispatched.\n *\n * These actions are called from async actions (in this file) as well as from UI components that\n * are dispatching actions.\n */\n\nimport { get, isEmpty } from 'lodash'\nimport $ from 'jquery'\nimport log from 'loglevel'\nimport { fetch, post, deleteAjax, patch } from '../../calculator/lib/xhr'\nimport { INSTRUMENTATION_TYPES, ActionTypes as types } from '../constants'\nimport { routeTo } from '../utils/routeHelper'\nimport { removeMailto } from '../utils/remove-mailto'\nimport { getUrlFragment } from '../utils/url-utils'\nimport { requestMatchesResponse } from '../utils/requestMatchesResponse'\nimport { shouldFetchNewAmount, isZero } from '../../calculator/actions/utils'\nimport { isPhone, isEmail } from '../../../../shared/validators'\nimport {\n getUSNumberFormatter,\n getLocalizedNumberFormatter,\n} from '../../lib/amountUtils'\nimport serverProps from '../utils/serverProps'\nimport { prepareXBInitialState } from '../utils/xbFeeCalcUtils'\nimport { mapDefaultCurrencyKeys } from '../../experiments/defaultCurrency'\nimport { changeUnilateralCountryCode } from './unilateral'\nimport { addCPLData, setPersistentData } from '../../lib/analytics/fpti'\nimport { decorateContact } from 'lib/contact-utils'\nimport {\n toggleContactBlockedOverpanel,\n toggleContactUnblockedOverpanel,\n} from 'transfer/actions/overpanels'\nimport { trackContactBlockedErrorImpression } from 'transfer/utils/blockUnblockAnalytics'\n\nimport { fromChoiceToReview } from './analytics-helpers'\nimport React from 'react'\nimport {\n Preview,\n MultiRequestSplitPreview,\n RequestSuccess,\n} from '../lazy-components'\nimport { ENV_TYPE } from '../../../../lib/constants'\nimport * as UnifiedActions from './unified-actions'\nimport { tracking } from '../../lib/analytics/mParticle'\nimport Events from '../../lib/analytics/eventTags'\n\n// create some number formatting functions with the proper decimal separator\nconst { currencyFormat: { decimal = '.' } = {} } = serverProps\nconst formatLocalizedNumber = getLocalizedNumberFormatter(decimal)\nconst formatUSNumber = getUSNumberFormatter(decimal)\n\n/**\n * Helper to reduce boilerplate for `meta` for analytics\n * @param {String} type tracking type [error, action (doesn't change pageName), normal (changes pageName)]\n * @param {String} payload the stuff we need to track (linkName, pageName, etc)\n * @return {Object} analytics metadata\n */\nexport function getAnalyticsMeta(type, payload) {\n return { analytics: { type, payload } }\n}\n\nexport function showError(\n err,\n {\n silenceFpti = false,\n customComp = { use: false, name: null },\n onClosed,\n } = {}\n) {\n if (err && (err.code === 'blockedSend' || err.code === 'blockedRequest')) {\n trackContactBlockedErrorImpression()\n }\n\n log.error(err)\n return {\n type: types.ERROR.SHOW_ERROR_OVERPANEL,\n meta: silenceFpti\n ? undefined\n : getAnalyticsMeta(INSTRUMENTATION_TYPES.ERROR, { error: err }),\n data: {\n error: {\n ...err,\n // special case here because the server can sometimes send HTML\n // for the content. There is no user input in these messages\n // so it's fine, but if there ever were to be, the server would\n // have to make sure and escape that content themselves, otherwise\n // this would open us up to a XSS attack\n // eslint-disable-next-line react/no-danger\n renderedMessage: (\n
\n ),\n customComponent: customComp,\n onClosed,\n },\n },\n }\n}\n\nexport function showErrorPage(err) {\n return {\n type: types.ERROR.SHOW_ERROR_PAGE,\n data: {\n error: err,\n },\n }\n}\n\nexport function handleError(dispatch) {\n return function onError(err) {\n dispatch(showError(err))\n }\n}\n\n/**\n * Handy function to reset the window to position 0,0\n */\nexport function resetScrollPosition() {\n $(document.body).animate({ scrollTop: 0 }, 400)\n}\n\nexport function changeSelectedFundingOption(id, analyticsData = {}) {\n return {\n type: types.TRANSACTION.CHANGE_SELECTED_FUNDING_OPTION,\n meta:\n Object.keys(analyticsData).length && fromChoiceToReview(analyticsData),\n data: { id },\n }\n}\n\nexport function changeInstallmentPlan(paymentTimes) {\n paymentTimes = parseInt(paymentTimes, 10) || 0\n return {\n type: types.TRANSACTION.CHANGE_SELECTED_INSTALLMENT_PLAN,\n data: { paymentTimes },\n }\n}\n\nexport function changeCountry(country) {\n return (dispatch, getState) => {\n const { server: { guestSupportedCountries = [] } = {} } = getState()\n\n const countryCanGuest = guestSupportedCountries.includes(country)\n\n dispatch({\n type: types.USER.CHANGE_COUNTRY,\n data: {\n country,\n countryCanGuest,\n },\n })\n }\n}\n\nexport function changeEmail(email) {\n return {\n type: types.USER.CHANGE_EMAIL,\n data: { email },\n }\n}\n\nexport function changeIsPurchase(\n isPurchase,\n { isToggle = false, shouldDefaultToSuggestedPaymentType } = {}\n) {\n return dispatch => {\n const pageGroup = `main:p2p:buy::review`\n const pageName = `main:p2p:buy:review:node::`\n const nextPageGroup = `main:p2p:send::review`\n const nextPageName = `main:p2p:send::review:node::`\n const linkName = 'gotofnf'\n\n if (!isToggle) {\n dispatch({\n type: types.TRANSACTION.CHANGE_IS_PURCHASE,\n data: { isPurchase, shouldDefaultToSuggestedPaymentType },\n })\n } else {\n dispatch({\n type: types.TRANSACTION.CHANGE_IS_PURCHASE,\n meta: getAnalyticsMeta(INSTRUMENTATION_TYPES.PAGE_CHANGE, {\n linkName,\n pageGroup: pageGroup,\n pageName: pageName,\n nextPageGroup: nextPageGroup,\n nextPageName: nextPageName,\n trackType: 'link',\n }),\n data: { isPurchase, shouldDefaultToSuggestedPaymentType },\n })\n }\n }\n}\n\nexport function hasRedirectedFromSend() {\n return (dispatch, getState) => {\n const { recipient: { recipient = '' } = {} } = getState()\n\n const emailOrPhone = isEmail(recipient) ? 'email' : 'phone'\n const pageGroup = `main:p2p:send::${emailOrPhone}`\n const pageName = `main:p2p:send::${emailOrPhone}`\n const nextPageGroup = `main:p2p:buy::review`\n const nextPageName = `main:p2p:buy::review:node::`\n const linkName = 'gotogns'\n\n dispatch({\n type: types.TRANSACTION.HAS_REDIRECT_FROM_SEND,\n meta: getAnalyticsMeta(INSTRUMENTATION_TYPES.PAGE_CHANGE, {\n linkName,\n pageGroup: pageGroup,\n pageName: pageName,\n nextPageGroup: nextPageGroup,\n nextPageName: nextPageName,\n trackType: 'link',\n }),\n })\n }\n}\n\nexport function changeFirstName(firstName) {\n return {\n type: types.USER.CHANGE_FIRST_NAME,\n data: { firstName },\n }\n}\n\nexport function changeLastName(lastName) {\n return {\n type: types.USER.CHANGE_LAST_NAME,\n data: { lastName },\n }\n}\n\nexport function changePhoneNumber(phoneNumber) {\n return {\n type: types.USER.CHANGE_PHONE_NUMBER,\n data: { phoneNumber },\n }\n}\n\nexport function changePrimaryCurrencyCode(primaryCurrencyCode) {\n return {\n type: types.USER.CHANGE_PRIMARY_CURRENCY_CODE,\n data: { primaryCurrencyCode },\n }\n}\n\nexport function changeGovernmentId(governmentId) {\n return {\n type: types.USER.CHANGE_GOVT_ID,\n data: { governmentId },\n }\n}\n\nexport function changeSelectedGovernmentIDType(selectedGovernmentIdType) {\n return {\n type: types.USER.CHANGE_SELECTED_GOVERNMENT_ID_TYPE,\n data: { selectedGovernmentIdType },\n }\n}\n\nexport function changeBirthDay(birthDay) {\n return {\n type: types.USER.CHANGE_BIRTH_DAY,\n data: { birthDay },\n }\n}\n\nexport function changeBirthMonth(birthMonth) {\n return {\n type: types.USER.CHANGE_BIRTH_MONTH,\n data: { birthMonth },\n }\n}\n\nexport function changeBirthYear(birthYear) {\n return {\n type: types.USER.CHANGE_BIRTH_YEAR,\n data: { birthYear },\n }\n}\n\nfunction updateRecipientCurrencies({\n recipientCurrencyCode,\n recipientCurrencies,\n recipientCurrencyMap,\n}) {\n return {\n type: types.AMOUNT.UPDATE_RECIPIENT_CURRENCIES,\n data: { recipientCurrencyCode, recipientCurrencies, recipientCurrencyMap },\n }\n}\n\n/**\n * Callback for {@link fetchContacts}.\n */\nexport function receivedContacts({\n otherContacts = [],\n topContacts = [],\n topSendContacts = [],\n topReceiveContacts = [],\n}) {\n return {\n type: types.CONTACTS.RECEIVED_CONTACTS,\n data: {\n otherContacts,\n topContacts,\n topSendContacts,\n topReceiveContacts,\n },\n receivedAt: Date.now(),\n }\n}\n\nexport function receivedSearchedContacts({\n topContacts = [],\n otherContacts = [],\n}) {\n return {\n type: types.CONTACTS.RECEIVED_SEARCHED_CONTACTS,\n data: {\n contacts: [...topContacts, ...otherContacts],\n topContacts,\n otherContacts,\n },\n receivedAt: Date.now(),\n }\n}\n\nexport function receivedContactActivityData({ transactions }, emailOrPhone) {\n return {\n type: types.CONTACTS.RECEIVED_CONTACT_DATA,\n data: {\n [emailOrPhone]: transactions,\n },\n receivedAt: Date.now(),\n }\n}\n\n/**\n * Called when first entering a flow. Fetches contacts from the server via AJAX\n * call and calls {@link receivedContacts} with the response data.\n */\nexport function fetchContacts() {\n return (dispatch, getState) => {\n const {\n contacts: { hasFetchedContacts, hasUpdatedContacts } = {},\n server: { env = '' },\n } = getState()\n // The pisp flow does not require fetching contacts\n // Fetching contacts can potentially cause user to be autologged out\n // if proper scopes are not in place due to being unauthorized\n if (env === ENV_TYPE.PISP) {\n return\n }\n\n if (!hasFetchedContacts || hasUpdatedContacts) {\n fetch('/myaccount/transfer/contacts')\n .then(response => {\n dispatch(receivedContacts(response))\n })\n .catch(handleError(dispatch))\n }\n }\n}\n\nexport function searchContacts(query) {\n return (dispatch, getState) => {\n const { contacts: { contacts } = {} } = getState()\n if (contacts.length >= 100) {\n post('/myaccount/transfer/peers/search', { query })\n .then(response => {\n dispatch(\n receivedSearchedContacts({\n topContacts: [],\n otherContacts: get(response, 'directContacts', []),\n })\n )\n })\n // not essential; fail silently if a search fails\n .catch(() => {})\n }\n }\n}\n\nexport function updateFavorite(contactId, isFavorite) {\n return dispatch => {\n dispatch({\n type: types.CONTACTS.FAVORITE_CONTACT,\n data: { contactId, isFavorite },\n })\n const data = { isFavorite }\n const url = `/myaccount/transfer/peers/${contactId}/favorite`\n patch(url, data)\n .then(response => {\n dispatch(updatedFavorite(contactId, isFavorite))\n })\n .catch(updatedFavorite(contactId, !isFavorite))\n }\n}\n\nexport function updatedFavorite(contactId, isFavorite) {\n return {\n type: types.CONTACTS.FAVORITED_CONTACT,\n data: { contactId, isFavorite },\n }\n}\n\nexport function fetchContactActivityData(emailOrPhone) {\n const url = `/myaccount/transfer/contacts/${emailOrPhone}`\n return (dispatch, getState) => {\n if (getState().contacts.activityData[emailOrPhone] || !emailOrPhone) {\n return\n }\n fetch(url)\n .then(response => {\n dispatch(receivedContactActivityData(response, emailOrPhone))\n })\n .catch(handleError(dispatch))\n }\n}\n\nexport function updateContactBlock({ id = '', isBlock = false }) {\n return dispatch => {\n dispatch({ type: types.CONTACTS.UPDATE_CONTACT_BLOCK })\n\n return patch(`/myaccount/transfer/peers/${id}/block`, { isBlock })\n .then(() => {\n dispatch(updatedContactBlock({ id, isBlock }))\n\n if (isBlock) {\n dispatch(toggleContactBlockedOverpanel({ show: true }))\n } else {\n dispatch(toggleContactUnblockedOverpanel({ show: true }))\n }\n })\n .catch(handleError(dispatch))\n }\n}\n\nexport function updatedContactBlock({ id = '', isBlock = false }) {\n return { type: types.CONTACTS.UPDATED_CONTACT_BLOCK, data: { id, isBlock } }\n}\n\n/**\n * Called when first entering a flow. Fetches contacts from the server via AJAX\n * call and calls {@link receivedContacts} with the response data.\n */\nexport function deleteContact(contactId = '') {\n return dispatch => {\n dispatch({ type: types.CONTACTS.DELETE_CONTACT, data: { contactId } })\n let url\n const data = {}\n // NOTE contact IDs from contactbookmgmtserv v1 start with CID whereas contacts from\n // contactbookmgmtserv v2 start with PID (this is an invariant that will never change)\n // which we use instead of current flow or experimentation because it is insufficient\n // TODO remove this once fully migrated to contactbookmgmtserv v2 contact model\n if (contactId && contactId[0] === 'P') {\n url = `/myaccount/transfer/peers/${contactId}`\n } else {\n url = '/myaccount/transfer/contacts'\n data.contactId = contactId\n }\n return deleteAjax(url, data)\n .then(() => {\n dispatch(deletedContact(contactId))\n })\n .catch(handleError(dispatch))\n }\n}\n\nexport function deletedContact(contactId) {\n return { type: types.CONTACTS.DELETED_CONTACT, data: { contactId } }\n}\n\n/**\n * Called when move from recipient to amount page (only in default currency condition).\n * Fetches recipient details from the server via AJAX\n */\nexport function fetchRecipientDetails(contact, linkName, isContact, flowType) {\n // prefetch chunk file\n Preview.preload()\n\n contact = removeMailto(contact) // remove 'mailto:' from email\n const { email: recipient } = contact\n\n return (dispatch, getState) => {\n dispatch({ type: types.CROSS_BORDER.REQUEST_RECIPIENT_DETAILS }) // Show spinner\n return fetch('/myaccount/transfer/recipientDetails', {\n recipient,\n isPurchase: flowType === 'buy',\n payerId: contact.payerId,\n networkId: contact.networkId,\n })\n .then(\n ({ data: { recipientDetails = {}, beaconClientMetaDataId = '' } }) => {\n dispatch({ type: types.CROSS_BORDER.RECEIVED_RECIPIENT_DETAILS }) // Hide spinner\n if (beaconClientMetaDataId) {\n dispatch({\n type: types.TRANSACTION.SET_FRAUDNET_CLIENT_METADATA,\n data: { beaconClientMetaDataId },\n })\n }\n\n if (recipientDetails.triggerSenderPhoneConfirmation) {\n dispatch({ type: types.USER.TRIGGER_SENDER_PHONE_CONFIRMATION })\n }\n\n dispatch({\n type: types.TRANSACTION.CHANGE_HIGHLIGHTED_PAYMENT_TYPE,\n data: {\n highlightPaymentType: recipientDetails.highlightPaymentType,\n },\n })\n\n if (recipientDetails.paymentTypeSelectionMessage) {\n dispatch({\n type: types.TRANSACTION.UPDATE_PAYMENT_TYPE_SELECTION_MESSAGE,\n data: {\n message: recipientDetails.paymentTypeSelectionMessage,\n },\n })\n }\n\n if (recipientDetails.paymentTypeTogglePersonalMessage) {\n dispatch({\n type:\n types.TRANSACTION.UPDATE_PAYMENT_TYPE_TOGGLE_PERSONAL_MESSAGE,\n data: {\n message: recipientDetails.paymentTypeTogglePersonalMessage,\n },\n })\n }\n\n if (recipientDetails.paymentTypeTogglePurchaseMessage) {\n dispatch({\n type:\n types.TRANSACTION.UPDATE_PAYMENT_TYPE_TOGGLE_PURCHASE_MESSAGE,\n data: {\n message: recipientDetails.paymentTypeTogglePurchaseMessage,\n },\n })\n }\n\n dispatch({\n type: types.TRANSACTION.CHANGE_RECOMMENDED_PAYMENT_TYPE,\n data: {\n recommendedPaymentType: recipientDetails.recommendedPaymentType,\n },\n })\n\n if (\n recipientDetails.paymentTypeTransitions &&\n !isEmpty(recipientDetails.paymentTypeTransitions)\n ) {\n dispatch({\n type: types.TRANSACTION.UPDATE_PAYMENT_TYPE_TRANSITIONS,\n data: {\n paymentTypeTransitions: recipientDetails.paymentTypeTransitions,\n },\n })\n }\n\n dispatch(UnifiedActions.setContextID(recipientDetails))\n\n dispatch(\n selectContact(contact, linkName, isContact, recipientDetails)\n )\n\n // prepare data for XB\n const data = prepareXBInitialState(recipientDetails, getState())\n dispatch(setXBInitialState(data))\n // prepare data for domestic\n dispatch(updateRecipientCurrencies(recipientDetails))\n\n if (recipientDetails.recipientCountryIsInferred) {\n // autofill the country code for the user based on what we inferred.\n // they can change it if we got it wrong\n // this will also have the effect of always sending the country code\n // even if we're not in the RTR case (and therefore don't require\n // the user provide the country).\n dispatch(\n changeUnilateralCountryCode(recipientDetails.recipientCountryCode)\n )\n }\n\n routeTo(`${getUrlFragment()}/preview`)\n }\n )\n .catch(handleError(dispatch))\n }\n}\n\nexport function advanceToRequestReview(pn, pg, extra) {\n // preload chunk file\n MultiRequestSplitPreview.preload()\n\n const linkName = 'clickRecipientNext'\n const pageGroup = pg || 'main:p2p:request::start'\n const pageName = pn || 'main:p2p:request::start:node::'\n\n return (dispatch, getState) => {\n const {\n transaction: { transactionIds = '' } = {},\n server: { businessAccountInfo = {}, isEnrolledInBillSplitting } = {},\n billSplitting: {\n partnerDisplayName: partnerName,\n counterParty,\n category,\n },\n multiRecipient: { recipients = [] },\n } = getState()\n\n // Consumer: Single Request => request\n // Consumer: Multi Request => request && flnm\n // Business: Multi Request => request::multi\n const requestBeaconType = businessAccountInfo.isBusinessUser ? 'multi' : ''\n const flnm = partnerName ? 'split_money' : 'request_multi'\n const data = {\n ...(!businessAccountInfo.isBusinessUser &&\n isEnrolledInBillSplitting && { flnm }),\n ...(partnerName && { mname: partnerName }),\n ...(counterParty && { mname: counterParty, pp_flow: '8Ball', category }),\n contact_count: recipients.length,\n }\n\n const nextPageGroup = `main:p2p:request:${requestBeaconType}:review`\n const nextPageName = `main:p2p:request:${requestBeaconType}:review:node::`\n\n dispatch({\n type: '',\n meta: getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION_WITH_DATA, {\n linkName,\n pageGroup: pageGroup,\n pageName: pageName,\n data: { ...data, transactionIds, ...extra },\n nextPageGroup: nextPageGroup,\n nextPageName: nextPageName,\n trackType: 'link',\n }),\n })\n }\n}\n\nexport function selectUnilateralContact(contact) {\n return {\n type: types.RECIPIENT.SELECT_UNILATERAL_CONTACT,\n data: { contact },\n }\n}\n\nexport function selectContact(\n contact,\n linkName,\n isContact,\n recipientDetails = {},\n enableAnalytics = true\n) {\n const urlPathName = window.location.pathname || ''\n const isGiftRoute = urlPathName.includes('gift')\n\n // For unprotected goods and services\n const flowTypes = ['send', 'buy', 'gift', 'request', 'homepage']\n let flowType = flowTypes.find(flow => urlPathName.includes(flow)) || ''\n\n // the url is `homepage` but the actual flow type is called `unified`\n if (flowType === 'homepage') {\n flowType = 'unified'\n }\n\n const emailOrPhone = isEmail(contact.email) ? 'email' : 'phone'\n\n const pageGroup = `main:p2p:${flowType}::start`\n const pageName = `main:p2p:${flowType}::start:node::`\n\n const nextPageGroup = `main:p2p:${flowType}::${emailOrPhone}`\n const nextPageName = `${nextPageGroup}:node::`\n\n const meta = enableAnalytics\n ? getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION_WITH_DATA, {\n linkName,\n pageGroup: pageGroup,\n pageName: pageName,\n data: {\n ...mapDefaultCurrencyKeys(recipientDetails),\n pp_flow: isGiftRoute ? 'p2p_gift' : undefined,\n },\n nextPageGroup: nextPageGroup,\n nextPageName: nextPageName,\n trackType: 'link',\n })\n : null\n\n if (contact && recipientDetails) {\n contact = decorateContact(contact, recipientDetails)\n }\n\n return {\n type: types.RECIPIENT.SELECT_CONTACT,\n meta,\n data: { contact },\n }\n}\n\n/**\n * Called when a contact is selected from ContactCircles or autocomplete\n * dropdown.\n * @param {Object} contact The contact object that was selected.\n */\nexport function multiSelectContact(contact) {\n return {\n type: types.RECIPIENTS.SELECT_CONTACT,\n data: { contact },\n }\n}\n\n/**\n * Called when a recipient is removed.\n * @param {Object} recipient The recipient object that was removed.\n */\nexport function removeRecipient(recipient) {\n return {\n type: types.RECIPIENTS.REMOVE_RECIPIENT,\n data: { recipient },\n }\n}\n\n/**\n * This action is called when a new selected recipient is new focused.\n * @param {number} index - The new index of the focused selected recipient.\n */\nexport function changeSelectedRecipientIndex(index) {\n return {\n type: types.RECIPIENTS.CHANGE_SELECTED_RECIPIENT_INDEX,\n data: { index },\n }\n}\n\nexport function changeRecipient(recipient) {\n const recipientIsEmail = isEmail(recipient)\n const recipientIsPhone = isPhone(recipient)\n const isRecipientValid = recipientIsEmail || recipientIsPhone\n\n return {\n type: types.RECIPIENT.CHANGE_RECIPIENT,\n data: { recipient, isRecipientValid },\n }\n}\n\nexport function changeTypedRecipient(recipient) {\n return {\n type: types.RECIPIENT.CHANGE_TYPED_RECIPIENT,\n data: { recipient },\n }\n}\n\n/**\n * Called when the value of the current typed-out recipient has changed.\n * @param {string} currentRecipient - The new value of the typed-out recipient.\n */\nexport function changeCurrentRecipient(currentRecipient) {\n return {\n type: types.RECIPIENTS.CHANGE_CURRENT_RECIPIENT,\n data: { currentRecipient },\n }\n}\n\n/**\n * Called when the display name of the current typed-out recipient has changed.\n * @param {string} displayName - The new value of the display name of the\n * typed-out recipient.\n */\nexport function changeCurrentRecipientDisplayName(displayName) {\n return {\n type: types.RECIPIENTS.CHANGE_CURRENT_RECIPIENT_DISPLAY_NAME,\n data: { displayName },\n }\n}\n\nexport function resetMultiRecipients() {\n return (dispatch, getState) => {\n dispatch({\n type: types.RECIPIENTS.RESET_RECIPIENTS,\n data: getState().contacts,\n })\n }\n}\n\nexport function changeAmount(amount) {\n return {\n type: types.AMOUNT.CHANGE_AMOUNT,\n data: { amount },\n }\n}\n\nexport function changeCVVCode(cvv) {\n return {\n type: types.TRANSACTION.CHANGE_CVV_CODE,\n data: { cvv },\n }\n}\n\nexport function toggleSenderAccountInfo() {\n return {\n type: types.USER.TOGGLE_SENDER_HELPER_INFORMATION,\n }\n}\n\n/**\n * Called when currency code is updated in Preview page\n * @param {string} newCurrency\n */\nexport function changeCurrency(newCurrency) {\n return (dispatch, getState) => {\n const { currencyCode } = getState().amount\n if (newCurrency !== currencyCode) {\n dispatch({\n type: types.AMOUNT.CHANGE_CURRENCY,\n data: {\n currencyCode: newCurrency,\n },\n })\n }\n }\n}\n/**\n * Called when currency code is updated in Request Preview page\n * @param {string} newCurrency\n */\nexport function changeRequestCurrency(newCurrency) {\n return (dispatch, getState) => {\n const { currencyCode } = getState().amount\n if (newCurrency !== currencyCode) {\n dispatch({\n type: types.AMOUNT.CHANGE_REQUEST_CURRENCY,\n data: {\n requestCurrencyCode: newCurrency,\n },\n })\n }\n }\n}\n\nexport function changeNote(note) {\n return {\n type: types.NOTE.CHANGE_NOTE,\n data: { note },\n }\n}\n\nexport function mandatoryNoteMissing(missing) {\n return {\n type: types.NOTE.REQUIRED_FIELD_ERROR,\n data: { missing },\n }\n}\n\nexport function changeGiftOption(giftOption) {\n return {\n type: types.GIFT_OPTIONS.CHANGE_OPTION,\n data: { giftOption },\n }\n}\n\nexport function routeToPPDG(recipient) {\n return dispatch => {\n return post('/myaccount/transfer/ppdg', { recipient })\n .then(response => {\n if (response && response.data) {\n window.location = `${window.location.protocol}//${window.location.host}/gifts/categories/send-a-gift?ctxId=${response.data}`\n } else {\n handleError(dispatch)\n }\n })\n .catch(handleError(dispatch))\n }\n}\n\nexport function changeGiftAidCheckbox(flag) {\n return {\n type: types.EXTERNAL.CHANGE_GIFTAID,\n data: flag,\n }\n}\n\n/**\n * Callback for {@link requestMoney}.\n * @param {Object} data - Response data from server.\n */\nexport function requestedMoney(data) {\n return {\n type: types.TRANSACTION.REQUESTED_MONEY,\n data: data,\n requestedAt: Date.now(),\n }\n}\n\nfunction isAgreementConsentRequired(\n userAgreementConsentRequired,\n hasResolvedUserAgreementConsent\n) {\n return userAgreementConsentRequired && !hasResolvedUserAgreementConsent\n}\n\n/**\n * Posts request-money request to the server and calls {@link requestedMoney}\n * with the response data.\n */\nexport function requestMoney({\n recipient,\n recipients,\n amount,\n currencyCode,\n note,\n purchaseConsentChecked,\n purchaseConsentRequired,\n userAgreementConsentRequired,\n userAgreementConsentMinVersion,\n userAgreementConsentMaxVersion,\n hasResolvedUserAgreementConsent,\n}) {\n // preload chunk file\n RequestSuccess.preload()\n\n // Allows for compatibility between single-recipient and multi-recipient flows.\n const recipientField = recipient\n ? { recipient }\n : {\n recipients: recipients.map(_recipient => ({\n recipient: _recipient.recipient,\n payerId: _recipient.payerId,\n })),\n }\n\n return (dispatch, getState) => {\n const {\n server: {\n env,\n psd2: { token: psd2Token = '' },\n businessAccountInfo = {},\n isEnrolledInBillSplitting,\n hasConfirmedEmail,\n } = {},\n } = getState()\n\n const requestBeaconType = businessAccountInfo.isBusinessUser ? 'multi' : ''\n const ct_cnt = recipients && recipients.length\n\n // Consumer: Single Request => request\n // Consumer: Multi Request => request && flnm\n // Business: Multi Request => request::multi\n const analyticsData = {\n ct_cnt,\n ...(!businessAccountInfo.isBusinessUser &&\n isEnrolledInBillSplitting && { flnm: 'request_multi' }),\n email: hasConfirmedEmail ? 'confirmed' : 'not_confirmed',\n }\n\n const pageGroup = `main:p2p:request:${requestBeaconType}:review`\n const pageName = `main:p2p:request:${requestBeaconType}:review:node::`\n const nextPageGroup = `main:p2p:request:${requestBeaconType}:done`\n const nextPageName = `main:p2p:request:${requestBeaconType}:done:node::`\n\n dispatch({\n type: types.TRANSACTION.REQUEST_MONEY,\n meta: getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION_WITH_DATA, {\n linkName: 'requestDone',\n pageGroup,\n pageName,\n data: analyticsData,\n persistKey: 'regularRequest',\n nextPageGroup,\n nextPageName,\n trackType: 'link',\n }),\n })\n\n const data = {\n env,\n psd2Token,\n ...recipientField,\n amount,\n currencyCode,\n description: note.trim(), // trim the note before submitting\n purchaseConsentChecked,\n purchaseConsentRequired,\n }\n\n if (\n isAgreementConsentRequired(\n userAgreementConsentRequired,\n hasResolvedUserAgreementConsent\n )\n ) {\n tracking(\n Events.active_consent_disclaimer_agree_pressed({\n flow: 'p2p_request_money',\n policy_major_version: userAgreementConsentMaxVersion,\n policy_minor_version: userAgreementConsentMinVersion,\n })\n )\n\n data.userAgreementConsentRequired = userAgreementConsentRequired\n data.userAgreementConsentMinVersion = userAgreementConsentMinVersion\n data.userAgreementConsentMaxVersion = userAgreementConsentMaxVersion\n }\n\n post('/myaccount/transfer/request', data)\n .then(response => {\n const {\n data: responseData = {},\n ppmeClaimUrl = '',\n showPPMeIframe = false,\n } = response\n const {\n amountFormatted,\n requestId,\n requestLegId,\n payRequestLink,\n transactionIds,\n } = responseData\n const requestedMoneyPayload = {\n amountFormatted,\n requestId,\n requestLegId,\n ppmeClaimUrl,\n showPPMeIframe,\n transactionIds,\n payRequestLink,\n }\n\n addCPLData({ req_id: requestId, trid: transactionIds })\n setPersistentData('regularRequest', {\n req_id: requestId,\n trid: transactionIds,\n })\n\n return fetch('/myaccount/transfer/personalization/impression/')\n .then(result => {\n const pStudioContent = get(\n result,\n 'data.clientData.pStudioContent',\n {}\n )\n requestedMoneyPayload.pStudioContent = pStudioContent\n })\n .catch(handleError(dispatch))\n .finally(() => {\n dispatch(requestedMoney(requestedMoneyPayload))\n\n if (\n isAgreementConsentRequired(\n userAgreementConsentRequired,\n hasResolvedUserAgreementConsent\n )\n ) {\n dispatch({\n type: types.TRANSACTION.RESOLVE_USER_AGREEMENT_CONSENT,\n })\n }\n routeTo(`${getUrlFragment().replace('preview', 'success')}`, {\n replace: true,\n })\n })\n })\n .catch(handleError(dispatch))\n }\n}\n\n/**\n * Called when the user leaves the success page.\n */\nexport function leavingSuccessPage() {\n return {\n type: types.TRANSACTION.LEAVING_SUCCESS_PAGE,\n }\n}\n\n/**\n * Called when the user presses the \"Cancel\" button.\n */\nexport function cancelledTransaction() {\n return {\n type: types.TRANSACTION.CANCELLED_TRANSACTION,\n }\n}\n\nexport function submittingRecipient({ selectedType = '' } = {}) {\n return {\n type: types.TRANSACTION.SUBMITTING_RECIPIENT,\n data: {\n selectedType,\n },\n }\n}\n\n/**\n * Cross Border Stuff\n */\n\nexport function changeDestinationCurrencyCode(code, { shouldFireAnalytics }) {\n const pagename = 'main:consumer:p2p:transfer:contact'\n return {\n type: types.CROSS_BORDER.CHANGE_DESTINATION_CURRENCY_CODE,\n meta:\n shouldFireAnalytics &&\n getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION_WITH_DATA, {\n linkName: 'currencyChange',\n pageGroup: pagename,\n pageName: pagename,\n data: { rcur: code },\n trackType: 'link',\n }),\n data: {\n currencyCode: code,\n },\n }\n}\n\nexport function changeOriginCurrencyCode({\n fromCurrencyCode,\n shouldFireAnalytics = true,\n}) {\n const pagename = 'main:consumer:p2p:transfer:contact'\n return {\n type: types.CROSS_BORDER.CHANGE_ORIGIN_CURRENCY_CODE,\n meta:\n shouldFireAnalytics &&\n getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION_WITH_DATA, {\n linkName: 'currencyChange',\n pageGroup: pagename,\n pageName: pagename,\n data: { sndcc: fromCurrencyCode },\n trackType: 'link',\n }),\n data: {\n currencyCode: fromCurrencyCode,\n },\n }\n}\n\nexport function fetchOriginAmount(data) {\n return getFetch(data, {\n url: '/myaccount/transfer/fx/rates/received',\n currencyCode: data.toCurrencyCode,\n preFetchAction: requestOriginAmount,\n onFetchSuccessAction: receiveOriginAmount,\n })\n}\n\nexport function fetchDestinationAmount(data) {\n return getFetch(data, {\n url: '/myaccount/transfer/fx/rates/sent',\n currencyCode: data.fromCurrencyCode,\n preFetchAction: requestDestinationAmount,\n onFetchSuccessAction: receiveDestinationAmount,\n })\n}\n\nexport function fetchExchangeRate(data) {\n return function doFetch(dispatch, getState) {\n const { fromCurrencyCode, toCurrencyCode, isPurchase } = data\n const { token } = getState().recipient\n // we're overriding the amount because we don't care about the amount,\n // it just needs to be something so we can make the call to get the exchange rate\n const fakeAmount = '1'\n const fakeToCountryCode = 'US'\n const fakeFromCountryCode = 'US'\n // once we get a proper endpoint, we wont need to fake out the amount\n // but for now, we'll just use this endpoint\n const url = '/myaccount/transfer/fx/rates/sent'\n const currentTime = Date.now()\n dispatch(\n requestExchangeRate({\n ...data,\n latestExchangeRateFetchTime: currentTime,\n })\n )\n\n const dataToSend = {\n amount: fakeAmount,\n toCountryCode: fakeToCountryCode,\n fromCountryCode: fakeFromCountryCode,\n // the next two fields are the only things that really matter for this call\n // but all fields are required for the call to succeed\n fromCurrencyCode,\n toCurrencyCode,\n requestedTime: currentTime,\n isPurchase,\n token,\n }\n return fetch(url, dataToSend)\n .then(response => {\n const { latestExchangeRateFetchTime } = getState().crossBorder // Yeah it is `crossBorder` rather than `loading` here\n if (\n !requestMatchesResponse(\n latestExchangeRateFetchTime,\n response.data.requestedTime\n )\n ) {\n return\n }\n\n dispatch(receiveExchangeRate(data, response))\n dispatch(updateFxQuoteId(response.data.fxQuoteId))\n return response\n })\n .catch(handleErrorFromFailedRequest(dispatch))\n }\n}\n\n/**\n * Risk merchandise\n */\nexport function changePurchaseLocation(mtgplace) {\n return {\n type: types.TRANSACTION.CHANGE_PURCHASE_LOCATION,\n data: { mtgplace },\n }\n}\n\nexport function changeItemCategory(category) {\n return {\n type: types.TRANSACTION.CHANGE_ITEM_CATEGORY,\n data: { category },\n }\n}\n\nexport function updateFxQuoteId(fxQuoteId) {\n return {\n type: types.CROSS_BORDER.RECEIVED_FX_QUOTE_ID,\n data: {\n fxQuoteId: fxQuoteId || '',\n },\n }\n}\n\n/**\n * This function abstracts common logic between the fetchOriginAmount and fetchDestinationAmount\n * actions. It returns a function that accepts a `dispatch` which it will use to dispatch events\n * before and after the fetch request (on succes or failure). It allows you to configure what\n * action creators to call to generate the action for the dispatch for each of these.\n * @param {Object} data - the data needed for the request and determining whether the request should be sent\n * @param {Object} options - The options for what URL to hit, the currencyCode to use for precision and action creators to call\n * @return Function - the function to invoke that accepts a dispatch and performs the request\n */\nfunction getFetch(data, options) {\n const {\n amount,\n previousAmount,\n fromCurrencyCode,\n fromCountryCode,\n toCurrencyCode,\n previousCurrencyCode,\n toCountryCode,\n currencyChanged,\n isPurchase,\n token,\n } = data\n const { url, currencyCode, preFetchAction, onFetchSuccessAction } = options\n\n const preciseAmount = formatLocalizedNumber(currencyCode, amount)\n if (\n !shouldFetchNewAmount(\n formatUSNumber(preciseAmount),\n formatUSNumber(previousAmount),\n currencyCode,\n previousCurrencyCode\n )\n ) {\n if (currencyChanged) {\n return fetchExchangeRate(data)\n }\n return function noop() {}\n }\n\n return function doFetch(dispatch, getState) {\n // Reference:\n // http://stackoverflow.com/questions/35667249/accessing-redux-state-in-an-action-creator\n const currentTime = Date.now()\n const dataWithPreciseAmount = {\n ...data,\n // we need to override the amount\n amount: preciseAmount,\n latestAmountFetchTime: currentTime,\n }\n\n dispatch(preFetchAction(dataWithPreciseAmount))\n\n const dataToSend = {\n amount: preciseAmount, // TODO: remove trailing `.` on server\n fromCurrencyCode,\n toCurrencyCode,\n fromCountryCode,\n toCountryCode,\n requestedTime: currentTime,\n isPurchase,\n token,\n }\n\n return fetch(url, dataToSend)\n .then(response => {\n const { latestAmountFetchTime } = getState().crossBorder // Yeah it is `crossBorder` rather than `loading` here\n if (\n !requestMatchesResponse(\n latestAmountFetchTime,\n response.data.requestedTime\n )\n ) {\n return\n }\n\n // Only dispatch the response if the latestAmountFetchTime and requestedTime match\n dispatch(onFetchSuccessAction(dataWithPreciseAmount, response))\n dispatch(receiveFees(dataWithPreciseAmount, response))\n dispatch(\n changeAmount(\n formatLocalizedNumber(toCurrencyCode, response.data.toAmountRaw)\n )\n )\n dispatch(changeCurrency(toCurrencyCode))\n dispatch(updateFxQuoteId(response.data.fxQuoteId))\n return response\n })\n .catch(err => {\n dispatch(fetchConversionFailed())\n handleErrorFromFailedRequest(dispatch)(err)\n })\n }\n}\n\nexport function changeDestinationAmount(data) {\n const amountPrecise = formatLocalizedNumber(data.toCurrencyCode, data.amount)\n return {\n type: types.CROSS_BORDER.CHANGE_DESTINATION_AMOUNT,\n // meta: data.isInitialAmountEntry && analyticsMeta('xbDestinationAmountTyped', data),\n data: {\n amountPrecise,\n amountIsZero: isZero(amountPrecise),\n ...data,\n isInDebounceWindow: !isZero(amountPrecise),\n },\n }\n}\n\nexport function handleErrorFromFailedRequest(dispatch) {\n return function onError(err) {\n dispatch(showError(err))\n return Promise.reject(err)\n }\n}\n\nfunction receiveFees(data, json) {\n return {\n type: types.CROSS_BORDER.RECEIVED_FEE,\n data: {\n ...json.data.fees, // { bank: { fee, totalCost }, card... }\n fxQuoteId: json.data.fxQuoteId,\n receivedAt: Date.now(),\n },\n }\n}\n\nfunction requestExchangeRate(data) {\n return {\n type: types.CROSS_BORDER.REQUEST_EXCHANGE_RATE,\n data,\n }\n}\n\nfunction receiveExchangeRate(data, json) {\n return {\n type: types.CROSS_BORDER.RECEIVED_EXCHANGE_RATE,\n data: json.data,\n receivedAt: Date.now(),\n }\n}\n\nfunction fetchConversionFailed() {\n return {\n type: types.CROSS_BORDER.FETCH_CONVERSION_FAILED,\n }\n}\n\nexport function changeOriginAmount(data) {\n const amountPrecise = formatLocalizedNumber(\n data.fromCurrencyCode,\n data.amount\n )\n\n return {\n type: types.CROSS_BORDER.CHANGE_ORIGIN_AMOUNT,\n // meta: data.isInitialAmountEntry && getAalyticsMeta('xbOriginAmountTyped', data),\n data: {\n amountPrecise,\n amountIsZero: isZero(amountPrecise),\n ...data,\n isInDebounceWindow: !isZero(amountPrecise),\n },\n }\n}\n\nexport function requestOriginAmount(data) {\n return {\n type: types.CROSS_BORDER.REQUEST_ORIGIN_AMOUNT,\n data,\n }\n}\n\nexport function receiveOriginAmount(data, json) {\n // replace the amount in the URL with the new from amount\n const preciseAmounts = getAmountsForPrecision(data, json.data)\n return {\n type: types.CROSS_BORDER.RECEIVED_ORIGIN_AMOUNT,\n meta: getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION, {\n linkName: 'originAmountChanged',\n }),\n data: {\n ...json.data,\n ...preciseAmounts,\n },\n receivedAt: Date.now(),\n }\n}\n\n/**\n * This is here as a helper to several actions that receive a raw amounts\n * and we need to account for precision\n */\nfunction getAmountsForPrecision(fromAmount, toAmount) {\n const { fromCurrencyCode, toCurrencyCode } = fromAmount\n const { fromAmountRaw, toAmountRaw } = toAmount\n return {\n fromAmountPrecise: formatLocalizedNumber(fromCurrencyCode, fromAmountRaw),\n toAmountPrecise: formatLocalizedNumber(toCurrencyCode, toAmountRaw),\n }\n}\n\n// requestDestinationAmount destination amount and fee info...\n// should we bundle all of them here? Wonder if that would make sense?\nexport function requestDestinationAmount(data) {\n return {\n type: types.CROSS_BORDER.REQUEST_DESTINATION_AMOUNT,\n data,\n }\n}\n\nexport function receiveDestinationAmount(data, json) {\n return {\n type: types.CROSS_BORDER.RECEIVED_DESTINATION_AMOUNT,\n meta: getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION, {\n linkName: 'destinationAmountChanged',\n }),\n data: {\n ...json.data,\n ...getAmountsForPrecision(data, json.data),\n },\n receivedAt: Date.now(),\n }\n}\n\nexport function setXBInitialState(data) {\n return {\n type: types.CROSS_BORDER.SET_INITIAL_STATE,\n data,\n }\n}\n\n/**\n * @param {boolean} unavailableFI - Flag to set warning for Add Bank flow.\n */\nexport function noFundingSource(unavailableFI) {\n return {\n type: types.TRANSACTION.NO_FUNDING_SOURCE,\n data: { unavailableFI },\n }\n}\n\n// trigger hook that will be picked up the the\n// external hooks middleware\nexport function triggerExternalHook(hook, data) {\n return {\n type: `externalHook:${hook}`,\n data,\n }\n}\n\n// Initialize FX Calculator for users focusing on single amount field (when user comes from XB flow)\nexport function initXBState() {\n return function(dispatch, getState) {\n const {\n amount: { fromCurrencyCode, currencyMap, currencyCode },\n user: { country: countryCode },\n } = getState()\n const currencyList = Object.keys(currencyMap).map(currency => {\n return { code: currency, symbol: currencyMap[currency] }\n })\n const currencyCodeList = currencyList.map(x => x.code)\n\n // Initialize XB store\n dispatch(\n setXBInitialState({\n fromCurrencyCode,\n fromCurrencyCodeList: currencyCodeList,\n showXBCalculator: true,\n toCurrencySymbolMap: currencyMap,\n toCurrencyCodeList: currencyCodeList,\n fromCountryCode: countryCode,\n toCountryCode: currencyCode,\n\n // don't allow auto focus on the sender amount input because it will be retrieved from server\n })\n )\n // Set the current currency as recipient currency\n dispatch(changeCurrency(currencyCode))\n }\n}\n\n// Initialize FX Calculator for users selecting a different currency in single amount field\nexport function initFXCalculator(toAmount, toCurrencyCode) {\n return function(dispatch, getState) {\n const {\n amount: { fromCurrencyCode, currencyMap },\n user: { country: countryCode },\n crossBorder: { fromCurrencyCodeList = [], toCurrencyCodeList = [] },\n recipient: { token },\n } = getState()\n const defaultCurrencyCodeList = Object.keys(currencyMap)\n\n // Initialize XB store\n dispatch(\n setXBInitialState({\n fromCurrencyCode,\n fromCurrencyCodeList: fromCurrencyCodeList.length\n ? fromCurrencyCodeList\n : defaultCurrencyCodeList,\n showXBCalculator: true,\n toCurrencyCode: toCurrencyCode,\n toCurrencyCodeList: toCurrencyCodeList.length\n ? toCurrencyCodeList\n : defaultCurrencyCodeList,\n toCurrencySymbolMap: currencyMap,\n fromCountryCode: countryCode,\n toCountryCode: countryCode,\n })\n )\n\n // Set the current currency as recipient currency\n dispatch(\n changeDestinationCurrencyCode(toCurrencyCode, {\n shouldFireAnalytics: true,\n })\n )\n\n // Set the current amount as recipient amount\n dispatch(\n changeDestinationAmount({\n toCurrencyCode: toCurrencyCode,\n amount: toAmount,\n isInitialAmountEntry: false,\n previousAmount: toAmount,\n })\n )\n\n // Fetch origin amount as well as exchange rate\n dispatch(\n fetchOriginAmount({\n fromCurrencyCode,\n amount: toAmount,\n toCurrencyCode: toCurrencyCode,\n currencyChanged: true,\n fromCountryCode: countryCode,\n toCountryCode: countryCode,\n token: token,\n })\n )\n }\n}\n\nexport function toggleShareAddress(shouldShareAddress) {\n return {\n type: types.EXTERNAL.TOGGLE_SHARE_ADDRESS,\n data: { shouldShareAddress },\n }\n}\n\nexport function setIsLoading(isLoading) {\n return {\n type: types.USER.SET_IS_LOADING,\n data: { isLoading },\n }\n}\n\n/**\n * Capture /external query params including: currencyCode,\n * toCountry, recipient, amount, etc.\n */\nexport function captureExternalParams(data) {\n return { type: types.EXTERNAL.RECEIVED_EXTERNAL_PARAMS, data }\n}\n\nexport function captureExternalIntegrationParams(data) {\n return { type: types.EXTERNAL.RECEIVED_EXTERNAL_INTEGRATION_PARAMS, data }\n}\nexport function redirect() {\n return { type: types.ROUTER.REDIRECT }\n}\n\nexport function setSuggestedTransactionType(transactionType) {\n return {\n type: types.TRANSACTION.SET_SUGGESTED_TRANSACTION_TYPE,\n data: { transactionType },\n }\n}\n\nexport function setServiceReturnedPaymentType(transactionType) {\n return {\n type: types.TRANSACTION.SET_SERVICE_RETURNED_PAYMENT_TYPE,\n data: { transactionType },\n }\n}\n\nexport function setPaymentTypeSelected(paymentTypeIsSelected) {\n return {\n type: types.TRANSACTION.SELECT_PAYMENT_TYPE,\n data: { paymentTypeIsSelected },\n }\n}\n","import { hasFIFailuresEnhancementTrmnt } from '../../experiments/fiFailuresEnhancement'\nimport { SEND_MONEY_ERRORS } from '../constants'\n\n/**\n * @NOTE INSTRUMENT_DEBIT_FAILED VS INSTRUMENT_DECLINED\n * The first one is an error code thrown at fulfillment when the selected\n * funding instrument was declined by the issuer, while the second one is a\n * tag that is added by P2P Services to a funding source after it was declined.\n */\nexport function isInstrumentDebitFailedError(err) {\n return (\n hasFIFailuresEnhancementTrmnt() &&\n err &&\n err.code === SEND_MONEY_ERRORS.INSTRUMENT_DEBIT_FAILED\n )\n}\n","import { handleError } from './Actions'\nimport { put } from '../../calculator/lib/xhr'\nimport { ActionTypes as types } from '../constants'\n\nexport function changeUnilateralName(name) {\n return {\n type: types.UNILATERAL.CHANGE_UNILATERAL_NAME,\n data: { name },\n }\n}\n\nexport function changeUnilateralCountryCode(countryCode) {\n return {\n type: types.UNILATERAL.CHANGE_UNILATERAL_COUNTRY_CODE,\n data: { countryCode },\n }\n}\n\nexport function resendMail(transactionId) {\n return dispatch => {\n dispatch({\n type: types.UNILATERAL.RESEND_MAIL_STATUS,\n data: { status: 'processing' },\n })\n const url = '/myaccount/transfer/resend-mail'\n const params = { transactionId }\n return put(url, params)\n .then(resp => {\n if (resp.data.sendNotification && resp.data.sendNotification.status) {\n dispatch({\n type: types.UNILATERAL.RESEND_MAIL_STATUS,\n data: { status: 'success' },\n })\n return resp.body.sendNotification\n }\n\n dispatch({\n type: types.UNILATERAL.RESEND_MAIL_STATUS,\n data: { status: 'initial' },\n })\n\n return { status: false }\n })\n .catch(handleError(dispatch))\n }\n}\n","import store from '../transfer/stores/configureStore'\nimport { triggerExternalHook } from '../transfer/actions/Actions'\nimport _ from 'lodash'\nimport { ENV_TYPE } from '../../../lib/constants'\n\nconst ONE_TOUCH_AUTH_STATE = 'REMEMBERED'\nconst LOGGEDIN_AUTH_STATE = 'LOGGEDIN'\n\nexport function isOneTouchEnabled() {\n const { external } = store.getState()\n return external.oneTouchEnabled\n}\n\nexport function isUserLoggedIn() {\n return _.get(store.getState(), 'server.userAuthState') === LOGGEDIN_AUTH_STATE\n}\n\nexport function isOneTouchUser() {\n return (\n _.get(store.getState(), 'server.userAuthState') === ONE_TOUCH_AUTH_STATE\n )\n}\n\nexport function requestLoginAction() {\n const { server } = store.getState()\n\n // `donate` will redirect the user to UL\n if (server.env === ENV_TYPE.DONATE) {\n return triggerExternalHook('requestUnifiedLogin')\n }\n}\n","const CFPB_KEY = 'Cfpb'\nconst PAYPAL_CASH_KEY = 'Cash'\nconst PAYPAL_CASH_PLUS_KEY = 'CashPlus'\n\n/**\n * Returns the appropriate content key based on the conditions mentioned.\n * This function appends 'Cfpb' at the end of the param key if its\n * a US Personal or Premier account\n * Otherwise original key is returned\n * @param key\n * @param country\n * @param accountType\n * @returns {string}\n */\nexport function getCfpbContentKey(\n key: string,\n isCFPBEnabledCountry?: boolean,\n accountType?: string\n) {\n let contentKey = key\n if (isCFPBEnabled(isCFPBEnabledCountry, accountType)) {\n contentKey = `${key}${CFPB_KEY}`\n }\n return contentKey\n}\n\n/**\n * Get the dynamic content based on Subscription Type of the user\n * Subscription Type can be 'PAYPAL_CASH' , 'PAYPAL_CASH_PLUS' , default is 'WALLET'\n * @param key\n * @param isCFPBEnabledCountry\n * @param accountType\n * @param subscriptionType\n * @returns {string}\n */\nexport function getCfpbDynamicContentKey(\n key: string,\n isCFPBEnabledCountry?: boolean,\n accountType?: string,\n subscriptionType?: string\n) {\n let contentKey = key\n if (isCFPBEnabled(isCFPBEnabledCountry, accountType)) {\n contentKey = getCfpbContentKey(key, isCFPBEnabledCountry, accountType)\n switch (subscriptionType) {\n case 'PAYPAL_CASH':\n contentKey = `${contentKey}${PAYPAL_CASH_KEY}`\n break\n case 'PAYPAL_CASH_PLUS':\n contentKey = `${contentKey}${PAYPAL_CASH_PLUS_KEY}`\n break\n default:\n break\n }\n }\n return contentKey\n}\n\n/**\n * Check whether the account type is eligible for CFPB\n * Also check if the country is eligible for CFPB\n * @param isCFPBEnabledCountry\n * @param accountType\n * @returns {boolean|RegExpMatchArray}\n */\nexport function isCFPBEnabled(\n isCFPBEnabledCountry: boolean,\n accountType: string\n) {\n const checkEligibility =\n accountType &&\n !!accountType.match(/^(PERSONAL|PREMIER)$/) &&\n isCFPBEnabledCountry\n\n return checkEligibility\n}\n","// @flow\nimport { trackLinkWithData, trackImpression } from 'lib/analytics/fpti'\n\nexport const SEND_PAGE_GROUP = 'main:p2p:tab-send::start'\nexport const SEND_PAGE_NAME = 'main:p2p:tab-send::start:node::'\nexport const REQUEST_PAGE_GROUP = 'main:p2p:tab-request::start'\nexport const REQUEST_PAGE_NAME = 'main:p2p:tab-request::start:node::'\nexport const SEARCH_CONSENT_PAGE_GROUP = 'main:p2p:consentdirsearch::'\nexport const SEARCH_CONSENT_PAGE_NAME =\n 'main:p2p:consentdirsearch:useragreement::'\n\nconst PAGE_VARIANT_MAP = {\n SIGNUP_FOR_NETWORK_ID: 'E',\n UPGRADE_NETWORK_ID: 'A',\n PROVIDE_ADDITIONAL_NETWORK_ID_CONSENT: 'F',\n}\n\n/**\n * Track directory search impression via FPTI analytics\n * @param {Object} data - data to track with the impression\n */\nexport function trackSearchResultImpression(\n isRequestFlow: boolean,\n device_contacts_count: number,\n paypal_contacts_count: number\n) {\n const pageGroup = isRequestFlow ? REQUEST_PAGE_GROUP : SEND_PAGE_GROUP\n const pageName = isRequestFlow ? REQUEST_PAGE_NAME : SEND_PAGE_NAME\n let data = { device_contacts_count, paypal_contacts_count }\n if (device_contacts_count === 0 && paypal_contacts_count === 0) {\n data = { ...data, int_err_code: '500', int_err_code_desc: 'tbd' }\n }\n trackImpression(pageGroup, pageName, data)\n}\n\n/**\n * Track consent page click via FPTI analytics\n * @param {Object} isRequestFlow - is in request flow\n * * @param {Object} linkName - the link name\n */\nexport function trackDirectorySearchClick(\n isRequestFlow: boolean,\n linkName: Object\n) {\n const pageGroup = isRequestFlow ? REQUEST_PAGE_GROUP : SEND_PAGE_GROUP\n const pageName = isRequestFlow ? REQUEST_PAGE_NAME : SEND_PAGE_NAME\n trackLinkWithData(linkName, pageGroup, pageName, 'link')\n}\n\n/**\n * Track consent page click via FPTI analytics\n * @param {Object} isRequestFlow - is in request flow\n * * @param {Object} linkName - the link name\n */\nexport function trackContactClick(isRequestFlow: boolean, contact: Object) {\n const pageGroup = isRequestFlow ? REQUEST_PAGE_GROUP : SEND_PAGE_GROUP\n const pageName = isRequestFlow ? REQUEST_PAGE_NAME : SEND_PAGE_NAME\n const data = {\n recipient_ppme_member_y_n: Boolean(contact.hasNetworkId).toString(),\n account_type: contact.isUnilateral ? 'GUEST' : 'MEMBER',\n }\n trackLinkWithData('CONTACT_ID', pageGroup, pageName, data, 'link')\n}\n\n/**\n * Track directory search impression via FPTI analytics\n * @param {Object} data - data to track with the impression\n */\nexport function trackConsentImpression(actionType: string, isPreFlow: boolean) {\n const variant = PAGE_VARIANT_MAP.hasOwnProperty(actionType)\n ? PAGE_VARIANT_MAP[actionType]\n : ''\n if (variant) {\n trackImpression(SEARCH_CONSENT_PAGE_GROUP, SEARCH_CONSENT_PAGE_NAME, {\n page_variant: `Version_${variant}`,\n fltp: isPreFlow ? 'PRE' : 'IN',\n })\n }\n}\n\n/**\n * Track consent page click via FPTI analytics\n * @param {Object} actionType - data to track with the impression\n * * @param {Object} linkName - data to track with the impression\n */\nexport function trackConsentClick(actionType: string, linkName: string) {\n const variant = PAGE_VARIANT_MAP.hasOwnProperty(actionType)\n ? PAGE_VARIANT_MAP[actionType]\n : ''\n if (variant) {\n trackLinkWithData(\n linkName,\n SEARCH_CONSENT_PAGE_GROUP,\n SEARCH_CONSENT_PAGE_NAME,\n { page_variant: `Version_${variant}` },\n 'link'\n )\n }\n}\n","/**\n * CLDR JavaScript Library v0.5.4\n * http://jquery.com/\n *\n * Copyright 2013 Rafael Xavier de Souza\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2020-10-22T15:56Z\n */\n/*!\n * CLDR JavaScript Library v0.5.4 2020-10-22T15:56Z MIT license © Rafael Xavier\n * http://git.io/h4lmVg\n */\n(function( root, factory ) {\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD.\n\t\tdefine( factory );\n\t} else if ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// Node. CommonJS.\n\t\tmodule.exports = factory();\n\t} else {\n\t\t// Global\n\t\troot.Cldr = factory();\n\t}\n\n}( this, function() {\n\n\n\tvar arrayIsArray = Array.isArray || function( obj ) {\n\t\treturn Object.prototype.toString.call( obj ) === \"[object Array]\";\n\t};\n\n\n\n\n\tvar pathNormalize = function( path, attributes ) {\n\t\tif ( arrayIsArray( path ) ) {\n\t\t\tpath = path.join( \"/\" );\n\t\t}\n\t\tif ( typeof path !== \"string\" ) {\n\t\t\tthrow new Error( \"invalid path \\\"\" + path + \"\\\"\" );\n\t\t}\n\t\t// 1: Ignore leading slash `/`\n\t\t// 2: Ignore leading `cldr/`\n\t\tpath = path\n\t\t\t.replace( /^\\// , \"\" ) /* 1 */\n\t\t\t.replace( /^cldr\\// , \"\" ); /* 2 */\n\n\t\t// Replace {attribute}'s\n\t\tpath = path.replace( /{[a-zA-Z]+}/g, function( name ) {\n\t\t\tname = name.replace( /^{([^}]*)}$/, \"$1\" );\n\t\t\treturn attributes[ name ];\n\t\t});\n\n\t\treturn path.split( \"/\" );\n\t};\n\n\n\n\n\tvar arraySome = function( array, callback ) {\n\t\tvar i, length;\n\t\tif ( array.some ) {\n\t\t\treturn array.some( callback );\n\t\t}\n\t\tfor ( i = 0, length = array.length; i < length; i++ ) {\n\t\t\tif ( callback( array[ i ], i, array ) ) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n\n\n\n\t/**\n\t * Return the maximized language id as defined in\n\t * http://www.unicode.org/reports/tr35/#Likely_Subtags\n\t * 1. Canonicalize.\n\t * 1.1 Make sure the input locale is in canonical form: uses the right\n\t * separator, and has the right casing.\n\t * TODO Right casing? What df? It seems languages are lowercase, scripts are\n\t * Capitalized, territory is uppercase. I am leaving this as an exercise to\n\t * the user.\n\t *\n\t * 1.2 Replace any deprecated subtags with their canonical values using the\n\t * data in supplemental metadata. Use the first value in the\n\t * replacement list, if it exists. Language tag replacements may have multiple\n\t * parts, such as \"sh\" ➞ \"sr_Latn\" or mo\" ➞ \"ro_MD\". In such a case, the\n\t * original script and/or region are retained if there is one. Thus\n\t * \"sh_Arab_AQ\" ➞ \"sr_Arab_AQ\", not \"sr_Latn_AQ\".\n\t * TODO What data?\n\t *\n\t * 1.3 If the tag is grandfathered (see in the supplemental data), then return it.\n\t * TODO grandfathered?\n\t *\n\t * 1.4 Remove the script code 'Zzzz' and the region code 'ZZ' if they occur.\n\t * 1.5 Get the components of the cleaned-up source tag (languages, scripts,\n\t * and regions), plus any variants and extensions.\n\t * 2. Lookup. Lookup each of the following in order, and stop on the first\n\t * match:\n\t * 2.1 languages_scripts_regions\n\t * 2.2 languages_regions\n\t * 2.3 languages_scripts\n\t * 2.4 languages\n\t * 2.5 und_scripts\n\t * 3. Return\n\t * 3.1 If there is no match, either return an error value, or the match for\n\t * \"und\" (in APIs where a valid language tag is required).\n\t * 3.2 Otherwise there is a match = languagem_scriptm_regionm\n\t * 3.3 Let xr = xs if xs is not empty, and xm otherwise.\n\t * 3.4 Return the language tag composed of languager _ scriptr _ regionr +\n\t * variants + extensions.\n\t *\n\t * @subtags [Array] normalized language id subtags tuple (see init.js).\n\t */\n\tvar coreLikelySubtags = function( Cldr, cldr, subtags, options ) {\n\t\tvar match, matchFound,\n\t\t\tlanguage = subtags[ 0 ],\n\t\t\tscript = subtags[ 1 ],\n\t\t\tsep = Cldr.localeSep,\n\t\t\tterritory = subtags[ 2 ],\n\t\t\tvariants = subtags.slice( 3, 4 );\n\t\toptions = options || {};\n\n\t\t// Skip if (language, script, territory) is not empty [3.3]\n\t\tif ( language !== \"und\" && script !== \"Zzzz\" && territory !== \"ZZ\" ) {\n\t\t\treturn [ language, script, territory ].concat( variants );\n\t\t}\n\n\t\t// Skip if no supplemental likelySubtags data is present\n\t\tif ( typeof cldr.get( \"supplemental/likelySubtags\" ) === \"undefined\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// [2]\n\t\tmatchFound = arraySome([\n\t\t\t[ language, script, territory ],\n\t\t\t[ language, territory ],\n\t\t\t[ language, script ],\n\t\t\t[ language ],\n\t\t\t[ \"und\", script ]\n\t\t], function( test ) {\n\t\t\treturn match = !(/\\b(Zzzz|ZZ)\\b/).test( test.join( sep ) ) /* [1.4] */ && cldr.get( [ \"supplemental/likelySubtags\", test.join( sep ) ] );\n\t\t});\n\n\t\t// [3]\n\t\tif ( matchFound ) {\n\t\t\t// [3.2 .. 3.4]\n\t\t\tmatch = match.split( sep );\n\t\t\treturn [\n\t\t\t\tlanguage !== \"und\" ? language : match[ 0 ],\n\t\t\t\tscript !== \"Zzzz\" ? script : match[ 1 ],\n\t\t\t\tterritory !== \"ZZ\" ? territory : match[ 2 ]\n\t\t\t].concat( variants );\n\t\t} else if ( options.force ) {\n\t\t\t// [3.1.2]\n\t\t\treturn cldr.get( \"supplemental/likelySubtags/und\" ).split( sep );\n\t\t} else {\n\t\t\t// [3.1.1]\n\t\t\treturn;\n\t\t}\n\t};\n\n\n\n\t/**\n\t * Given a locale, remove any fields that Add Likely Subtags would add.\n\t * http://www.unicode.org/reports/tr35/#Likely_Subtags\n\t * 1. First get max = AddLikelySubtags(inputLocale). If an error is signaled,\n\t * return it.\n\t * 2. Remove the variants from max.\n\t * 3. Then for trial in {language, language _ region, language _ script}. If\n\t * AddLikelySubtags(trial) = max, then return trial + variants.\n\t * 4. If you do not get a match, return max + variants.\n\t * \n\t * @maxLanguageId [Array] maxLanguageId tuple (see init.js).\n\t */\n\tvar coreRemoveLikelySubtags = function( Cldr, cldr, maxLanguageId ) {\n\t\tvar match, matchFound,\n\t\t\tlanguage = maxLanguageId[ 0 ],\n\t\t\tscript = maxLanguageId[ 1 ],\n\t\t\tterritory = maxLanguageId[ 2 ],\n\t\t\tvariants = maxLanguageId[ 3 ];\n\n\t\t// [3]\n\t\tmatchFound = arraySome([\n\t\t\t[ [ language, \"Zzzz\", \"ZZ\" ], [ language ] ],\n\t\t\t[ [ language, \"Zzzz\", territory ], [ language, territory ] ],\n\t\t\t[ [ language, script, \"ZZ\" ], [ language, script ] ]\n\t\t], function( test ) {\n\t\t\tvar result = coreLikelySubtags( Cldr, cldr, test[ 0 ] );\n\t\t\tmatch = test[ 1 ];\n\t\t\treturn result && result[ 0 ] === maxLanguageId[ 0 ] &&\n\t\t\t\tresult[ 1 ] === maxLanguageId[ 1 ] &&\n\t\t\t\tresult[ 2 ] === maxLanguageId[ 2 ];\n\t\t});\n\n\t\tif ( matchFound ) {\n\t\t\tif ( variants ) {\n\t\t\t\tmatch.push( variants );\n\t\t\t}\n\t\t\treturn match;\n\t\t}\n\n\t\t// [4]\n\t\treturn maxLanguageId;\n\t};\n\n\n\n\n\t/**\n\t * subtags( locale )\n\t *\n\t * @locale [String]\n\t */\n\tvar coreSubtags = function( locale ) {\n\t\tvar aux, unicodeLanguageId,\n\t\t\tsubtags = [];\n\n\t\tlocale = locale.replace( /_/, \"-\" );\n\n\t\t// Unicode locale extensions.\n\t\taux = locale.split( \"-u-\" );\n\t\tif ( aux[ 1 ] ) {\n\t\t\taux[ 1 ] = aux[ 1 ].split( \"-t-\" );\n\t\t\tlocale = aux[ 0 ] + ( aux[ 1 ][ 1 ] ? \"-t-\" + aux[ 1 ][ 1 ] : \"\");\n\t\t\tsubtags[ 4 /* unicodeLocaleExtensions */ ] = aux[ 1 ][ 0 ];\n\t\t}\n\n\t\t// TODO normalize transformed extensions. Currently, skipped.\n\t\t// subtags[ x ] = locale.split( \"-t-\" )[ 1 ];\n\t\tunicodeLanguageId = locale.split( \"-t-\" )[ 0 ];\n\n\t\t// unicode_language_id = \"root\"\n\t\t// | unicode_language_subtag \n\t\t// (sep unicode_script_subtag)? \n\t\t// (sep unicode_region_subtag)?\n\t\t// (sep unicode_variant_subtag)* ;\n\t\t//\n\t\t// Although unicode_language_subtag = alpha{2,8}, I'm using alpha{2,3}. Because, there's no language on CLDR lengthier than 3.\n\t\taux = unicodeLanguageId.match( /^(([a-z]{2,3})(-([A-Z][a-z]{3}))?(-([A-Z]{2}|[0-9]{3}))?)((-([a-zA-Z0-9]{5,8}|[0-9][a-zA-Z0-9]{3}))*)$|^(root)$/ );\n\t\tif ( aux === null ) {\n\t\t\treturn [ \"und\", \"Zzzz\", \"ZZ\" ];\n\t\t}\n\t\tsubtags[ 0 /* language */ ] = aux[ 10 ] /* root */ || aux[ 2 ] || \"und\";\n\t\tsubtags[ 1 /* script */ ] = aux[ 4 ] || \"Zzzz\";\n\t\tsubtags[ 2 /* territory */ ] = aux[ 6 ] || \"ZZ\";\n\t\tif ( aux[ 7 ] && aux[ 7 ].length ) {\n\t\t\tsubtags[ 3 /* variant */ ] = aux[ 7 ].slice( 1 ) /* remove leading \"-\" */;\n\t\t}\n\n\t\t// 0: language\n\t\t// 1: script\n\t\t// 2: territory (aka region)\n\t\t// 3: variant\n\t\t// 4: unicodeLocaleExtensions\n\t\treturn subtags;\n\t};\n\n\n\n\n\tvar arrayForEach = function( array, callback ) {\n\t\tvar i, length;\n\t\tif ( array.forEach ) {\n\t\t\treturn array.forEach( callback );\n\t\t}\n\t\tfor ( i = 0, length = array.length; i < length; i++ ) {\n\t\t\tcallback( array[ i ], i, array );\n\t\t}\n\t};\n\n\n\n\n\t/**\n\t * bundleLookup( minLanguageId )\n\t *\n\t * @Cldr [Cldr class]\n\t *\n\t * @cldr [Cldr instance]\n\t *\n\t * @minLanguageId [String] requested languageId after applied remove likely subtags.\n\t */\n\tvar bundleLookup = function( Cldr, cldr, minLanguageId ) {\n\t\tvar availableBundleMap = Cldr._availableBundleMap,\n\t\t\tavailableBundleMapQueue = Cldr._availableBundleMapQueue;\n\n\t\tif ( availableBundleMapQueue.length ) {\n\t\t\tarrayForEach( availableBundleMapQueue, function( bundle, i ) {\n\t\t\t\tvar existing, maxBundle, minBundle, subtags;\n\t\t\t\tsubtags = coreSubtags( bundle );\n\t\t\t\tmaxBundle = coreLikelySubtags( Cldr, cldr, subtags );\n\t\t\t\tif ( maxBundle === undefined ) {\n\t\t\t\t\tavailableBundleMapQueue.splice( i, 1 );\n\t\t\t\t\tthrow new Error( \"Could not find likelySubtags for \" + bundle );\n\t\t\t\t}\n\t\t\t\tminBundle = coreRemoveLikelySubtags( Cldr, cldr, maxBundle );\n\t\t\t\tminBundle = minBundle.join( Cldr.localeSep );\n\t\t\t\texisting = availableBundleMap[ minBundle ];\n\t\t\t\tif ( existing && existing.length < bundle.length ) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tavailableBundleMap[ minBundle ] = bundle;\n\t\t\t});\n\t\t\tCldr._availableBundleMapQueue = [];\n\t\t}\n\n\t\treturn availableBundleMap[ minLanguageId ] || null;\n\t};\n\n\n\n\n\tvar objectKeys = function( object ) {\n\t\tvar i,\n\t\t\tresult = [];\n\n\t\tif ( Object.keys ) {\n\t\t\treturn Object.keys( object );\n\t\t}\n\n\t\tfor ( i in object ) {\n\t\t\tresult.push( i );\n\t\t}\n\n\t\treturn result;\n\t};\n\n\n\n\n\tvar createError = function( code, attributes ) {\n\t\tvar error, message;\n\n\t\tmessage = code + ( attributes && JSON ? \": \" + JSON.stringify( attributes ) : \"\" );\n\t\terror = new Error( message );\n\t\terror.code = code;\n\n\t\t// extend( error, attributes );\n\t\tarrayForEach( objectKeys( attributes ), function( attribute ) {\n\t\t\terror[ attribute ] = attributes[ attribute ];\n\t\t});\n\n\t\treturn error;\n\t};\n\n\n\n\n\tvar validate = function( code, check, attributes ) {\n\t\tif ( !check ) {\n\t\t\tthrow createError( code, attributes );\n\t\t}\n\t};\n\n\n\n\n\tvar validatePresence = function( value, name ) {\n\t\tvalidate( \"E_MISSING_PARAMETER\", typeof value !== \"undefined\", {\n\t\t\tname: name\n\t\t});\n\t};\n\n\n\n\n\tvar validateType = function( value, name, check, expected ) {\n\t\tvalidate( \"E_INVALID_PAR_TYPE\", check, {\n\t\t\texpected: expected,\n\t\t\tname: name,\n\t\t\tvalue: value\n\t\t});\n\t};\n\n\n\n\n\tvar validateTypePath = function( value, name ) {\n\t\tvalidateType( value, name, typeof value === \"string\" || arrayIsArray( value ), \"String or Array\" );\n\t};\n\n\n\n\n\t/**\n\t * Function inspired by jQuery Core, but reduced to our use case.\n\t */\n\tvar isPlainObject = function( obj ) {\n\t\treturn obj !== null && \"\" + obj === \"[object Object]\";\n\t};\n\n\n\n\n\tvar validateTypePlainObject = function( value, name ) {\n\t\tvalidateType( value, name, typeof value === \"undefined\" || isPlainObject( value ), \"Plain Object\" );\n\t};\n\n\n\n\n\tvar validateTypeString = function( value, name ) {\n\t\tvalidateType( value, name, typeof value === \"string\", \"a string\" );\n\t};\n\n\n\n\n\t// @path: normalized path\n\tvar resourceGet = function( data, path ) {\n\t\tvar i,\n\t\t\tnode = data,\n\t\t\tlength = path.length;\n\n\t\tfor ( i = 0; i < length - 1; i++ ) {\n\t\t\tnode = node[ path[ i ] ];\n\t\t\tif ( !node ) {\n\t\t\t\treturn undefined;\n\t\t\t}\n\t\t}\n\t\treturn node[ path[ i ] ];\n\t};\n\n\n\n\n\t/**\n\t * setAvailableBundles( Cldr, json )\n\t *\n\t * @Cldr [Cldr class]\n\t *\n\t * @json resolved/unresolved cldr data.\n\t *\n\t * Set available bundles queue based on passed json CLDR data. Considers a bundle as any String at /main/{bundle}.\n\t */\n\tvar coreSetAvailableBundles = function( Cldr, json ) {\n\t\tvar bundle,\n\t\t\tavailableBundleMapQueue = Cldr._availableBundleMapQueue,\n\t\t\tmain = resourceGet( json, [ \"main\" ] );\n\n\t\tif ( main ) {\n\t\t\tfor ( bundle in main ) {\n\t\t\t\tif ( main.hasOwnProperty( bundle ) && bundle !== \"root\" &&\n\t\t\t\t\t\t\tavailableBundleMapQueue.indexOf( bundle ) === -1 ) {\n\t\t\t\t\tavailableBundleMapQueue.push( bundle );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\n\n\n\tvar alwaysArray = function( somethingOrArray ) {\n\t\treturn arrayIsArray( somethingOrArray ) ? somethingOrArray : [ somethingOrArray ];\n\t};\n\n\n\tvar jsonMerge = (function() {\n\n\t// Returns new deeply merged JSON.\n\t//\n\t// Eg.\n\t// merge( { a: { b: 1, c: 2 } }, { a: { b: 3, d: 4 } } )\n\t// -> { a: { b: 3, c: 2, d: 4 } }\n\t//\n\t// @arguments JSON's\n\t// \n\tvar merge = function() {\n\t\tvar destination = {},\n\t\t\tsources = [].slice.call( arguments, 0 );\n\t\tarrayForEach( sources, function( source ) {\n\t\t\tvar prop;\n\t\t\tfor ( prop in source ) {\n\t\t\t\tif ( prop in destination && typeof destination[ prop ] === \"object\" && !arrayIsArray( destination[ prop ] ) ) {\n\n\t\t\t\t\t// Merge Objects\n\t\t\t\t\tdestination[ prop ] = merge( destination[ prop ], source[ prop ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Set new values\n\t\t\t\t\tdestination[ prop ] = source[ prop ];\n\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn destination;\n\t};\n\n\treturn merge;\n\n}());\n\n\n\t/**\n\t * load( Cldr, source, jsons )\n\t *\n\t * @Cldr [Cldr class]\n\t *\n\t * @source [Object]\n\t *\n\t * @jsons [arguments]\n\t */\n\tvar coreLoad = function( Cldr, source, jsons ) {\n\t\tvar i, j, json;\n\n\t\tvalidatePresence( jsons[ 0 ], \"json\" );\n\n\t\t// Support arbitrary parameters, e.g., `Cldr.load({...}, {...})`.\n\t\tfor ( i = 0; i < jsons.length; i++ ) {\n\n\t\t\t// Support array parameters, e.g., `Cldr.load([{...}, {...}])`.\n\t\t\tjson = alwaysArray( jsons[ i ] );\n\n\t\t\tfor ( j = 0; j < json.length; j++ ) {\n\t\t\t\tvalidateTypePlainObject( json[ j ], \"json\" );\n\t\t\t\tsource = jsonMerge( source, json[ j ] );\n\t\t\t\tcoreSetAvailableBundles( Cldr, json[ j ] );\n\t\t\t}\n\t\t}\n\n\t\treturn source;\n\t};\n\n\n\n\tvar itemGetResolved = function( Cldr, path, attributes ) {\n\t\t// Resolve path\n\t\tvar normalizedPath = pathNormalize( path, attributes );\n\n\t\treturn resourceGet( Cldr._resolved, normalizedPath );\n\t};\n\n\n\n\n\t/**\n\t * new Cldr()\n\t */\n\tvar Cldr = function( locale ) {\n\t\tthis.init( locale );\n\t};\n\n\t// Build optimization hack to avoid duplicating functions across modules.\n\tCldr._alwaysArray = alwaysArray;\n\tCldr._coreLoad = coreLoad;\n\tCldr._createError = createError;\n\tCldr._itemGetResolved = itemGetResolved;\n\tCldr._jsonMerge = jsonMerge;\n\tCldr._pathNormalize = pathNormalize;\n\tCldr._resourceGet = resourceGet;\n\tCldr._validatePresence = validatePresence;\n\tCldr._validateType = validateType;\n\tCldr._validateTypePath = validateTypePath;\n\tCldr._validateTypePlainObject = validateTypePlainObject;\n\n\tCldr._availableBundleMap = {};\n\tCldr._availableBundleMapQueue = [];\n\tCldr._resolved = {};\n\n\t// Allow user to override locale separator \"-\" (default) | \"_\". According to http://www.unicode.org/reports/tr35/#Unicode_language_identifier, both \"-\" and \"_\" are valid locale separators (eg. \"en_GB\", \"en-GB\"). According to http://unicode.org/cldr/trac/ticket/6786 its usage must be consistent throughout the data set.\n\tCldr.localeSep = \"-\";\n\n\t/**\n\t * Cldr.load( json [, json, ...] )\n\t *\n\t * @json [JSON] CLDR data or [Array] Array of @json's.\n\t *\n\t * Load resolved cldr data.\n\t */\n\tCldr.load = function() {\n\t\tCldr._resolved = coreLoad( Cldr, Cldr._resolved, arguments );\n\t};\n\n\t/**\n\t * .init() automatically run on instantiation/construction.\n\t */\n\tCldr.prototype.init = function( locale ) {\n\t\tvar attributes, language, maxLanguageId, minLanguageId, script, subtags, territory, unicodeLocaleExtensions, variant,\n\t\t\tsep = Cldr.localeSep,\n\t\t\tunicodeLocaleExtensionsRaw = \"\";\n\n\t\tvalidatePresence( locale, \"locale\" );\n\t\tvalidateTypeString( locale, \"locale\" );\n\n\t\tsubtags = coreSubtags( locale );\n\n\t\tif ( subtags.length === 5 ) {\n\t\t\tunicodeLocaleExtensions = subtags.pop();\n\t\t\tunicodeLocaleExtensionsRaw = sep + \"u\" + sep + unicodeLocaleExtensions;\n\t\t\t// Remove trailing null when there is unicodeLocaleExtensions but no variants.\n\t\t\tif ( !subtags[ 3 ] ) {\n\t\t\t\tsubtags.pop();\n\t\t\t}\n\t\t}\n\t\tvariant = subtags[ 3 ];\n\n\t\t// Normalize locale code.\n\t\t// Get (or deduce) the \"triple subtags\": language, territory (also aliased as region), and script subtags.\n\t\t// Get the variant subtags (calendar, collation, currency, etc).\n\t\t// refs:\n\t\t// - http://www.unicode.org/reports/tr35/#Field_Definitions\n\t\t// - http://www.unicode.org/reports/tr35/#Language_and_Locale_IDs\n\t\t// - http://www.unicode.org/reports/tr35/#Unicode_locale_identifier\n\n\t\t// When a locale id does not specify a language, or territory (region), or script, they are obtained by Likely Subtags.\n\t\tmaxLanguageId = coreLikelySubtags( Cldr, this, subtags, { force: true } ) || subtags;\n\t\tlanguage = maxLanguageId[ 0 ];\n\t\tscript = maxLanguageId[ 1 ];\n\t\tterritory = maxLanguageId[ 2 ];\n\n\t\tminLanguageId = coreRemoveLikelySubtags( Cldr, this, maxLanguageId ).join( sep );\n\n\t\t// Set attributes\n\t\tthis.attributes = attributes = {\n\t\t\tbundle: bundleLookup( Cldr, this, minLanguageId ),\n\n\t\t\t// Unicode Language Id\n\t\t\tminLanguageId: minLanguageId + unicodeLocaleExtensionsRaw,\n\t\t\tmaxLanguageId: maxLanguageId.join( sep ) + unicodeLocaleExtensionsRaw,\n\n\t\t\t// Unicode Language Id Subtabs\n\t\t\tlanguage: language,\n\t\t\tscript: script,\n\t\t\tterritory: territory,\n\t\t\tregion: territory, /* alias */\n\t\t\tvariant: variant\n\t\t};\n\n\t\t// Unicode locale extensions.\n\t\tunicodeLocaleExtensions && ( \"-\" + unicodeLocaleExtensions ).replace( /-[a-z]{3,8}|(-[a-z]{2})-([a-z]{3,8})/g, function( attribute, key, type ) {\n\n\t\t\tif ( key ) {\n\n\t\t\t\t// Extension is in the `keyword` form.\n\t\t\t\tattributes[ \"u\" + key ] = type;\n\t\t\t} else {\n\n\t\t\t\t// Extension is in the `attribute` form.\n\t\t\t\tattributes[ \"u\" + attribute ] = true;\n\t\t\t}\n\t\t});\n\n\t\tthis.locale = locale;\n\t};\n\n\t/**\n\t * .get()\n\t */\n\tCldr.prototype.get = function( path ) {\n\n\t\tvalidatePresence( path, \"path\" );\n\t\tvalidateTypePath( path, \"path\" );\n\n\t\treturn itemGetResolved( Cldr, path, this.attributes );\n\t};\n\n\t/**\n\t * .main()\n\t */\n\tCldr.prototype.main = function( path ) {\n\t\tvalidatePresence( path, \"path\" );\n\t\tvalidateTypePath( path, \"path\" );\n\n\t\tvalidate( \"E_MISSING_BUNDLE\", this.attributes.bundle !== null, {\n\t\t\tlocale: this.locale\n\t\t});\n\n\t\tpath = alwaysArray( path );\n\t\treturn this.get( [ \"main/{bundle}\" ].concat( path ) );\n\t};\n\n\treturn Cldr;\n\n\n\n\n}));\n","import { ENV_TYPE } from '../../../lib/constants'\nimport * as pxp from '../lib/pxp'\n\nconst omittedFlows = [ENV_TYPE.DONATE, ENV_TYPE.POOLS]\n\nexport function isV2API(env) {\n if (omittedFlows.includes(env)) {\n return false\n }\n\n return pxp && pxp.isTreatment('Trmt_p2p_v2_integration_1')\n}\n\n// This is a new experiment for Phase Two V2 Work. By the time this ramped, phase one and the above experiemnt should be deleted\nexport function isV2PhaseTwo(env) {\n // TODO we need to address these flows\n\n if (omittedFlows.includes(env)) {\n return false\n }\n\n return (\n pxp &&\n pxp.isTreatment('Trmt_p2p_v2_integration_1') &&\n pxp.isTreatment('Trmt_p2p_v2_integration_phasetwo')\n )\n}\n\nexport function isV2PricingReq(env) {\n if (omittedFlows.includes(env)) {\n return false\n }\n\n return (\n pxp &&\n pxp.isTreatment('Trmt_p2p_v2_integration_1') &&\n pxp.isTreatment('Trmt_p2p_v2_integration_phasetwo') &&\n pxp.isTreatment('Trmt_p2p_v2_calculate_exchange_rate')\n )\n}\n","// @flow\n\nimport { trackLink, trackImpression } from 'lib/analytics/fpti'\n\nexport const CONTACT_CONFIDENCE_PAGE_GROUP = 'main:p2p:contactConfidence'\nexport const CONTACT_CONFIDENCE_PAGE_NAME = 'main:p2p:contactConfidence::'\n\n/**\n * Get contact confidence analytics FPTI data from recipient data\n * @param {Object} options\n * @param {boolean} options.isUnilateral - whether recipient is unilateral or not\n * @param {boolean} options.hasNetworkId - whether recipient has PayPal.me public network identity or not\n * @param {boolean} options.isRestricted - whether recipient is restricted from receiving payments or not\n * @param {boolean} options.isPhone - whether recipient is primarily a phone number or not\n * @param {boolean} options.isContact - whether recipient was selected from a contact or not\n */\nexport function getContactConfidenceAnalyticsData({\n isUnilateral,\n hasNetworkId,\n isRestricted,\n isPhone,\n isContact,\n}: {\n isUnilateral: boolean,\n hasNetworkId: boolean,\n isRestricted: boolean,\n isPhone: boolean,\n isContact: boolean,\n} = {}) {\n let pageVariant\n if (isUnilateral) {\n pageVariant = 'unilateral'\n } else if (hasNetworkId) {\n pageVariant = 'ppme_member'\n } else {\n pageVariant = 'ppmember'\n }\n\n return {\n page_variant: `Version_${pageVariant}`,\n recipient_ppmember_y_n: (!isUnilateral).toString(),\n recipient_ppme_member_y_n: Boolean(hasNetworkId).toString(),\n recipient_restricted_account_y_n: Boolean(isRestricted).toString(),\n recipient_phone_y_n: Boolean(isPhone).toString(),\n recipient_contact_y_n: Boolean(isContact).toString(),\n }\n}\n\n/**\n * Track contact confidence overpanel impression via FPTI analytics\n * @param {Object} data - FPTI data to track with the impression\n */\nexport function trackContactConfidenceImpression(data: Object) {\n trackImpression(\n CONTACT_CONFIDENCE_PAGE_GROUP,\n CONTACT_CONFIDENCE_PAGE_NAME,\n data\n )\n}\n\n/**\n * Track contact confidence cancel button click on overpanel via FPTI analytics\n */\nexport function trackContactConfidenceCancel() {\n trackLink(\n 'cancel',\n CONTACT_CONFIDENCE_PAGE_GROUP,\n CONTACT_CONFIDENCE_PAGE_NAME,\n 'link',\n {}\n )\n}\n\n/**\n * Track contact confidence primary submit button via FPTI analytics\n */\nexport function trackContactConfidenceSubmit() {\n trackLink(\n 'submit',\n CONTACT_CONFIDENCE_PAGE_GROUP,\n CONTACT_CONFIDENCE_PAGE_NAME,\n 'link',\n {}\n )\n}\n","import { isIframe } from 'iframe-support'\nimport { getFlowType } from './url-utils'\nimport store from '../stores/configureStore'\nimport { post } from '../../calculator/lib/xhr'\nimport logger from 'loglevel'\nimport { getSessionDataPayload } from 'transfer/utils/session'\nimport { ENV_TYPE } from '../../../../lib/constants'\n\nexport function handleInterstitialCipFlow(param) {\n const entryPoint = 'P2P',\n amount = store.getState().amount.amount,\n token = store.getState().recipient.token,\n networkId = store.getState().recipient.networkId,\n currencyCode = store.getState().amount.currencyCode,\n flowIntent = store.getState().server.flowIntent\n let flowType = getFlowType(),\n feature = getFlowType() === 'buy' ? 'PURCHASE' : 'PERSONAL',\n recipient = store.getState().recipient.recipient,\n payerId = store.getState().recipient.payerId,\n displayName = store.getState().recipient.displayName,\n thumbnailUrl = store.getState().recipient.thumbnailUrl,\n subFlow = 'send',\n externalUrl =\n getFlowType() === 'buy'\n ? store.getState().user.purchaseCipUrl\n : store.getState().user.personalCipUrl,\n env = store.getState().server.env\n\n if (typeof param === 'object') {\n flowType = param.flowType\n recipient = param.email\n thumbnailUrl = param.thumbnailUrl\n displayName = param.fullName\n payerId = param.payerId\n feature = flowType === 'buy' ? 'PURCHASE' : 'PERSONAL'\n externalUrl =\n flowType === 'buy'\n ? store.getState().user.purchaseCipUrl\n : store.getState().user.personalCipUrl\n }\n if (param === 'send' || param === 'buy') {\n flowType = param\n if (getFlowType() === 'payRequest') {\n env = ENV_TYPE.PAY_REQUEST\n subFlow = 'pay_from_request'\n }\n feature = param === 'buy' ? 'PURCHASE' : 'PERSONAL'\n externalUrl =\n param === 'buy'\n ? store.getState().user.purchaseCipUrl\n : store.getState().user.personalCipUrl\n }\n const homeinfoPayLoad = {\n flowType,\n entryPoint,\n feature,\n amount,\n token,\n recipient,\n env,\n payerId,\n networkId,\n displayName,\n currencyCode,\n thumbnailUrl,\n externalUrl,\n subFlow,\n flowIntent,\n ...getSessionDataPayload(),\n }\n const homeinfoFlowUrl = '/myaccount/transfer/flow/fi/aucip'\n const mainWindow = isIframe() ? window.top : window\n post(homeinfoFlowUrl, homeinfoPayLoad)\n .then(response => {\n const { redirectURL = {} } = response\n mainWindow.location.assign(redirectURL)\n })\n .catch(err => {\n logger.error(err)\n })\n}\n","import * as pxp from '../lib/pxp'\n\n// https://www.msmaster.qa.paypal.com/elmo/experiment/105570\n// https://admin.paypalinc.com/elmo/experiment/102056\nexport const hasFIPayRequestPostMigration = () =>\n pxp.isTreatment('Trmt_p2p_fi_pay_request_post_migrate')\n\nexport const hasAddFiPostMigration = () =>\n pxp.isTreatment('Trmt_p2p_add_fi_post_migrate')\n","/**\n * Set the initial states for XB Fee Calculator\n */\nexport function prepareXBInitialState(recipientDetails, store) {\n const {\n availableCurrencies,\n isCrossBorderRecipient,\n recipientCurrencies,\n recipientCurrencyCode,\n recipientCurrencyMap,\n rate,\n senderCountryCode,\n recipientCountryName,\n senderLocalCurrency,\n isUnilateral,\n token,\n } = recipientDetails\n\n let { recipientCountryCode } = recipientDetails\n\n if (isUnilateral && !recipientCountryCode && token) {\n recipientCountryCode = senderCountryCode\n }\n\n const currencyMap = store.amount.currencyMap\n const currencyList = Object.keys(currencyMap).map(currency => {\n return { code: currency, symbol: currencyMap[currency] }\n })\n const fromCurrencyCodeList =\n availableCurrencies || currencyList.map(x => x.code)\n\n return {\n availableCurrencies,\n fromCurrencyCode: senderLocalCurrency,\n fromCountryCode: senderCountryCode,\n fromCurrencyCodeList,\n showXBCalculator: !!isCrossBorderRecipient,\n toCurrencyCode: recipientCurrencyCode,\n toCountryCode: recipientCountryCode,\n toCountryName: recipientCountryName,\n toCurrencyCodeList: recipientCurrencies,\n rate,\n toCurrencySymbolMap: recipientCurrencyMap,\n }\n}\n","\"use strict\";\nmodule.exports = require(\"./lib/client/number\");\n","import { isEmpty } from 'lodash'\n\nexport function rankingPreferencesHelper({\n conversionType = '',\n instrumentIds = [],\n preselectedFundingOption = {},\n} = {}) {\n if (\n isEmpty(preselectedFundingOption) &&\n instrumentIds.length === 0 &&\n !conversionType\n ) {\n return null\n }\n\n const ranking = {}\n if (!isEmpty(preselectedFundingOption)) {\n ranking.preselected_funding_option_id = preselectedFundingOption.id\n }\n if (instrumentIds.length > 0) {\n ranking.instrument_ids = instrumentIds\n }\n if (conversionType) {\n const currencyConversionType =\n conversionType === 'EXTERNAL' ? 'ISSUER' : 'PAYPAL'\n ranking.currency_conversion_type = currencyConversionType\n }\n\n return { ranking }\n}\n","// @flow\n\n/**\n * Utilities that deal with currency, leveraging client-side Griffin 🎉\n */\n\nimport griffinNumber from 'griffin-paypal/number'\nimport { parseLocalizedNumberAsFloat } from '../../lib/amountUtils'\nimport getGriffinMetadata from './griffin-utils'\nimport log from 'loglevel'\n\n/**\n * Get the supported currency pattern for specific style for the current locale\n * @param {String} amount the amount\n * @param {String} currencyCode the currency code\n * @param {String} griffinPresetKey griffin preset keys for various formats of output\n * @param {number} maximumFractionDigits If we want to set the maximum fraction digits to zero or something else\n * @return {String} the formatted amount\n */\nexport function formatAmount(\n amount: string,\n currencyCode: string,\n griffinPresetKey: string = 'CURRENCY_FORMAT_SYMBOLISOCURRENCY',\n maximumFractionDigits: ?number\n) {\n if (!amount || !currencyCode) {\n log.warn('formatAmount() requires amount and currencyCode')\n return ''\n }\n\n const griffinMetadata = getGriffinMetadata()\n const griffinNumberHandler = griffinNumber.createHandler(griffinMetadata)\n const normalizedAmount = griffinNumberHandler.normalizeNumber(amount)\n const options = griffinNumberHandler[griffinPresetKey]\n if (maximumFractionDigits !== undefined) {\n options.maximumFractionDigits = maximumFractionDigits\n }\n return griffinNumberHandler.formatCurrency(\n {\n currency: currencyCode,\n value: normalizedAmount, // this argument only accepts floats or strings in US number format\n },\n options\n )\n}\n\n/**\n * Get the supported currency pattern for specific style for the current locale\n * without normalizing the data as canonical data is already normalized.\n * Use this method when you are getting the value from our services already\n * in cannonical form regardless of the currency or country.\n * Example: normalized (canonical): 50.00 EUR\n * unnormalized: 50,00 EUR (requires normalizing before formatting)\n * @param {String} amount the amount\n * @param {String} currencyCode the currency code\n * @param {String} griffinPresetKey griffin preset keys for various formats of output\n * @return {String} the formatted amount\n * @throws {Object} TypeError from griffin\n */\nexport function formatCanonicalAmount({\n amount,\n currencyCode,\n griffinPresetKey = 'CURRENCY_FORMAT_SYMBOLISOCURRENCY',\n}: {\n amount: string,\n currencyCode: string,\n griffinPresetKey: string,\n}) {\n if (!amount || !currencyCode) {\n log.warn('formatCanonicalAmount() requires amount and currencyCode')\n return ''\n }\n\n const griffinMetadata = getGriffinMetadata()\n const griffinNumberHandler = griffinNumber.createHandler(griffinMetadata)\n // @throws TypeError\n return griffinNumberHandler.formatCurrency(\n {\n currency: currencyCode,\n value: amount, // this argument only accepts floats or strings in US number format\n },\n griffinNumberHandler[griffinPresetKey]\n )\n}\n\n/**\n * Get the amount in an ordered array of \"parts\" that you can assemble together\n * @param {String} amount the amount\n * @param {String} currencyCode the currency code\n * @param {String} separator decimal separator\n * @return {Array} the amount parts\n */\nexport function getAmountParts(\n amount: string,\n currencyCode: string,\n separator: CurrencySeparator\n) {\n const griffinMetadata = getGriffinMetadata()\n const griffinNumberHandler = griffinNumber.createHandler(griffinMetadata)\n\n const amountAsFloat = parseLocalizedNumberAsFloat(amount, separator)\n\n return griffinNumberHandler.formatCurrency(\n {\n currency: currencyCode,\n value: amountAsFloat,\n },\n griffinNumberHandler.CURRENCY_FORMAT_SYMBOLISOCURRENCY.parts()\n )\n}\n\n/**\n * Get sorted currency code list\n * @param {Array} currencyCodeList the currency code list\n * @param {Object} currencySymbolMap the map with currency code and symbol\n * @return {Array} the sorted currency code list\n */\nexport function sortCurrencyList(\n currencyCodeList: Array,\n currencySymbolMap: Object\n): Array {\n let currencyList = []\n if (currencyCodeList && currencyCodeList.length) {\n currencyList = currencyCodeList\n } else {\n currencyList = Object.keys(currencySymbolMap)\n }\n\n return currencyList.sort()\n}\n\nexport function showCurrencySymbol(\n amount: string,\n currencyCode: string,\n currencyDecimal: CurrencySeparator\n) {\n const parts = getAmountParts(amount, currencyCode, currencyDecimal)\n\n return parts.find(part => part.type === 'symbol') || false\n}\n","import * as Actions from './Actions'\nimport * as UnifiedActions from './unified-actions'\nimport { fetch, put, post } from '../../calculator/lib/xhr'\nimport { INSTRUMENTATION_TYPES, ActionTypes as types } from '../constants'\nimport { INSTRUMENT_TYPES } from '../../../../lib/constants'\nimport * as travelRuleUtils from '../utils/travelRuleUtils'\nimport { routeTo } from '../utils/routeHelper'\nimport { getUrlFragment } from '../utils/url-utils'\nimport { receivedFundingOptions, redirectToAddFI } from './send'\nimport { hasFIPayRequestPostMigration } from 'experiments/migrateRoutes'\nimport { collectBrowserContext } from '../utils/3ds-utils'\nimport { calculateAttributesToCollect } from '../utils/travelRuleUtils'\nimport { getSessionDataPayload } from 'transfer/utils/session'\nimport { isInstrumentDebitFailedError } from '../utils/fiFailureUtils'\nimport { rankingPreferencesHelper } from './sendHelpers'\n\nexport function fetchFundingOptions({\n conversionType = null,\n handleFISelectorNext = null,\n preselectedFundingOption = {},\n instrumentIds = [],\n} = {}) {\n return (dispatch, getState) => {\n const {\n server: {\n amount,\n requestId,\n requestLegId,\n recipient,\n recipientFullName,\n recipientCountry,\n currencyCode,\n },\n address: {\n selectedShippingAddress: { id: shippingAddressId },\n },\n transaction: {\n isPurchase: goods,\n selectedFundingOption: { funding_sources },\n successfullyAddedFundingInstrumentIds,\n },\n recipient: { token },\n note: { note },\n user: { requireSenderInstrumentAddition = false },\n } = getState()\n\n if (requireSenderInstrumentAddition) {\n // no available FIs to use for the current transaction, send user to wallet\n dispatch(Actions.setIsLoading(true))\n return dispatch(redirectToAddFI())\n }\n\n dispatch({ type: types.TRANSACTION.FETCH_FUNDING_OPTIONS })\n\n let paymentCardId\n\n if (conversionType) {\n const paymentCard =\n funding_sources &&\n funding_sources.find(\n source => source.instrument_type === INSTRUMENT_TYPES.PAYMENT_CARD\n )\n paymentCardId = paymentCard && paymentCard.id\n }\n\n // For mandatory FI, generate additional params for funding_option call\n const preferences = rankingPreferencesHelper({\n conversionType,\n instrumentIds,\n preselectedFundingOption,\n })\n\n const browserData = collectBrowserContext()\n const browserContext = {\n screenHeight: browserData.browser_screen_height,\n screenWidth: browserData.browser_screen_width,\n colorDepth: browserData.browser_color_depth,\n timezoneOffsetMinutes: browserData.browser_timezone_offset_minutes,\n language: browserData.browser_language,\n javaEnabled: browserData.browser_java_enabled,\n }\n\n const payload = {\n recipient,\n amount,\n currencyCode,\n goods,\n shippingAddressId,\n recipientFullName,\n recipientCountry,\n paymentCardId,\n conversionType,\n successfullyAddedFundingInstrumentIds,\n token,\n browserContext,\n note,\n ...getSessionDataPayload(),\n }\n\n if (preferences) {\n payload.preferences = preferences\n }\n\n const url = `/myaccount/transfer/payRequest/${requestId}/${requestLegId}/fundingOptions`\n\n const networkCall = hasFIPayRequestPostMigration() ? post : fetch\n\n networkCall(url, payload)\n .then(response => {\n const { data: responseData = {} } = response\n responseData.conversionType = payload.conversionType\n dispatch(receivedFundingOptions(responseData))\n\n if (handleFISelectorNext) {\n handleFISelectorNext(dispatch)\n }\n })\n .catch(err => {\n switch (err.code) {\n case 'noFundingSource':\n return dispatch(Actions.noFundingSource())\n\n case 'authRequired':\n return // do nothing bc we are redirecting the user to auth flow in xhr.js\n\n default:\n return dispatch(Actions.showError(err))\n }\n })\n }\n}\n\nexport function handlePayRequestSubmit() {\n return (dispatch, getState) => {\n // grab necessary data for pay request from store\n const {\n server: { requestId, requestLegId, country },\n transaction: {\n selectedFundingOption,\n selectedFundingOption: { id: fundingOptionId },\n selectedInstallmentPlan: { installmentTerm },\n },\n note: { note: description },\n user,\n } = getState()\n\n // For v1, installmentTerm is a Number, but should be string for ajax call to server\n // For v2, installmentTerm is in Iso8601 format as Service only accepts duration in that format\n const installment_term = installmentTerm && installmentTerm.toString()\n\n const payRequestData = {\n requestId,\n requestLegId,\n fundingOptionId,\n description,\n installment_term,\n travelRuleRequirements: calculateAttributesToCollect(\n selectedFundingOption\n ),\n }\n\n if (!travelRuleUtils.isTravelRule(selectedFundingOption)) {\n return dispatch(payRequest(payRequestData))\n }\n\n if (\n travelRuleUtils.hasAllNeededTravelRuleInfo({\n ...user,\n selectedFundingOption,\n })\n ) {\n const travelRuleData = travelRuleUtils.massageTravelRuleDataForPost({\n ...user,\n selectedFundingOption,\n country,\n })\n return dispatch(\n postTravelRuleAndPayRequest({ ...payRequestData, ...travelRuleData })\n )\n }\n\n // if travel rule but not all info is present, just return out\n return\n }\n}\n\nexport function payRequest(data) {\n return (dispatch, getState) => {\n dispatch({ type: types.TRANSACTION.PAY_REQUEST })\n const url = `/myaccount/transfer/payRequest/${data.requestId}/${data.requestLegId}`\n const params = {\n ...data,\n id: data.requestId,\n legId: data.requestLegId,\n }\n const {\n transaction: { isPurchase },\n } = getState()\n\n put(url, params)\n .then(response => {\n dispatch(paidRequest(response.data, isPurchase))\n routeTo(`${getUrlFragment()}/success`)\n Actions.resetScrollPosition()\n })\n .catch(err => {\n if (isInstrumentDebitFailedError(err)) {\n return dispatch(\n UnifiedActions.fetchFundingOptionsAndShowFundingOptionsOverpanel()\n )\n }\n\n return Actions.handleError(dispatch)(err)\n })\n }\n}\n\n/**\n * Post new travel rule data, then pay the request\n * @param {}\n * @return {}\n */\nexport function postTravelRuleAndPayRequest(data) {\n return (dispatch, getState) => {\n dispatch({ type: types.TRANSACTION.POST_TRAVEL_RULE_DATA })\n dispatch({ type: types.TRANSACTION.PAY_REQUEST })\n const url = `/myaccount/transfer/payRequest/${data.requestId}/${data.requestLegId}/travelRule`\n const payload = {\n ...data,\n id: data.requestId,\n legId: data.requestLegId,\n }\n const {\n transaction: { isPurchase },\n } = getState()\n return put(url, payload)\n .then(response => {\n dispatch({ type: types.TRANSACTION.POSTED_TRAVEL_RULE_DATA })\n dispatch(paidRequest(response.data, isPurchase))\n routeTo(`${getUrlFragment()}/success`)\n })\n .catch(err => {\n if (isInstrumentDebitFailedError(err)) {\n return dispatch(\n UnifiedActions.fetchFundingOptionsAndShowFundingOptionsOverpanel()\n )\n }\n\n return Actions.handleError(dispatch)(err)\n })\n }\n}\n\nexport function paidRequest(\n { payment_details = {}, compliance_info = {}, showPPMeIframe, ppmeClaimUrl },\n isPurchase\n) {\n const {\n regulatory_information: {\n remittance_transfer_rule: { action } = {},\n status,\n } = {},\n payment_id,\n amount: { value } = {},\n } = payment_details\n\n // create meta data for analytics\n const flowType = isPurchase ? 'buy' : 'send'\n const isRTR = action && action === 'DISPLAY_TRANSACTION_DISCLOSURES'\n const isOFAC = status === 'UNDER_REVIEW'\n let flavor = isRTR ? 'rtr' : ''\n flavor += isOFAC ? 'ofac' : ''\n const pageGroup = `main:consumer:p2p:payRequest:${flowType}:done`\n const pageName = `main:consumer:p2p:payRequest:${flowType}:done:${flavor}`\n const data = {\n trid: payment_id,\n txn_amt: value,\n }\n\n return {\n type: types.TRANSACTION.PAID_REQUEST,\n meta: Actions.getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION_WITH_DATA, {\n linkName: 'paidRequestSuccessful',\n pageGroup,\n pageName,\n data,\n }),\n data: {\n paymentDetails: payment_details,\n complianceInfo: compliance_info,\n showPPMeIframe,\n ppmeClaimUrl,\n },\n receivedAt: Date.now(),\n }\n}\n","/**\n * p2p_business_search\n * https://www.msmaster.qa.paypal.com/elmo/experiment/111963\n */\n\nimport * as pxp from 'lib/pxp'\n\nexport function isBizSearchTreatment() {\n return pxp.isTreatment('Trmt_p2p_business_search')\n}\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIteratee = require('./_baseIteratee'),\n toInteger = require('./toInteger');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nmodule.exports = findIndex;\n","/**\n * This file contains logic that is specific to funding instrument selection\n */\n\nimport store from '../transfer/stores/configureStore'\nimport { WALLET } from '../transfer/constants'\nimport { isOpenBankingTreatment } from './openBanking'\n\nexport function generateFIFlowUrl({ flowType = 'send', ...data }) {\n return generateGenericFlowURL(\n { flowType, ...data },\n '/myaccount/transfer/flow/fi/new/?'\n )\n}\n\nexport function generateNegBalFlowUrl({ flowType = 'send', ...data }) {\n return generateGenericFlowURL(\n { flowType, ...data },\n '/myaccount/transfer/flow/fi/neg/?'\n )\n}\n\nexport function generateGenericFlowURL(\n { flowType = 'send', ...data },\n urlPrefix\n) {\n const params = { flowType, ...data }\n const flowData = Object.keys(params)\n .reduce(\n (res, key) =>\n (res += `${encodeURIComponent(key)}=${encodeURIComponent(\n params[key]\n )}&`),\n ''\n )\n .slice(0, -1)\n return `${urlPrefix}${flowData}`\n}\n\n/**\n * Function to check eligibility of moneynodeweb add FI flow\n */\nexport function canAddBankAndCard() {\n const canAddFI = store.getState().server.groupFeatures\n .isMoneyNodeWebAddFISupported\n return canAddFI\n}\n\n/**\n * Function to check eligibility of moneynodeweb add bank only flow\n */\nexport function canOnlyAddBank(flowType) {\n const canAddBankOnly = store.getState().server.groupFeatures\n .isMoneyNodeWebAddBankOnlySupported\n return flowType === 'send' && canAddBankOnly\n}\n\nexport function getFILinkName(flowType) {\n if (canAddBankAndCard()) {\n if (canOnlyAddBank(flowType)) {\n return WALLET.NEW_BANK\n }\n return WALLET.NEW_CARD\n }\n\n if (isOpenBankingTreatment()) {\n return WALLET.LINK_BANK_CARD\n }\n\n return WALLET.NEW_CARD\n}\n","/**\n * Checks if `value` is `undefined`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n * @example\n *\n * _.isUndefined(void 0);\n * // => true\n *\n * _.isUndefined(null);\n * // => false\n */\nfunction isUndefined(value) {\n return value === undefined;\n}\n\nmodule.exports = isUndefined;\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nfunction _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}\nmodule.exports = _asyncToGenerator, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","/*** IMPORTS FROM imports-loader ***/\nvar define = false;\n\n/**\n * Globalize v1.7.0\n *\n * https://github.com/globalizejs/globalize\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2021-08-02T11:53Z\n */\n/*!\n * Globalize v1.7.0 2021-08-02T11:53Z Released under the MIT license\n * http://git.io/TrdQbw\n */\n(function( root, factory ) {\n\n\t// UMD returnExports\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD\n\t\tdefine([\n\t\t\t\"cldr\",\n\t\t\t\"cldr/event\"\n\t\t], factory );\n\t} else if ( typeof exports === \"object\" ) {\n\n\t\t// Node, CommonJS\n\t\tmodule.exports = factory( require( \"cldrjs\" ) );\n\t} else {\n\n\t\t// Global\n\t\troot.Globalize = factory( root.Cldr );\n\t}\n}( this, function( Cldr ) {\n\n\n/**\n * A toString method that outputs meaningful values for objects or arrays and\n * still performs as fast as a plain string in case variable is string, or as\n * fast as `\"\" + number` in case variable is a number.\n * Ref: http://jsperf.com/my-stringify\n */\nvar toString = function( variable ) {\n\treturn typeof variable === \"string\" ? variable : ( typeof variable === \"number\" ? \"\" +\n\t\tvariable : JSON.stringify( variable ) );\n};\n\n\n\n\n/**\n * formatMessage( message, data )\n *\n * @message [String] A message with optional {vars} to be replaced.\n *\n * @data [Array or JSON] Object with replacing-variables content.\n *\n * Return the formatted message. For example:\n *\n * - formatMessage( \"{0} second\", [ 1 ] ); // 1 second\n *\n * - formatMessage( \"{0}/{1}\", [\"m\", \"s\"] ); // m/s\n *\n * - formatMessage( \"{name} <{email}>\", {\n * name: \"Foo\",\n * email: \"bar@baz.qux\"\n * }); // Foo \n */\nvar formatMessage = function( message, data ) {\n\n\t// Replace {attribute}'s\n\tmessage = message.replace( /{[0-9a-zA-Z-_. ]+}/g, function( name ) {\n\t\tname = name.replace( /^{([^}]*)}$/, \"$1\" );\n\t\treturn toString( data[ name ] );\n\t});\n\n\treturn message;\n};\n\n\n\n\nvar objectExtend = function() {\n\tvar destination = arguments[ 0 ],\n\t\tsources = [].slice.call( arguments, 1 );\n\n\tsources.forEach(function( source ) {\n\t\tvar prop;\n\t\tfor ( prop in source ) {\n\t\t\tdestination[ prop ] = source[ prop ];\n\t\t}\n\t});\n\n\treturn destination;\n};\n\n\n\n\nvar createError = function( code, message, attributes ) {\n\tvar error;\n\n\tmessage = code + ( message ? \": \" + formatMessage( message, attributes ) : \"\" );\n\terror = new Error( message );\n\terror.code = code;\n\n\tobjectExtend( error, attributes );\n\n\treturn error;\n};\n\n\n\n\n/**\n * Pushes part to parts array, concat two consecutive parts of the same type.\n */\nvar partsPush = function( parts, type, value ) {\n\n\t\t// Concat two consecutive parts of same type\n\t\tif ( parts.length && parts[ parts.length - 1 ].type === type ) {\n\t\t\tparts[ parts.length - 1 ].value += value;\n\t\t\treturn;\n\t\t}\n\n\t\tparts.push( { type: type, value: value } );\n};\n\n\n\n\n/**\n * formatMessage( message, data )\n *\n * @message [String] A message with optional {vars} to be replaced.\n *\n * @data [Array or JSON] Object with replacing-variables content.\n *\n * Return the formatted message. For example:\n *\n * - formatMessage( \"{0} second\", [ 1 ] );\n * > [{type: \"variable\", value: \"1\", name: \"0\"}, {type: \"literal\", value: \" second\"}]\n *\n * - formatMessage( \"{0}/{1}\", [\"m\", \"s\"] );\n * > [\n * { type: \"variable\", value: \"m\", name: \"0\" },\n * { type: \"literal\", value: \" /\" },\n * { type: \"variable\", value: \"s\", name: \"1\" }\n * ]\n */\nvar formatMessageToParts = function( message, data ) {\n\n\tvar lastOffset = 0,\n\t\tparts = [];\n\n\t// Create parts.\n\tmessage.replace( /{[0-9a-zA-Z-_. ]+}/g, function( nameIncludingBrackets, offset ) {\n\t\tvar name = nameIncludingBrackets.slice( 1, -1 );\n\t\tpartsPush( parts, \"literal\", message.slice( lastOffset, offset ));\n\t\tpartsPush( parts, \"variable\", data[ name ] );\n\t\tparts[ parts.length - 1 ].name = name;\n\t\tlastOffset += offset + nameIncludingBrackets.length;\n\t});\n\n\t// Skip empty ones such as `{ type: 'literal', value: '' }`.\n\treturn parts.filter(function( part ) {\n\t\treturn part.value !== \"\";\n\t});\n};\n\n\n\n\n/**\n * Returns joined parts values.\n */\nvar partsJoin = function( parts ) {\n\treturn parts.map( function( part ) {\n\t\treturn part.value;\n\t}).join( \"\" );\n};\n\n\n\n\nvar runtimeStringify = function( args ) {\n\treturn JSON.stringify( args, function( _key, value ) {\n\t\tif ( value && value.runtimeKey ) {\n\t\t\treturn value.runtimeKey;\n\t\t}\n\t\treturn value;\n\t} );\n};\n\n\n\n\n// Based on http://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript-jquery\nvar stringHash = function( str ) {\n\treturn [].reduce.call( str, function( hash, i ) {\n\t\tvar chr = i.charCodeAt( 0 );\n\t\thash = ( ( hash << 5 ) - hash ) + chr;\n\t\treturn hash | 0;\n\t}, 0 );\n};\n\n\n\n\nvar runtimeKey = function( fnName, locale, args, argsStr ) {\n\tvar hash;\n\targsStr = argsStr || runtimeStringify( args );\n\thash = stringHash( fnName + locale + argsStr );\n\treturn hash > 0 ? \"a\" + hash : \"b\" + Math.abs( hash );\n};\n\n\n\n\nvar functionName = function( fn ) {\n\tif ( fn.name !== undefined ) {\n\t\treturn fn.name;\n\t}\n\n\t// fn.name is not supported by IE.\n\tvar matches = /^function\\s+([\\w\\$]+)\\s*\\(/.exec( fn.toString() );\n\n\tif ( matches && matches.length > 0 ) {\n\t\treturn matches[ 1 ];\n\t}\n};\n\n\n\n\nvar runtimeBind = function( args, cldr, fn, runtimeArgs ) {\n\n\tvar argsStr = runtimeStringify( args ),\n\t\tfnName = functionName( fn ),\n\t\tlocale = cldr.locale;\n\n\t// If name of the function is not available, this is most likely due to uglification,\n\t// which most likely means we are in production, and runtimeBind here is not necessary.\n\tif ( !fnName ) {\n\t\treturn fn;\n\t}\n\n\tfn.runtimeKey = runtimeKey( fnName, locale, null, argsStr );\n\n\tfn.generatorString = function() {\n\t\treturn \"Globalize(\\\"\" + locale + \"\\\").\" + fnName + \"(\" + argsStr.slice( 1, -1 ) + \")\";\n\t};\n\n\tfn.runtimeArgs = runtimeArgs;\n\n\treturn fn;\n};\n\n\n\n\nvar validate = function( code, message, check, attributes ) {\n\tif ( !check ) {\n\t\tthrow createError( code, message, attributes );\n\t}\n};\n\n\n\n\nvar alwaysArray = function( stringOrArray ) {\n\treturn Array.isArray( stringOrArray ) ? stringOrArray : stringOrArray ? [ stringOrArray ] : [];\n};\n\n\n\n\nvar validateCldr = function( path, value, options ) {\n\tvar skipBoolean;\n\toptions = options || {};\n\n\tskipBoolean = alwaysArray( options.skip ).some(function( pathRe ) {\n\t\treturn pathRe.test( path );\n\t});\n\n\tvalidate( \"E_MISSING_CLDR\", \"Missing required CLDR content `{path}`.\", value || skipBoolean, {\n\t\tpath: path\n\t});\n};\n\n\n\n\nvar validateDefaultLocale = function( value ) {\n\tvalidate( \"E_DEFAULT_LOCALE_NOT_DEFINED\", \"Default locale has not been defined.\",\n\t\tvalue !== undefined, {} );\n};\n\n\n\n\nvar validateParameterPresence = function( value, name ) {\n\tvalidate( \"E_MISSING_PARAMETER\", \"Missing required parameter `{name}`.\",\n\t\tvalue !== undefined, { name: name });\n};\n\n\n\n\n/**\n * range( value, name, minimum, maximum )\n *\n * @value [Number].\n *\n * @name [String] name of variable.\n *\n * @minimum [Number]. The lowest valid value, inclusive.\n *\n * @maximum [Number]. The greatest valid value, inclusive.\n */\nvar validateParameterRange = function( value, name, minimum, maximum ) {\n\tvalidate(\n\t\t\"E_PAR_OUT_OF_RANGE\",\n\t\t\"Parameter `{name}` has value `{value}` out of range [{minimum}, {maximum}].\",\n\t\tvalue === undefined || value >= minimum && value <= maximum,\n\t\t{\n\t\t\tmaximum: maximum,\n\t\t\tminimum: minimum,\n\t\t\tname: name,\n\t\t\tvalue: value\n\t\t}\n\t);\n};\n\n\n\n\nvar validateParameterType = function( value, name, check, expected ) {\n\tvalidate(\n\t\t\"E_INVALID_PAR_TYPE\",\n\t\t\"Invalid `{name}` parameter ({value}). {expected} expected.\",\n\t\tcheck,\n\t\t{\n\t\t\texpected: expected,\n\t\t\tname: name,\n\t\t\tvalue: value\n\t\t}\n\t);\n};\n\n\n\n\nvar validateParameterTypeLocale = function( value, name ) {\n\tvalidateParameterType(\n\t\tvalue,\n\t\tname,\n\t\tvalue === undefined || typeof value === \"string\" || value instanceof Cldr,\n\t\t\"String or Cldr instance\"\n\t);\n};\n\n\n\n\n/**\n * Function inspired by jQuery Core, but reduced to our use case.\n */\nvar isPlainObject = function( obj ) {\n\treturn obj !== null && \"\" + obj === \"[object Object]\";\n};\n\n\n\n\nvar validateParameterTypePlainObject = function( value, name ) {\n\tvalidateParameterType(\n\t\tvalue,\n\t\tname,\n\t\tvalue === undefined || isPlainObject( value ),\n\t\t\"Plain Object\"\n\t);\n};\n\n\n\n\nvar alwaysCldr = function( localeOrCldr ) {\n\treturn localeOrCldr instanceof Cldr ? localeOrCldr : new Cldr( localeOrCldr );\n};\n\n\n\n\n// ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions?redirectlocale=en-US&redirectslug=JavaScript%2FGuide%2FRegular_Expressions\nvar regexpEscape = function( string ) {\n\treturn string.replace( /([.*+?^=!:${}()|\\[\\]\\/\\\\])/g, \"\\\\$1\" );\n};\n\n\n\n\nvar stringPad = function( str, count, right ) {\n\tvar length;\n\tif ( typeof str !== \"string\" ) {\n\t\tstr = String( str );\n\t}\n\tfor ( length = str.length; length < count; length += 1 ) {\n\t\tstr = ( right ? ( str + \"0\" ) : ( \"0\" + str ) );\n\t}\n\treturn str;\n};\n\n\n\n\nfunction validateLikelySubtags( cldr ) {\n\tcldr.once( \"get\", validateCldr );\n\tcldr.get( \"supplemental/likelySubtags\" );\n}\n\n/**\n * [new] Globalize( locale|cldr )\n *\n * @locale [String]\n *\n * @cldr [Cldr instance]\n *\n * Create a Globalize instance.\n */\nfunction Globalize( locale ) {\n\tif ( !( this instanceof Globalize ) ) {\n\t\treturn new Globalize( locale );\n\t}\n\n\tvalidateParameterPresence( locale, \"locale\" );\n\tvalidateParameterTypeLocale( locale, \"locale\" );\n\n\tthis.cldr = alwaysCldr( locale );\n\n\tvalidateLikelySubtags( this.cldr );\n}\n\n/**\n * Globalize.load( json, ... )\n *\n * @json [JSON]\n *\n * Load resolved or unresolved cldr data.\n * Somewhat equivalent to previous Globalize.addCultureInfo(...).\n */\nGlobalize.load = function() {\n\n\t// validations are delegated to Cldr.load().\n\tCldr.load.apply( Cldr, arguments );\n};\n\n/**\n * Globalize.locale( [locale|cldr] )\n *\n * @locale [String]\n *\n * @cldr [Cldr instance]\n *\n * Set default Cldr instance if locale or cldr argument is passed.\n *\n * Return the default Cldr instance.\n */\nGlobalize.locale = function( locale ) {\n\tvalidateParameterTypeLocale( locale, \"locale\" );\n\n\tif ( arguments.length ) {\n\t\tthis.cldr = alwaysCldr( locale );\n\t\tvalidateLikelySubtags( this.cldr );\n\t}\n\treturn this.cldr;\n};\n\n/**\n * Optimization to avoid duplicating some internal functions across modules.\n */\nGlobalize._alwaysArray = alwaysArray;\nGlobalize._createError = createError;\nGlobalize._formatMessage = formatMessage;\nGlobalize._formatMessageToParts = formatMessageToParts;\nGlobalize._isPlainObject = isPlainObject;\nGlobalize._objectExtend = objectExtend;\nGlobalize._partsJoin = partsJoin;\nGlobalize._partsPush = partsPush;\nGlobalize._regexpEscape = regexpEscape;\nGlobalize._runtimeBind = runtimeBind;\nGlobalize._stringPad = stringPad;\nGlobalize._validate = validate;\nGlobalize._validateCldr = validateCldr;\nGlobalize._validateDefaultLocale = validateDefaultLocale;\nGlobalize._validateParameterPresence = validateParameterPresence;\nGlobalize._validateParameterRange = validateParameterRange;\nGlobalize._validateParameterTypePlainObject = validateParameterTypePlainObject;\nGlobalize._validateParameterType = validateParameterType;\n\nreturn Globalize;\n\n\n\n\n}));\n\n","/**\n * CLDR JavaScript Library v0.5.4\n * http://jquery.com/\n *\n * Copyright 2013 Rafael Xavier de Souza\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2020-10-22T15:56Z\n */\n/*!\n * CLDR JavaScript Library v0.5.4 2020-10-22T15:56Z MIT license © Rafael Xavier\n * http://git.io/h4lmVg\n */\n\n// Cldr\nmodule.exports = require( \"./cldr\" );\n\n// Extent Cldr with the following modules\nrequire( \"./cldr/event\" );\nrequire( \"./cldr/supplemental\" );\nrequire( \"./cldr/unresolved\" );\n","import { trackLink, trackImpression } from 'lib/analytics/fpti'\n\nconst CONTACT_DETAIL_PAGE_GROUP = 'main:p2p:tab-contacts:activityDetail'\nconst CONTACT_DETAIL_PAGE_NAME = 'main:p2p:tab-contacts:activityDetail:node::'\nconst CONTACT_LIST_PAGE_GROUP = 'main:p2p:tab-contacts'\nconst CONTACT_LIST_PAGE_NAME = 'main:p2p:tab-contacts:node::'\nconst BLOCK_CONTACT_PAGE_GROUP = `${CONTACT_DETAIL_PAGE_GROUP}:contact_block_alert`\nconst BLOCK_CONTACT_PAGE_NAME = `${CONTACT_DETAIL_PAGE_NAME}:contact_block_alert`\nconst BLOCKED_CONTACTS_PAGE_GROUP = `${CONTACT_LIST_PAGE_GROUP}:blockedusers::`\nconst BLOCKED_CONTACTS_PAGE_NAME = `${CONTACT_LIST_PAGE_NAME}:blockedusers:`\nconst BLOCK_ERROR_PAGE_GROUP = `${CONTACT_DETAIL_PAGE_GROUP}:contact_blocked:`\nconst BLOCK_ERROR_PAGE_NAME = `${CONTACT_DETAIL_PAGE_NAME}:contact_blocked`\n\n/**\n * Track block user click from contact details page\n **/\nexport function trackBlockContactClick() {\n trackLink(\n 'block',\n CONTACT_DETAIL_PAGE_GROUP,\n CONTACT_DETAIL_PAGE_NAME,\n 'link'\n )\n}\n\n/**\n * Track block user confirmation overpanel impression\n **/\nexport function trackBlockContactImpression() {\n trackImpression(BLOCK_CONTACT_PAGE_GROUP, BLOCK_CONTACT_PAGE_NAME)\n}\n\n/**\n * Track block user confirm button from block confirmation\n **/\nexport function trackBlockConfirmationClick() {\n trackLink('block', BLOCK_CONTACT_PAGE_GROUP, BLOCK_CONTACT_PAGE_NAME, 'link')\n}\n\n/**\n * Track block user cancel from block confirmation\n **/\nexport function trackBlockCancelClick() {\n trackLink('cancel', BLOCK_CONTACT_PAGE_GROUP, BLOCK_CONTACT_PAGE_NAME, 'link')\n}\n\n/**\n * Track blocked contact success overpanel impression\n **/\nexport function trackBlockContactSuccessImpression() {\n trackImpression(CONTACT_LIST_PAGE_GROUP, CONTACT_LIST_PAGE_NAME, {\n message_shown: 'contact_blocked',\n })\n}\n\n/**\n * Track blocked contacts link clicks from contact list\n **/\nexport function trackViewBlockedContactsLink() {\n trackLink(\n 'blocked_users',\n BLOCKED_CONTACTS_PAGE_GROUP,\n BLOCKED_CONTACTS_PAGE_NAME,\n 'link'\n )\n}\n\n/**\n * Track block user error overpanel\n **/\nexport function trackBlockedContactsImpression() {\n trackImpression(BLOCKED_CONTACTS_PAGE_GROUP, BLOCKED_CONTACTS_PAGE_NAME)\n}\n\n/**\n * Track unblock contact link\n **/\nexport function trackUnblockContactLink({ payerId }) {\n trackLink(\n 'undo',\n BLOCKED_CONTACTS_PAGE_GROUP,\n BLOCKED_CONTACTS_PAGE_NAME,\n 'link',\n { encr_rcvr_id: payerId }\n )\n}\n\n/**\n * Track unblocked contact success overpanel impression\n **/\nexport function trackUnblockContactSuccessImpression() {\n trackImpression(CONTACT_LIST_PAGE_GROUP, CONTACT_LIST_PAGE_NAME, {\n message_shown: 'contact_unblocked',\n })\n}\n\n/**\n * Track error message sending/requesting to/from a blocked contact\n **/\nexport function trackContactBlockedErrorImpression() {\n trackImpression(BLOCK_ERROR_PAGE_GROUP, BLOCK_ERROR_PAGE_NAME)\n}\n","var createFind = require('./_createFind'),\n findIndex = require('./findIndex');\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nmodule.exports = find;\n","// https://github.paypal.com/pages/Globalization-R/griffin-paypal/docs/name-client.html\nimport { get } from 'lodash'\nimport { useSelector } from './p2p-connect'\nimport griffinName from 'griffin-paypal/name'\nimport getGriffinMetadata, { useGriffinMetadata } from './griffin-utils'\n\nexport function getInformalName({\n givenName = '',\n surname = '',\n country = '',\n griffinMetadata = getGriffinMetadata(),\n}) {\n let informalName = ''\n\n // safeguard against undefined\n if (!givenName || !surname || !country || !griffinMetadata) {\n return informalName\n }\n\n const griffinNameHandler = griffinName.createHandler(griffinMetadata)\n const options = {\n country,\n style: griffinNameHandler.NAME_FORMAT_INFORMAL,\n }\n\n // Potentially can throw an error if country is not available\n try {\n const nameObject = { givenName, surname }\n informalName = griffinNameHandler.formatName(nameObject, options)\n } catch (exception) {\n // Do nothing since informalName is already empty string\n }\n return informalName\n}\n\nexport function useInformalName({ givenName = '', surname = '' }) {\n const griffinMetadata = useGriffinMetadata()\n const country = useSelector(state => get(state, 'server.country', {}))\n return getInformalName({\n givenName,\n surname,\n country,\n griffinMetadata,\n })\n}\n","// @flow\n\nimport { trackLink, trackImpression } from 'lib/analytics/fpti'\n\nexport const UNILATERAL_RECIPIENT_CHOICE_PAGE_GROUP =\n 'main:p2p:unilateralRecipientChoice'\nexport const UNILATERAL_RECIPIENT_CHOICE_PAGE_NAME =\n 'main:p2p:unilateralRecipientChoice::'\n\n/**\n * Track unilateral recipient choice overpanel impression via FPTI analytics\n */\nexport function trackUnilateralRecipientChoiceImpression() {\n trackImpression(\n UNILATERAL_RECIPIENT_CHOICE_PAGE_GROUP,\n UNILATERAL_RECIPIENT_CHOICE_PAGE_NAME\n )\n}\n\n/**\n * Track unilateral recipient choice cancel button click on overpanel via FPTI analytics\n */\nexport function trackUnilateralRecipientChoiceCancel() {\n trackLink(\n 'cancel',\n UNILATERAL_RECIPIENT_CHOICE_PAGE_GROUP,\n UNILATERAL_RECIPIENT_CHOICE_PAGE_NAME,\n 'link',\n {}\n )\n}\n\n/**\n * Track unilateral recipient choice primary submit button via FPTI analytics\n */\nexport function trackUnilateralRecipientChoiceSubmit() {\n trackLink(\n 'submit',\n UNILATERAL_RECIPIENT_CHOICE_PAGE_GROUP,\n UNILATERAL_RECIPIENT_CHOICE_PAGE_NAME,\n 'link',\n {}\n )\n}\n","import { getInformalName } from './name-utils'\nimport { trackImpression, trackLinkWithData } from 'lib/analytics/fpti'\nimport { tracking as mParticleTracking } from 'lib/analytics/mParticle'\nimport content from 'pp-react-l10n'\nconst i18n = content('transfer/24-hour-holds/index')\n\n// https://www.msmaster.qa.paypal.com/elmo/experiment/103853\n// These are the experiment/treatments, although we defer the ELMO call to services\nexport const VARIANTS = {\n GENERIC: 'RISK_24_HOUR_HOLDS_GENERIC',\n SECURITY: 'RISK_24_HOUR_HOLDS_SECURITY',\n ACCOUNT_TAKEOVER: 'RISK_24_HOUR_HOLDS_ACCOUNT_TAKEOVER',\n ACCOUNT_TAKEOVER_WITH_AVATAR:\n 'RISK_24_HOUR_HOLDS_ACCOUNT_TAKEOVER_WITH_AVATAR',\n}\n\n// Based upon confluence page:-\n// https://engineering.paypalcorp.com/confluence/display/MUSIC/P2P+%7C+24+Hr+Hold\nconst PAGE_NAME = 'main:p2p:sendmoney:submit:riskhold::'\nconst PAGE_GROUP = 'main:p2p:sendmoney:submit:riskhold'\n\nexport function trackRiskHoldImpression({\n additionalDisclosureActions = [],\n riskHoldOverpanelVariant = '',\n}) {\n const trackingData = {\n action: additionalDisclosureActions.join(', '),\n page_variant: riskHoldOverpanelVariant,\n }\n trackImpression(PAGE_GROUP, PAGE_NAME, trackingData)\n mParticleTracking('24_hr_hold_screen_shown', 'im', trackingData)\n}\n\nexport function trackButtonClick(buttonName = 'continue', overpanelVariant) {\n const trackingData = {\n page_variant: overpanelVariant,\n }\n const eventName = `24_hr_hold_${buttonName}_pressed`\n trackLinkWithData(buttonName, PAGE_GROUP, PAGE_NAME, {}, 'link', {})\n mParticleTracking(eventName, 'cl', trackingData)\n}\n\nexport function hasTwentyFourHourHoldsVariant(overpanelVariant = '') {\n for (const key in VARIANTS) {\n if (overpanelVariant === VARIANTS[key]) {\n return true\n }\n }\n return false\n}\n\nexport function getHeaderContent({ variant = '', name = '' }) {\n switch (variant) {\n // Design change - the generic variant now uses account takeover header\n case VARIANTS.GENERIC:\n case VARIANTS.ACCOUNT_TAKEOVER:\n return i18n('header.accountTakeover', { name })\n // All other variants will use old generic header\n default:\n return i18n('header.generic', { name })\n }\n}\n\n// Get respective paragraph content depending on variant\nexport function getParagraphContent({\n variant = '',\n firstName: givenName = '',\n lastName: surname = '',\n displayName = '',\n recipient = '',\n country = '',\n}) {\n const informalName =\n getInformalName({ givenName, surname, country }) ||\n displayName ||\n recipient ||\n i18n('paragraph.they')\n switch (variant) {\n case VARIANTS.ACCOUNT_TAKEOVER_WITH_AVATAR:\n return i18n('paragraph.security', { informalName })\n case VARIANTS.SECURITY:\n return i18n('paragraph.noDuration', { name: informalName })\n default:\n return i18n('paragraph.accountTakeover', { informalName })\n }\n}\n","// https://internal.msmaster.qa.paypal.com/elmo/experiment/124425\nimport { ENV_TYPE } from '../../../lib/constants'\nimport * as pxp from '../lib/pxp'\nimport store from '../transfer/stores/configureStore'\n\n// 1. Omit the Donate flow until it is migrated to V2 (p2pgatewayserv / graphql)\n// as V1 does not have full support for new supportedCapabilities.\n// 2. Omit the PISP/PSD2 flows (Amex, Splitwise, Fidelity, dual control, ...)\n// to avoid legal reviews until it is proven this trmt increases conversion.\n// * See lib/externalConfig/pisp.js -> PISP_PARTNER_SITE_HOSTS\nconst omittedFlows = [ENV_TYPE.DONATE, ENV_TYPE.PISP]\n\nconst isOmittedFlow = () => {\n const { server } = store.getState()\n return omittedFlows.includes(server.env)\n}\n\nexport function hasFIFailuresEnhancementTrmnt() {\n if (isOmittedFlow()) {\n return false\n }\n\n return pxp && pxp.isTreatment('Trmt_p2p_fi_failures_enhancement')\n}\n","\"use strict\";\n\nfunction alwaysArray(stringOrArray) {\n return Array.isArray(stringOrArray)\n ? stringOrArray\n : stringOrArray\n ? [stringOrArray]\n : [];\n}\n\n// Based on https://mathiasbynens.be/notes/javascript-unicode#iterating-over-symbols\n// This function will return combination unicode character array.\n// For example, \"𠜎.\" will be returned as [\"𠜎\", \".\"] \"𠜎\" has two unicode characters i.e. \"\\ud841\\udf0e\"\nfunction getSymbolArray(str) {\n var index = 0;\n var length = str.length;\n var output = [];\n for (; index < length; ++index) {\n var charCode = str.charCodeAt(index);\n if (charCode >= 0xd800 && charCode <= 0xdbff) {\n charCode = str.charCodeAt(index + 1);\n if (charCode >= 0xdc00 && charCode <= 0xdfff) {\n output.push(str.slice(index, index + 2));\n ++index;\n continue;\n }\n }\n output.push(str.charAt(index));\n }\n return output;\n}\n\nfunction findUniqueElementArray(arr) {\n var res = [];\n for (var index = 0; index < arr.length; index = index + 1) {\n if (!res.includes(arr[index])) {\n res.push(arr[index]);\n }\n }\n return res;\n}\n\nmodule.exports = {\n alwaysArray: alwaysArray,\n getSymbolArray: getSymbolArray,\n findUniqueElementArray: findUniqueElementArray\n};\n","import { getFlowType } from '../utils/url-utils'\nimport { INSTRUMENTATION_TYPES } from '../constants'\n\nexport function getAnalyticsMeta(type, payload) {\n return { analytics: { type, payload } }\n}\n\nexport function fromChoiceToReview(analyticsData) {\n const urlPathName = window.location.pathname || ''\n const unified = urlPathName.includes('homepage')\n const unifiedString = unified ? 'unified:' : ''\n\n const linkName = 'next'\n const flowType = getFlowType()\n const pageGroup = `main:p2p:${unifiedString}choice:fioption`\n const pageName = `main:p2p:${unifiedString}choice:fioption::node`\n const nextPageGroup = `main:p2p:${unifiedString}${flowType}::review`\n const nextPageName = `main:p2p:${unifiedString}${flowType}::review:node::`\n\n return getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION_WITH_DATA, {\n linkName,\n pageGroup: pageGroup,\n pageName: pageName,\n data: analyticsData,\n nextPageGroup: nextPageGroup,\n nextPageName: nextPageName,\n trackType: 'link',\n })\n}\n\nexport function trackEditContacts({\n type = INSTRUMENTATION_TYPES.PAGE_CHANGE,\n linkName = '',\n pageName = '',\n pageGroup = '',\n}) {\n return {\n type: '',\n meta: getAnalyticsMeta(type, {\n linkName,\n pageName,\n pageGroup,\n }),\n }\n}\n","import * as pxp from 'lib/pxp'\n\n/**\n * FEAT. : Multi item cart for PayPal shops.\n * This is for controlling paypal shops multi item cart experience.\n * https://www.msmaster.qa.paypal.com/elmo/experiment/122453\n * TODO: (Pending to put production URL)\n */\nexport function hasMultiItemCartShops() {\n return pxp.isTreatment('Trmt_p2p_shops_multi_item_cart_exp')\n}\n\n/**\n * FEAT. : Allow guest payment.\n * This is to allow guest payment or force user to sign up based on product requirements.\n * In accordance with risk: 1. any email can be used to make payment, 2. there is no way to give user receipt.\n * https://www.msmaster.qa.paypal.com/elmo/experiment/122859\n * TODO: (Pending to put production URL)\n */\nexport function hasAllowGuestPayment() {\n return pxp.isTreatment('Trmt_p2p_shop_allow_guest_paymemt')\n}\n","// @flow\nimport { useMemo } from 'react'\n\n/**\n * Preload image to cache on the client\n * @param {string} url - URL of image to preload\n */\nexport function preloadImage(url: string) {\n if (url && typeof url === 'string') {\n const image = new Image()\n image.src = url\n }\n}\n\n/**\n * Preload image hook to cache on the client (for functional components)\n * @param {string} url - URL of image to preload\n */\nexport function usePreloadImage(url: string) {\n useMemo(() => preloadImage(url), [url])\n}\n","/**\n * This file contains logic that is specific to default currency experiment, including\n * US: https://pxpdev.paypal.com/configuration?exptId=3248\n * Rest of the world: https://pxpdev.paypal.com/configuration?exptId=3294\n * As we've decided to go with 100% T4 experience, removed all the pxp check in this file.\n */\n\nexport function shouldFetchRecipientDetails(flowType = '') {\n // do not fetch recipient details (which changes default currency) for request\n if (flowType === 'request') {\n return false\n }\n\n return true\n}\n\n/**\n * This function map the keys we get from service to keys\n */\nexport function mapDefaultCurrencyKeys(obj = {}) {\n const keyMap = {\n isCrossBorderRecipient: 'iscbr',\n recipientLocalCurrency: 'rcur',\n senderCountryCode: 'sndcc',\n senderLocalCurrency: 'sndcur',\n }\n\n return Object.keys(obj).reduce((acc, curr) => {\n acc[keyMap[curr]] = obj[curr]\n return acc\n }, {})\n}\n\n/**\n * Reorder the currency list: put receiver's local currency at the first of the list\n *\n */\nexport function reorderCurrencyList(targetCurrency, currencyList) {\n const currencyItem = currencyList.find(item => item.code === targetCurrency)\n if (!currencyItem) {\n return currencyList\n }\n\n return [\n currencyItem,\n ...currencyList.filter(currency => currency.code !== currencyItem.code),\n ]\n}\n","\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar React = require(\"react\");\nvar PropTypes = require(\"prop-types\");\n\nvar ALL_INITIALIZERS = [];\nvar READY_INITIALIZERS = [];\n\nfunction isWebpackReady(getModuleIds) {\n if ((typeof __webpack_modules__ === \"undefined\" ? \"undefined\" : _typeof(__webpack_modules__)) !== \"object\") {\n return false;\n }\n\n return getModuleIds().every(function (moduleId) {\n return typeof moduleId !== \"undefined\" && typeof __webpack_modules__[moduleId] !== \"undefined\";\n });\n}\n\nfunction load(loader) {\n var promise = loader();\n\n var state = {\n loading: true,\n loaded: null,\n error: null\n };\n\n state.promise = promise.then(function (loaded) {\n state.loading = false;\n state.loaded = loaded;\n return loaded;\n }).catch(function (err) {\n state.loading = false;\n state.error = err;\n throw err;\n });\n\n return state;\n}\n\nfunction loadMap(obj) {\n var state = {\n loading: false,\n loaded: {},\n error: null\n };\n\n var promises = [];\n\n try {\n Object.keys(obj).forEach(function (key) {\n var result = load(obj[key]);\n\n if (!result.loading) {\n state.loaded[key] = result.loaded;\n state.error = result.error;\n } else {\n state.loading = true;\n }\n\n promises.push(result.promise);\n\n result.promise.then(function (res) {\n state.loaded[key] = res;\n }).catch(function (err) {\n state.error = err;\n });\n });\n } catch (err) {\n state.error = err;\n }\n\n state.promise = Promise.all(promises).then(function (res) {\n state.loading = false;\n return res;\n }).catch(function (err) {\n state.loading = false;\n throw err;\n });\n\n return state;\n}\n\nfunction resolve(obj) {\n return obj && obj.__esModule ? obj.default : obj;\n}\n\nfunction render(loaded, props) {\n return React.createElement(resolve(loaded), props);\n}\n\nfunction createLoadableComponent(loadFn, options) {\n var _class, _temp;\n\n if (!options.loading) {\n throw new Error(\"react-loadable requires a `loading` component\");\n }\n\n var opts = Object.assign({\n loader: null,\n loading: null,\n delay: 200,\n timeout: null,\n render: render,\n webpack: null,\n modules: null\n }, options);\n\n var res = null;\n\n function init() {\n if (!res) {\n res = loadFn(opts.loader);\n }\n return res.promise;\n }\n\n ALL_INITIALIZERS.push(init);\n\n if (typeof opts.webpack === \"function\") {\n READY_INITIALIZERS.push(function () {\n if (isWebpackReady(opts.webpack)) {\n return init();\n }\n });\n }\n\n return _temp = _class = function (_React$Component) {\n _inherits(LoadableComponent, _React$Component);\n\n function LoadableComponent(props) {\n _classCallCheck(this, LoadableComponent);\n\n var _this = _possibleConstructorReturn(this, _React$Component.call(this, props));\n\n _this.retry = function () {\n _this.setState({ error: null, loading: true, timedOut: false });\n res = loadFn(opts.loader);\n _this._loadModule();\n };\n\n init();\n\n _this.state = {\n error: res.error,\n pastDelay: false,\n timedOut: false,\n loading: res.loading,\n loaded: res.loaded\n };\n return _this;\n }\n\n LoadableComponent.preload = function preload() {\n return init();\n };\n\n LoadableComponent.prototype.componentWillMount = function componentWillMount() {\n this._mounted = true;\n this._loadModule();\n };\n\n LoadableComponent.prototype._loadModule = function _loadModule() {\n var _this2 = this;\n\n if (this.context.loadable && Array.isArray(opts.modules)) {\n opts.modules.forEach(function (moduleName) {\n _this2.context.loadable.report(moduleName);\n });\n }\n\n if (!res.loading) {\n return;\n }\n\n if (typeof opts.delay === \"number\") {\n if (opts.delay === 0) {\n this.setState({ pastDelay: true });\n } else {\n this._delay = setTimeout(function () {\n _this2.setState({ pastDelay: true });\n }, opts.delay);\n }\n }\n\n if (typeof opts.timeout === \"number\") {\n this._timeout = setTimeout(function () {\n _this2.setState({ timedOut: true });\n }, opts.timeout);\n }\n\n var update = function update() {\n if (!_this2._mounted) {\n return;\n }\n\n _this2.setState({\n error: res.error,\n loaded: res.loaded,\n loading: res.loading\n });\n\n _this2._clearTimeouts();\n };\n\n res.promise.then(function () {\n update();\n }).catch(function (err) {\n update();\n });\n };\n\n LoadableComponent.prototype.componentWillUnmount = function componentWillUnmount() {\n this._mounted = false;\n this._clearTimeouts();\n };\n\n LoadableComponent.prototype._clearTimeouts = function _clearTimeouts() {\n clearTimeout(this._delay);\n clearTimeout(this._timeout);\n };\n\n LoadableComponent.prototype.render = function render() {\n if (this.state.loading || this.state.error) {\n return React.createElement(opts.loading, {\n isLoading: this.state.loading,\n pastDelay: this.state.pastDelay,\n timedOut: this.state.timedOut,\n error: this.state.error,\n retry: this.retry\n });\n } else if (this.state.loaded) {\n return opts.render(this.state.loaded, this.props);\n } else {\n return null;\n }\n };\n\n return LoadableComponent;\n }(React.Component), _class.contextTypes = {\n loadable: PropTypes.shape({\n report: PropTypes.func.isRequired\n })\n }, _temp;\n}\n\nfunction Loadable(opts) {\n return createLoadableComponent(load, opts);\n}\n\nfunction LoadableMap(opts) {\n if (typeof opts.render !== \"function\") {\n throw new Error(\"LoadableMap requires a `render(loaded, props)` function\");\n }\n\n return createLoadableComponent(loadMap, opts);\n}\n\nLoadable.Map = LoadableMap;\n\nvar Capture = function (_React$Component2) {\n _inherits(Capture, _React$Component2);\n\n function Capture() {\n _classCallCheck(this, Capture);\n\n return _possibleConstructorReturn(this, _React$Component2.apply(this, arguments));\n }\n\n Capture.prototype.getChildContext = function getChildContext() {\n return {\n loadable: {\n report: this.props.report\n }\n };\n };\n\n Capture.prototype.render = function render() {\n return React.Children.only(this.props.children);\n };\n\n return Capture;\n}(React.Component);\n\nCapture.propTypes = {\n report: PropTypes.func.isRequired\n};\nCapture.childContextTypes = {\n loadable: PropTypes.shape({\n report: PropTypes.func.isRequired\n }).isRequired\n};\n\n\nLoadable.Capture = Capture;\n\nfunction flushInitializers(initializers) {\n var promises = [];\n\n while (initializers.length) {\n var init = initializers.pop();\n promises.push(init());\n }\n\n return Promise.all(promises).then(function () {\n if (initializers.length) {\n return flushInitializers(initializers);\n }\n });\n}\n\nLoadable.preloadAll = function () {\n return new Promise(function (resolve, reject) {\n flushInitializers(ALL_INITIALIZERS).then(resolve, reject);\n });\n};\n\nLoadable.preloadReady = function () {\n return new Promise(function (resolve, reject) {\n // We always will resolve, errors should be handled within loading UIs.\n flushInitializers(READY_INITIALIZERS).then(resolve, resolve);\n });\n};\n\nmodule.exports = Loadable;","import { SHIPPING_ADDRESS_COLLECTION_PREFERENCES } from './constants'\n\nexport function isHideShippingAddress(shippingAddressCollectionPreference) {\n return (\n shippingAddressCollectionPreference ===\n SHIPPING_ADDRESS_COLLECTION_PREFERENCES.HIDE\n )\n}\n","\"use strict\";\nmodule.exports = require(\"./lib/client/name\");\n","'use strict';\n\n/* global setTimeout, clearTimeout */\n\nmodule.exports = function debounce(fn) {\n var wait = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n\n var lastCallAt = void 0;\n var deferred = void 0;\n var timer = void 0;\n var pendingArgs = [];\n return function debounced() {\n var currentWait = getWait(wait);\n var currentTime = new Date().getTime();\n\n var isCold = !lastCallAt || currentTime - lastCallAt > currentWait;\n\n lastCallAt = currentTime;\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n if (isCold && options.leading) {\n return options.accumulate ? Promise.resolve(fn.call(this, [args])).then(function (result) {\n return result[0];\n }) : Promise.resolve(fn.call.apply(fn, [this].concat(args)));\n }\n\n if (deferred) {\n clearTimeout(timer);\n } else {\n deferred = defer();\n }\n\n pendingArgs.push(args);\n timer = setTimeout(flush.bind(this), currentWait);\n\n if (options.accumulate) {\n var argsIndex = pendingArgs.length - 1;\n return deferred.promise.then(function (results) {\n return results[argsIndex];\n });\n }\n\n return deferred.promise;\n };\n\n function flush() {\n var thisDeferred = deferred;\n clearTimeout(timer);\n\n Promise.resolve(options.accumulate ? fn.call(this, pendingArgs) : fn.apply(this, pendingArgs[pendingArgs.length - 1])).then(thisDeferred.resolve, thisDeferred.reject);\n\n pendingArgs = [];\n deferred = null;\n }\n};\n\nfunction getWait(wait) {\n return typeof wait === 'function' ? wait() : wait;\n}\n\nfunction defer() {\n var deferred = {};\n deferred.promise = new Promise(function (resolve, reject) {\n deferred.resolve = resolve;\n deferred.reject = reject;\n });\n return deferred;\n}\n//# sourceMappingURL=index.js.map","function createImperativePromise(promiseArg) {\r\n var resolve = null;\r\n var reject = null;\r\n var wrappedPromise = new Promise(function (_resolve, _reject) {\r\n resolve = _resolve;\r\n reject = _reject;\r\n });\r\n promiseArg && promiseArg.then(function (val) {\r\n resolve && resolve(val);\r\n }, function (error) {\r\n reject && reject(error);\r\n });\r\n return {\r\n promise: wrappedPromise,\r\n resolve: function (value) {\r\n resolve && resolve(value);\r\n },\r\n reject: function (reason) {\r\n reject && reject(reason);\r\n },\r\n cancel: function () {\r\n resolve = null;\r\n reject = null;\r\n }\r\n };\r\n}\n\nexport { createImperativePromise };\n//# sourceMappingURL=index.es.js.map\n","import DebouncePromise from 'debounce-promise';\nimport { onlyResolvesLast } from 'awesome-only-resolves-last-promise';\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\n\nvar DefaultOptions = {\r\n // One distinct debounced function is created per key and added to an internal cache\r\n // By default, the key is null, which means that all the calls\r\n // will share the same debounced function\r\n key: function () {\r\n var _args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n _args[_i] = arguments[_i];\r\n }\r\n return null;\r\n },\r\n // By default, a debounced function will only resolve\r\n // the last promise it returned\r\n // Former calls will stay unresolved, so that you don't have\r\n // to handle concurrency issues in your code\r\n // Setting this to false means all returned promises will resolve to the last result\r\n onlyResolvesLast: true,\r\n};\r\n// We create a debouncing function cache, because when wrapping the original function,\r\n// we may actually want to route the function call to different debounced functions depending function paameters\r\nvar DebounceCache = /** @class */ (function () {\r\n function DebounceCache(config) {\r\n this.config = config;\r\n this.debounceSingleton = null;\r\n this.debounceCache = {}; // when key feature is used\r\n }\r\n DebounceCache.prototype._createDebouncedFunction = function () {\r\n var debouncedFunc = DebouncePromise(this.config.func, this.config.wait, this.config.options); // TODO TS\r\n if (this.config.options.onlyResolvesLast) {\r\n debouncedFunc = onlyResolvesLast(debouncedFunc);\r\n }\r\n return {\r\n func: debouncedFunc,\r\n };\r\n };\r\n DebounceCache.prototype.getDebouncedFunction = function (args) {\r\n var _a;\r\n var key = (_a = this.config.options).key.apply(_a, args);\r\n if (key === null || typeof key === 'undefined') {\r\n if (!this.debounceSingleton) {\r\n this.debounceSingleton = this._createDebouncedFunction();\r\n }\r\n return this.debounceSingleton;\r\n }\r\n else {\r\n if (!this.debounceCache[key]) {\r\n this.debounceCache[key] = this._createDebouncedFunction();\r\n }\r\n return this.debounceCache[key];\r\n }\r\n };\r\n return DebounceCache;\r\n}());\r\nfunction AwesomeDebouncePromise(func, wait, options) {\r\n var finalOptions = __assign({}, DefaultOptions, options);\r\n var debounceCache = new DebounceCache({\r\n func: func,\r\n wait: wait,\r\n options: finalOptions,\r\n });\r\n var AwesomeDebouncePromiseWrapper = (function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n var debouncedFn = debounceCache.getDebouncedFunction(args).func;\r\n return debouncedFn.apply(void 0, args);\r\n }); // TODO fix TS\r\n /*\r\n AwesomeDebouncePromiseWrapper.cancel = (key?: string) => {\r\n \n };\r\n */\r\n return AwesomeDebouncePromiseWrapper;\r\n}\n\nexport default AwesomeDebouncePromise;\n//# sourceMappingURL=index.es.js.map\n","import { createImperativePromise } from 'awesome-imperative-promise';\n\n// see https://stackoverflow.com/a/54825370/82609\r\nfunction onlyResolvesLast(asyncFunction) {\r\n var cancelPrevious = null;\r\n var wrappedFunction = function () {\r\n var args = [];\r\n for (var _i = 0; _i < arguments.length; _i++) {\r\n args[_i] = arguments[_i];\r\n }\r\n cancelPrevious && cancelPrevious();\r\n var initialPromise = asyncFunction.apply(void 0, args);\r\n var _a = createImperativePromise(initialPromise), promise = _a.promise, cancel = _a.cancel;\r\n cancelPrevious = cancel;\r\n return promise;\r\n };\r\n return wrappedFunction; // TODO fix TS\r\n}\n\nexport { onlyResolvesLast };\n//# sourceMappingURL=index.es.js.map\n","import { INSTRUMENTATION_TYPES, ActionTypes as types } from '../constants'\nimport { getAnalyticsMeta } from './Actions'\nimport * as authUtils from '../../lib/authUtils'\nimport { trackContactConfidenceImpression } from 'transfer/utils/contact-confidence-analytics'\nimport { trackUnilateralRecipientChoiceImpression } from 'transfer/utils/unilateral-recipient-choice-analytics'\nimport { trackConsentImpression } from '../utils/directory-search-analytics'\nimport { trackRiskHoldImpression } from 'transfer/utils/risk-hold-utils'\n// NOTE: we opt for passing an object here with a show prop because it looks a little more clear\n// at invocation which way we're trying to toggle the overpanel (as opposed to just `true` or `false`).\n\nexport function toggleAddShippingAddressOverpanel({ show }) {\n // Handle `onetouch` users\n if (authUtils.isOneTouchUser()) {\n return authUtils.requestLoginAction()\n }\n\n // create new unique key so component re-renders and all the previously-inputted\n // user data (held in the state of the individual inputs) is reset\n const newOverpanelKey = `addShippingAddressOverpanelKey_${Date.now()}`\n return {\n type: types.OVERPANELS.TOGGLE_ADD_SHIPPING_ADDRESS_OVERPANEL,\n data: { show, newOverpanelKey },\n }\n}\n\nexport function toggleRiskHoldsOverpanel({ show }) {\n return (dispatch, getState) => {\n const { transaction } = getState()\n\n if (show) {\n trackRiskHoldImpression(transaction)\n }\n\n dispatch({\n type: types.OVERPANELS.TOGGLE_RISK_HOLDS_OVERPANEL,\n data: { show },\n })\n }\n}\n\nexport function toggleConfirmIdentityOverpanel({ show }) {\n return {\n type: types.OVERPANELS.TOGGLE_CONFIRM_IDENTITY_OVERPANEL,\n data: { show },\n }\n}\n\nexport function onRiskHoldsConfirm() {\n return {\n type: types.OVERPANELS.CONFIRMED_RISK_HOLDS,\n }\n}\n\nexport function toggleAddBillingAddressOverpanel({ show }) {\n // create new unique key so component re-renders and all the previously-inputted\n // user data (held in the state of the individual inputs) is reset\n const newOverpanelKey = `addBillingAddressOverpanelKey_${Date.now()}`\n return {\n type: types.OVERPANELS.TOGGLE_ADD_BILLING_ADDRESS_OVERPANEL,\n data: { show, newOverpanelKey },\n }\n}\n\nexport function toggleAddCardOverpanel({\n show,\n showTransactionContextContent = false,\n}) {\n // Handle `onetouch` users\n if (authUtils.isOneTouchUser()) {\n return authUtils.requestLoginAction()\n }\n\n // create new unique key so component re-renders and all the previously-inputted\n // user data (held in the state of the individual inputs) is reset\n const newOverpanelKey = `addCardOverpanelKey_${Date.now()}`\n return {\n type: types.OVERPANELS.TOGGLE_ADD_CARD_OVERPANEL,\n data: { show, newOverpanelKey, showTransactionContextContent },\n }\n}\n\nexport function toggleCurrencyConversionOverpanel({ show }) {\n // create new unique key so component re-renders and all the previously-inputted\n // user data (held in the state of the individual inputs) is reset\n const newOverpanelKey = `currencyConversionKey_${Date.now()}`\n return {\n type: types.OVERPANELS.TOGGLE_CURRENCY_CONVERSION_OVERPANEL,\n data: { show, newOverpanelKey },\n }\n}\n\nexport function toggle3DS2ChallengeOverpanel({ show }) {\n return {\n type: types.OVERPANELS.TOGGLE_THREEDS2_CHALLENGE_OVERPANEL,\n data: { show },\n }\n}\n\nexport function toggle3DS2SpinnerOverpanel({ show }) {\n return {\n type: types.OVERPANELS.TOGGLE_THREEDS2_SPINNER_OVERPANEL,\n data: { show },\n }\n}\n\n// The 'closeManually' parameter helps track whenever the 3DS overpanel\n// is closed by the user when he/she clicks the 'X' button.\n// The 3DS overpanel automatically closes on success/failure,\n// in which case, 'closeManually' will be 'false'\n\nexport function toggle3DSecureOverpanel({\n show,\n closeManually = false,\n opened = false,\n success = false,\n failure = false,\n}) {\n const pageGroup = 'main:p2p:buy::threeds'\n const pageName = 'main:p2p:buy::threeds:node::'\n const nextPageGroup = 'main:p2p:buy::threeds'\n const nextPageName = 'main:p2p:buy::threeds:node::'\n let meta\n\n // Analytics for four cases\n // 1. Manually closed by user\n // 2. 3DS Opened (initiated)\n // 3. 3DS Success (completed)\n // 4. 3DS Failure (completed)\n\n if (closeManually) {\n // 3DS manually closed by user\n meta = getAnalyticsMeta(INSTRUMENTATION_TYPES.PAGE_CHANGE, {\n linkName: 'closethreeds',\n pageGroup: pageGroup,\n pageName: pageName,\n })\n } else if (opened) {\n // 3DS page opened\n meta = getAnalyticsMeta(INSTRUMENTATION_TYPES.PAGE_CHANGE, {\n linkName: 'openthreeds',\n pageGroup: pageGroup,\n pageName: pageName,\n nextPageGroup: nextPageGroup,\n nextPageName: nextPageName,\n })\n } else if (success) {\n // 3DS closed automatically after success\n meta = getAnalyticsMeta(INSTRUMENTATION_TYPES.PAGE_CHANGE, {\n linkName: 'successthreeds',\n pageGroup: pageGroup,\n pageName: pageName,\n })\n } else if (failure) {\n // 3DS closed automatically after failure\n meta = getAnalyticsMeta(INSTRUMENTATION_TYPES.PAGE_CHANGE, {\n linkName: 'failurethreeds',\n pageGroup: pageGroup,\n pageName: pageName,\n })\n }\n\n // create new unique key so component re-renders and all the previously-inputted\n // user data (held in the state of the individual inputs) is reset\n const newOverpanelKey = `3DSecureKey_${Date.now()}`\n return {\n type: types.OVERPANELS.TOGGLE_3D_SECURE_OVERPANEL,\n data: { show, newOverpanelKey },\n meta: meta,\n }\n}\n\nexport function toggleSendingLimitOverpanel({ show }) {\n const pageGroup = 'main:p2p:guest:limitreached:createpwd'\n const pageName = 'main:p2p:guest:limitreached:createpwd:node::'\n const data = { fltp: 'upg_dueto_limit' }\n\n // create new unique key so component re-renders and all the previously-inputted\n // user data (held in the state of the individual inputs) is reset\n const newOverpanelKey = `sendingLimitKey_${Date.now()}`\n return {\n type: types.OVERPANELS.TOGGLE_SENDING_LIMIT_OVERPANEL,\n data: { show, newOverpanelKey },\n ...(show && {\n meta: getAnalyticsMeta(INSTRUMENTATION_TYPES.IMPRESSION, {\n pageGroup,\n pageName,\n data,\n }),\n }),\n }\n}\n\nexport function toggleFundingOptionsOverpanel({ show }) {\n // create new unique key so component re-renders and all the previously-inputted\n // user data (held in the state of the individual inputs) is reset\n const newOverpanelKey = `fundingOptionsOverpanel_${Date.now()}`\n return {\n type: types.OVERPANELS.TOGGLE_FUNDING_OPTIONS_OVERPANEL,\n data: { show, newOverpanelKey },\n }\n}\n\nexport function toggleContactDetailsOverpanel({ show }) {\n return {\n type: types.OVERPANELS.TOGGLE_CONTACT_DETAILS_OVERPANEL,\n data: { show },\n }\n}\n\nexport function toggleErrorOverpanel({ show }) {\n return {\n type: types.OVERPANELS.TOGGLE_ERROR_OVERPANEL,\n data: { show },\n }\n}\n\nexport function addOpenOverpanel() {\n return {\n type: types.OVERPANELS.ADD_OPEN_OVERPANEL,\n }\n}\n\nexport function subtractClosedOverpanel() {\n return {\n type: types.OVERPANELS.SUBTRACT_CLOSED_OVERPANEL,\n }\n}\n\nexport function toggleContactConfidenceOverpanel({ show, analytics = {} }) {\n if (show) {\n trackContactConfidenceImpression(analytics)\n\n // remove flfr so that it does not confuse preview page\n window.flfr = null\n }\n\n return {\n type: types.OVERPANELS.TOGGLE_CONTACT_CONFIDENCE_OVERPANEL,\n data: { show },\n }\n}\nexport function toggleCashAdvanceFeesOverpanel({\n show,\n type = 'ACTIONS',\n selectedFundingOption = {},\n analytics = {},\n}) {\n if (show) {\n window.flr = null\n }\n\n const actionType =\n type === 'ACTIONS'\n ? types.OVERPANELS.TOGGLE_CASH_ADVANCE_FEES_DISCLOSURE_OVERPANEL\n : types.OVERPANELS.TOGGLE_CASH_ADVANCE_FEES_ABOUT_OVERPANEL\n\n return {\n type: actionType,\n data: { show, type, selectedFundingOption },\n }\n}\n\nexport function toggleUnilateralRecipientChoiceOverpanel({\n show = false,\n} = {}) {\n if (show) {\n trackUnilateralRecipientChoiceImpression()\n }\n\n return {\n type: types.OVERPANELS.TOGGLE_UNILATERAL_RECIPIENT_CHOICE_OVERPANEL,\n data: { show },\n }\n}\n\nexport function toggleSearchConsentOverpanel({\n show = false,\n isPreFlow = false,\n analytics = {},\n}) {\n if (show) {\n trackConsentImpression(analytics.actionType, isPreFlow)\n }\n\n return {\n type: types.OVERPANELS.TOGGLE_SEARCH_CONSENT_OVERPANEL,\n data: { show, isPreFlow },\n }\n}\n\nexport function togglePhotoUploadOverpanel({ show = false, ppme_slug = '' }) {\n return {\n type: types.OVERPANELS.TOGGLE_PHOTO_UPLOAD_OVERPANEL,\n data: { show, ppme_slug },\n }\n}\n\nexport function updateUploadedPhotoURL({ uploadedPhotoURL = '' }) {\n return {\n type: types.OVERPANELS.UPDATE_UPLOADED_PHOTO_URL,\n data: { uploadedPhotoURL },\n }\n}\n\nexport function updateHasShownSearchConsentOverpanel({ hasShown = false }) {\n return {\n type: types.OVERPANELS.UPDATE_HAS_SHOWN_SEARCH_CONSENT_OVERPANEL,\n data: { hasShown },\n }\n}\n\nexport function toggleOpenBankingOverpanel({ show }) {\n return {\n type: types.OVERPANELS.TOGGLE_OPEN_BANKING_OVERPANEL,\n data: { show },\n }\n}\n\nexport function toggleBlockContactOverpanel({ show = false }) {\n return {\n type: types.OVERPANELS.TOGGLE_BLOCK_CONTACT_OVERPANEL,\n data: { show },\n }\n}\n\nexport function toggleBlockedContactsOverpanel({ show = false }) {\n return {\n type: types.OVERPANELS.TOGGLE_BLOCKED_CONTACTS_OVERPANEL,\n data: { show },\n }\n}\n\nexport function toggleContactBlockedOverpanel({ show = false }) {\n return {\n type: types.OVERPANELS.TOGGLE_CONTACT_BLOCKED_OVERPANEL,\n data: { show },\n }\n}\n\nexport function toggleContactUnblockedOverpanel({ show = false }) {\n return {\n type: types.OVERPANELS.TOGGLE_CONTACT_UNBLOCKED_OVERPANEL,\n data: { show },\n }\n}\n\nexport function toggleChatBlockContactOverpanel({ show = false }) {\n return {\n type: types.OVERPANELS.TOGGLE_CHAT_BLOCK_CONTACT_OVERPANEL,\n data: { show },\n }\n}\n\nexport function toggleUnilateralEmailConfirmationPopup({ show = false }) {\n return {\n data: { show },\n type: types.OVERPANELS.TOGGLE_UNILATERAL_EMAIL_CONFIRMATION_OVERPANEL,\n }\n}\n\nexport function setPurchaseToPersonalTransactionPanelVisibility(\n purchaseToPersonalTransactionPanelVisibility\n) {\n return {\n type: types.OVERPANELS.PURCHASE_TO_PERSONAL_TRANSACTION_OVERPANEL,\n data: { purchaseToPersonalTransactionPanelVisibility },\n }\n}\n","/*** IMPORTS FROM imports-loader ***/\nvar define = false;\n\n/**\n * Globalize v1.7.0\n *\n * https://github.com/globalizejs/globalize\n *\n * Copyright OpenJS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2021-08-02T11:53Z\n */\n/*!\n * Globalize v1.7.0 2021-08-02T11:53Z Released under the MIT license\n * http://git.io/TrdQbw\n */\n(function( root, factory ) {\n\n\t// UMD returnExports\n\tif ( typeof define === \"function\" && define.amd ) {\n\n\t\t// AMD\n\t\tdefine([\n\t\t\t\"cldr\",\n\t\t\t\"../globalize\",\n\t\t\t\"cldr/event\",\n\t\t\t\"cldr/supplemental\"\n\t\t], factory );\n\t} else if ( typeof exports === \"object\" ) {\n\n\t\t// Node, CommonJS\n\t\tmodule.exports = factory( require( \"cldrjs\" ), require( \"../globalize\" ) );\n\t} else {\n\n\t\t// Global\n\t\tfactory( root.Cldr, root.Globalize );\n\t}\n}(this, function( Cldr, Globalize ) {\n\nvar createError = Globalize._createError,\n\tpartsJoin = Globalize._partsJoin,\n\tpartsPush = Globalize._partsPush,\n\tregexpEscape = Globalize._regexpEscape,\n\truntimeBind = Globalize._runtimeBind,\n\tstringPad = Globalize._stringPad,\n\tvalidateCldr = Globalize._validateCldr,\n\tvalidateDefaultLocale = Globalize._validateDefaultLocale,\n\tvalidateParameterPresence = Globalize._validateParameterPresence,\n\tvalidateParameterRange = Globalize._validateParameterRange,\n\tvalidateParameterType = Globalize._validateParameterType,\n\tvalidateParameterTypePlainObject = Globalize._validateParameterTypePlainObject;\n\n\nvar createErrorUnsupportedFeature = function( feature ) {\n\treturn createError( \"E_UNSUPPORTED\", \"Unsupported {feature}.\", {\n\t\tfeature: feature\n\t});\n};\n\n\n\n\nvar validateParameterTypeNumber = function( value, name ) {\n\tvalidateParameterType(\n\t\tvalue,\n\t\tname,\n\t\tvalue === undefined || typeof value === \"number\",\n\t\t\"Number\"\n\t);\n};\n\n\n\n\nvar validateParameterTypeString = function( value, name ) {\n\tvalidateParameterType(\n\t\tvalue,\n\t\tname,\n\t\tvalue === undefined || typeof value === \"string\",\n\t\t\"a string\"\n\t);\n};\n\n\n\n\nvar numberFormatterFn = function( numberToPartsFormatter ) {\n\treturn function numberFormatter( value ) {\n\t\treturn partsJoin( numberToPartsFormatter( value ));\n\t};\n};\n\n\n\n\n/**\n * NumberingSystem( cldr )\n *\n * - http://www.unicode.org/reports/tr35/tr35-numbers.html#otherNumberingSystems\n * - http://cldr.unicode.org/index/bcp47-extension\n * - http://www.unicode.org/reports/tr35/#u_Extension\n */\nvar numberNumberingSystem = function( cldr ) {\n\tvar nu = cldr.attributes[ \"u-nu\" ];\n\n\tif ( nu ) {\n\t\tif ( nu === \"traditio\" ) {\n\t\t\tnu = \"traditional\";\n\t\t}\n\t\tif ( [ \"native\", \"traditional\", \"finance\" ].indexOf( nu ) !== -1 ) {\n\n\t\t\t// Unicode locale extension `u-nu` is set using either (native, traditional or\n\t\t\t// finance). So, lookup the respective locale's numberingSystem and return it.\n\t\t\treturn cldr.main([ \"numbers/otherNumberingSystems\", nu ]);\n\t\t}\n\n\t\t// Unicode locale extension `u-nu` is set with an explicit numberingSystem. Return it.\n\t\treturn nu;\n\t}\n\n\t// Return the default numberingSystem.\n\treturn cldr.main( \"numbers/defaultNumberingSystem\" );\n};\n\n\n\n\n/**\n * Compact( name, cldr )\n *\n * @compactType [String] Compact mode, `short` or `long`.\n *\n * @cldr [Cldr instance].\n *\n * Return the localized compact map for the given compact mode.\n */\nvar numberCompact = function( compactType, cldr ) {\n\tvar maxExponent = 0;\n\n\tvar object = cldr.main([\n\t\t\"numbers/decimalFormats-numberSystem-\" + numberNumberingSystem( cldr ),\n\t\tcompactType,\n\t\t\"decimalFormat\"\n\t]);\n\n\tobject = Object.keys( object ).reduce(function( newObject, compactKey ) {\n\t\tvar numberExponent = compactKey.split( \"0\" ).length - 1;\n\t\tvar pluralForm = compactKey.split( \"-\" )[ 2 ];\n\t\tnewObject[ numberExponent ] = newObject[ numberExponent ] || {};\n\t\tnewObject[ numberExponent ][ pluralForm ] = object[ compactKey ];\n\t\tmaxExponent = Math.max( numberExponent, maxExponent );\n\t\treturn newObject;\n\t}, {});\n\n\tobject.maxExponent = maxExponent;\n\n\treturn object;\n};\n\n\n\n\n/**\n * nuMap( cldr )\n *\n * @cldr [Cldr instance].\n *\n * Return digits map if numbering system is different than `latn`.\n */\nvar numberNumberingSystemDigitsMap = function( cldr ) {\n\tvar aux,\n\t\tnu = numberNumberingSystem( cldr );\n\n\tif ( nu === \"latn\" ) {\n\t\treturn;\n\t}\n\n\taux = cldr.supplemental([ \"numberingSystems\", nu ]);\n\n\tif ( aux._type !== \"numeric\" ) {\n\t\tthrow createErrorUnsupportedFeature( \"`\" + aux._type + \"` numbering system\" );\n\t}\n\n\treturn aux._digits;\n};\n\n\n\n\n/**\n * EBNF representation:\n *\n * number_pattern_re = prefix?\n * padding?\n * (integer_fraction_pattern | significant_pattern)\n * scientific_notation?\n * suffix?\n *\n * prefix = non_number_stuff\n *\n * padding = \"*\" regexp(.)\n *\n * integer_fraction_pattern = integer_pattern\n * fraction_pattern?\n *\n * integer_pattern = regexp([#,]*[0,]*0+)\n *\n * fraction_pattern = \".\" regexp(0*[0-9]*#*)\n *\n * significant_pattern = regexp([#,]*@+#*)\n *\n * scientific_notation = regexp(E\\+?0+)\n *\n * suffix = non_number_stuff\n *\n * non_number_stuff = regexp(('[^']+'|''|[^*#@0,.E])*)\n *\n *\n * Regexp groups:\n *\n * 0: number_pattern_re\n * 1: prefix\n * 2: -\n * 3: -\n * 4: padding\n * 5: (integer_fraction_pattern | significant_pattern)\n * 6: integer_fraction_pattern\n * 7: integer_pattern\n * 8: fraction_pattern\n * 9: significant_pattern\n * 10: scientific_notation\n * 11: suffix\n * 12: -\n */\nvar numberPatternRe = ( /^(('([^']|'')*'|[^*#@0,.E])*)(\\*.)?((([#,]*[0,]*0+)(\\.0*[0-9]*#*)?)|([#,]*@+#*))(E\\+?0+)?(('[^']+'|''|[^*#@0,.E])*)$/ );\n\n\n\n\n/**\n * format( number, pattern )\n *\n * @number [Number].\n *\n * @pattern [String] raw pattern for numbers.\n *\n * Return the formatted number.\n * ref: http://www.unicode.org/reports/tr35/tr35-numbers.html\n */\nvar numberPatternProperties = function( pattern ) {\n\tvar aux1, aux2, fractionPattern, integerFractionOrSignificantPattern, integerPattern,\n\t\tmaximumFractionDigits, maximumSignificantDigits, minimumFractionDigits,\n\t\tminimumIntegerDigits, minimumSignificantDigits, padding, prefix, primaryGroupingSize,\n\t\troundIncrement, scientificNotation, secondaryGroupingSize, significantPattern, suffix;\n\n\tpattern = pattern.match( numberPatternRe );\n\tif ( !pattern ) {\n\t\tthrow new Error( \"Invalid pattern: \" + pattern );\n\t}\n\n\tprefix = pattern[ 1 ];\n\tpadding = pattern[ 4 ];\n\tintegerFractionOrSignificantPattern = pattern[ 5 ];\n\tsignificantPattern = pattern[ 9 ];\n\tscientificNotation = pattern[ 10 ];\n\tsuffix = pattern[ 11 ];\n\n\t// Significant digit format\n\tif ( significantPattern ) {\n\t\tsignificantPattern.replace( /(@+)(#*)/, function( _match, minimumSignificantDigitsMatch, maximumSignificantDigitsMatch ) {\n\t\t\tminimumSignificantDigits = minimumSignificantDigitsMatch.length;\n\t\t\tmaximumSignificantDigits = minimumSignificantDigits +\n\t\t\t\tmaximumSignificantDigitsMatch.length;\n\t\t});\n\n\t// Integer and fractional format\n\t} else {\n\t\tfractionPattern = pattern[ 8 ];\n\t\tintegerPattern = pattern[ 7 ];\n\n\t\tif ( fractionPattern ) {\n\n\t\t\t// Minimum fraction digits, and rounding.\n\t\t\tfractionPattern.replace( /[0-9]+/, function( match ) {\n\t\t\t\tminimumFractionDigits = match;\n\t\t\t});\n\t\t\tif ( minimumFractionDigits ) {\n\t\t\t\troundIncrement = +( \"0.\" + minimumFractionDigits );\n\t\t\t\tminimumFractionDigits = minimumFractionDigits.length;\n\t\t\t} else {\n\t\t\t\tminimumFractionDigits = 0;\n\t\t\t}\n\n\t\t\t// Maximum fraction digits\n\t\t\t// 1: ignore decimal character\n\t\t\tmaximumFractionDigits = fractionPattern.length - 1; /* 1 */\n\t\t} else {\n\t\t\tminimumFractionDigits = 0;\n\t\t\tmaximumFractionDigits = 0;\n\t\t}\n\n\t\t// Minimum integer digits\n\t\tintegerPattern.replace( /0+$/, function( match ) {\n\t\t\tminimumIntegerDigits = match.length;\n\t\t});\n\t}\n\n\t// Scientific notation\n\tif ( scientificNotation ) {\n\t\tthrow createErrorUnsupportedFeature({\n\t\t\tfeature: \"scientific notation (not implemented)\"\n\t\t});\n\t}\n\n\t// Padding\n\tif ( padding ) {\n\t\tthrow createErrorUnsupportedFeature({\n\t\t\tfeature: \"padding (not implemented)\"\n\t\t});\n\t}\n\n\t// Grouping\n\tif ( ( aux1 = integerFractionOrSignificantPattern.lastIndexOf( \",\" ) ) !== -1 ) {\n\n\t\t// Primary grouping size is the interval between the last group separator and the end of\n\t\t// the integer (or the end of the significant pattern).\n\t\taux2 = integerFractionOrSignificantPattern.split( \".\" )[ 0 ];\n\t\tprimaryGroupingSize = aux2.length - aux1 - 1;\n\n\t\t// Secondary grouping size is the interval between the last two group separators.\n\t\tif ( ( aux2 = integerFractionOrSignificantPattern.lastIndexOf( \",\", aux1 - 1 ) ) !== -1 ) {\n\t\t\tsecondaryGroupingSize = aux1 - 1 - aux2;\n\t\t}\n\t}\n\n\t// Return:\n\t// 0: @prefix String\n\t// 1: @padding Array [ , ] TODO\n\t// 2: @minimumIntegerDigits non-negative integer Number value indicating the minimum integer\n\t// digits to be used. Numbers will be padded with leading zeroes if necessary.\n\t// 3: @minimumFractionDigits and\n\t// 4: @maximumFractionDigits are non-negative integer Number values indicating the minimum and\n\t// maximum fraction digits to be used. Numbers will be rounded or padded with trailing\n\t// zeroes if necessary.\n\t// 5: @minimumSignificantDigits and\n\t// 6: @maximumSignificantDigits are positive integer Number values indicating the minimum and\n\t// maximum fraction digits to be shown. Either none or both of these properties are\n\t// present; if they are, they override minimum and maximum integer and fraction digits\n\t// – the formatter uses however many integer and fraction digits are required to display\n\t// the specified number of significant digits.\n\t// 7: @roundIncrement Decimal round increment or null\n\t// 8: @primaryGroupingSize\n\t// 9: @secondaryGroupingSize\n\t// 10: @suffix String\n\treturn [\n\t\tprefix,\n\t\tpadding,\n\t\tminimumIntegerDigits,\n\t\tminimumFractionDigits,\n\t\tmaximumFractionDigits,\n\t\tminimumSignificantDigits,\n\t\tmaximumSignificantDigits,\n\t\troundIncrement,\n\t\tprimaryGroupingSize,\n\t\tsecondaryGroupingSize,\n\t\tsuffix\n\t];\n};\n\n\n\n\n/**\n * Symbol( name, cldr )\n *\n * @name [String] Symbol name.\n *\n * @cldr [Cldr instance].\n *\n * Return the localized symbol given its name.\n */\nvar numberSymbol = function( name, cldr ) {\n\treturn cldr.main([\n\t\t\"numbers/symbols-numberSystem-\" + numberNumberingSystem( cldr ),\n\t\tname\n\t]);\n};\n\n\n\n\nvar numberSymbolName = {\n\t\".\": \"decimal\",\n\t\",\": \"group\",\n\t\"%\": \"percentSign\",\n\t\"+\": \"plusSign\",\n\t\"-\": \"minusSign\",\n\t\"E\": \"exponential\",\n\t\"\\u2030\": \"perMille\"\n};\n\n\n\n\n/**\n * symbolMap( cldr )\n *\n * @cldr [Cldr instance].\n *\n * Return the (localized symbol, pattern symbol) key value pair, eg. {\n * \".\": \"٫\",\n * \",\": \"٬\",\n * \"%\": \"٪\",\n * ...\n * };\n */\nvar numberSymbolMap = function( cldr ) {\n\tvar symbol,\n\t\tsymbolMap = {};\n\n\tfor ( symbol in numberSymbolName ) {\n\t\tsymbolMap[ symbol ] = numberSymbol( numberSymbolName[ symbol ], cldr );\n\t}\n\n\treturn symbolMap;\n};\n\n\n\n\nvar numberTruncate = function( value ) {\n\tif ( isNaN( value ) ) {\n\t\treturn NaN;\n\t}\n\treturn Math[ value < 0 ? \"ceil\" : \"floor\" ]( value );\n};\n\n\n\n\n/**\n * round( method )\n *\n * @method [String] with either \"round\", \"ceil\", \"floor\", or \"truncate\".\n *\n * Return function( value, incrementOrExp ):\n *\n * @value [Number] eg. 123.45.\n *\n * @incrementOrExp [Number] optional, eg. 0.1; or\n * [Object] Either { increment: } or { exponent: }\n *\n * Return the rounded number, eg:\n * - round( \"round\" )( 123.45 ): 123;\n * - round( \"ceil\" )( 123.45 ): 124;\n * - round( \"floor\" )( 123.45 ): 123;\n * - round( \"truncate\" )( 123.45 ): 123;\n * - round( \"round\" )( 123.45, 0.1 ): 123.5;\n * - round( \"round\" )( 123.45, 10 ): 120;\n *\n * Based on https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round\n * Ref: #376\n */\nvar numberRound = function( method ) {\n\tmethod = method || \"round\";\n\tmethod = method === \"truncate\" ? numberTruncate : Math[ method ];\n\n\treturn function( value, incrementOrExp ) {\n\t\tvar exp, increment;\n\n\t\tvalue = +value;\n\n\t\t// If the value is not a number, return NaN.\n\t\tif ( isNaN( value ) ) {\n\t\t\treturn NaN;\n\t\t}\n\n\t\t// Exponent given.\n\t\tif ( typeof incrementOrExp === \"object\" && incrementOrExp.exponent ) {\n\t\t\texp = +incrementOrExp.exponent;\n\t\t\tincrement = 1;\n\n\t\t\tif ( exp === 0 ) {\n\t\t\t\treturn method( value );\n\t\t\t}\n\n\t\t\t// If the exp is not an integer, return NaN.\n\t\t\tif ( !( typeof exp === \"number\" && exp % 1 === 0 ) ) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\n\t\t// Increment given.\n\t\t} else {\n\t\t\tincrement = +incrementOrExp || 1;\n\n\t\t\tif ( increment === 1 ) {\n\t\t\t\treturn method( value );\n\t\t\t}\n\n\t\t\t// If the increment is not a number, return NaN.\n\t\t\tif ( isNaN( increment ) ) {\n\t\t\t\treturn NaN;\n\t\t\t}\n\n\t\t\tincrement = increment.toExponential().split( \"e\" );\n\t\t\texp = +increment[ 1 ];\n\t\t\tincrement = +increment[ 0 ];\n\t\t}\n\n\t\t// Shift & Round\n\t\tvalue = value.toString().split( \"e\" );\n\t\tvalue[ 0 ] = +value[ 0 ] / increment;\n\t\tvalue[ 1 ] = value[ 1 ] ? ( +value[ 1 ] - exp ) : -exp;\n\t\tvalue = method( +( value[ 0 ] + \"e\" + value[ 1 ] ) );\n\n\t\t// Shift back\n\t\tvalue = value.toString().split( \"e\" );\n\t\tvalue[ 0 ] = +value[ 0 ] * increment;\n\t\tvalue[ 1 ] = value[ 1 ] ? ( +value[ 1 ] + exp ) : exp;\n\t\treturn +( value[ 0 ] + \"e\" + value[ 1 ] );\n\t};\n};\n\n\n\n\n/**\n * formatProperties( pattern, cldr [, options] )\n *\n * @pattern [String] raw pattern for numbers.\n *\n * @cldr [Cldr instance].\n *\n * @options [Object]:\n * - minimumIntegerDigits [Number]\n * - minimumFractionDigits, maximumFractionDigits [Number]\n * - minimumSignificantDigits, maximumSignificantDigits [Number]\n * - round [String] \"ceil\", \"floor\", \"round\" (default), or \"truncate\".\n * - useGrouping [Boolean] default true.\n *\n * Return the processed properties that will be used in number/format.\n * ref: http://www.unicode.org/reports/tr35/tr35-numbers.html\n */\nvar numberFormatProperties = function( pattern, cldr, options ) {\n\tvar negativePattern, negativePrefix, negativeProperties, negativeSuffix, positivePattern,\n\t\troundFn, properties;\n\n\tfunction getOptions( attribute, propertyIndex ) {\n\t\tif ( attribute in options ) {\n\t\t\tproperties[ propertyIndex ] = options[ attribute ];\n\t\t}\n\t}\n\n\toptions = options || {};\n\tpattern = pattern.split( \";\" );\n\n\tpositivePattern = pattern[ 0 ];\n\n\tnegativePattern = pattern[ 1 ] || \"-\" + positivePattern;\n\tnegativeProperties = numberPatternProperties( negativePattern );\n\tnegativePrefix = negativeProperties[ 0 ];\n\tnegativeSuffix = negativeProperties[ 10 ];\n\n\t// Have runtime code to refer to numberRound() instead of including it explicitly.\n\troundFn = numberRound( options.round );\n\troundFn.generatorString = function() {\n\t\treturn \"numberRound(\" + ( options.round ? \"\\\"\" + options.round + \"\\\"\" : \"\" ) + \")\";\n\t};\n\n\tproperties = numberPatternProperties( positivePattern ).concat([\n\t\tpositivePattern,\n\t\tnegativePrefix + positivePattern + negativeSuffix,\n\t\tnegativePrefix,\n\t\tnegativeSuffix,\n\t\troundFn,\n\t\tnumberSymbol( \"infinity\", cldr ),\n\t\tnumberSymbol( \"nan\", cldr ),\n\t\tnumberSymbolMap( cldr ),\n\t\tnumberNumberingSystemDigitsMap( cldr )\n\t]);\n\n\tif ( options.compact ) {\n\n\t\t// The compact digits number pattern is always `0+`, so override the following properties.\n\t\t// Note: minimumIntegerDigits would actually range from `0` to `000` based on the scale of\n\t\t// the value to be formatted, though we're always using 1 as a simplification, because the\n\t\t// number won't be zero-padded since we chose the right format based on the scale, i.e.,\n\t\t// we'd never see something like `003M` anyway.\n\t\tproperties[ 2 ] = 1; // minimumIntegerDigits\n\t\tproperties[ 3 ] = 0; // minimumFractionDigits\n\t\tproperties[ 4 ] = 0; // maximumFractionDigits\n\t\tproperties[ 5 ] = // minimumSignificantDigits &\n\t\t\tproperties[ 6 ] = undefined; // maximumSignificantDigits\n\n\t\tproperties[ 20 ] = numberCompact( options.compact, cldr );\n\t}\n\n\tgetOptions( \"minimumIntegerDigits\", 2 );\n\tgetOptions( \"minimumFractionDigits\", 3 );\n\tgetOptions( \"maximumFractionDigits\", 4 );\n\tgetOptions( \"minimumSignificantDigits\", 5 );\n\tgetOptions( \"maximumSignificantDigits\", 6 );\n\n\t// Grouping separators\n\tif ( options.useGrouping === false ) {\n\t\tproperties[ 8 ] = null;\n\t}\n\n\t// Normalize number of digits if only one of either minimumFractionDigits or\n\t// maximumFractionDigits is passed in as an option\n\tif ( \"minimumFractionDigits\" in options && !( \"maximumFractionDigits\" in options ) ) {\n\n\t\t// maximumFractionDigits = Math.max( minimumFractionDigits, maximumFractionDigits );\n\t\tproperties[ 4 ] = Math.max( properties[ 3 ], properties[ 4 ] );\n\t} else if ( !( \"minimumFractionDigits\" in options ) &&\n\t\t\t\"maximumFractionDigits\" in options ) {\n\n\t\t// minimumFractionDigits = Math.min( minimumFractionDigits, maximumFractionDigits );\n\t\tproperties[ 3 ] = Math.min( properties[ 3 ], properties[ 4 ] );\n\t}\n\n\t// Return:\n\t// 0-10: see number/pattern-properties.\n\t// 11: @positivePattern [String] Positive pattern.\n\t// 12: @negativePattern [String] Negative pattern.\n\t// 13: @negativePrefix [String] Negative prefix.\n\t// 14: @negativeSuffix [String] Negative suffix.\n\t// 15: @round [Function] Round function.\n\t// 16: @infinitySymbol [String] Infinity symbol.\n\t// 17: @nanSymbol [String] NaN symbol.\n\t// 18: @symbolMap [Object] A bunch of other symbols.\n\t// 19: @nuDigitsMap [Array] Digits map if numbering system is different than `latn`.\n\t// 20: @compactMap [Object] Map of per-digit-count format patterns for specified compact mode.\n\treturn properties;\n};\n\n\n\n\n/**\n * Generated by:\n *\n * var regenerate = require( \"regenerate\" );\n * var formatSymbols = require( \"@unicode/unicode-13.0.0/General_Category/Format/symbols\" );\n * regenerate().add( formatSymbols ).toString();\n *\n * https://github.com/mathiasbynens/regenerate\n * https://github.com/node-unicode/unicode-13.0.0\n */\nvar regexpCfG = /[\\xAD\\u0600-\\u0605\\u061C\\u06DD\\u070F\\u08E2\\u180E\\u200B-\\u200F\\u202A-\\u202E\\u2060-\\u2064\\u2066-\\u206F\\uFEFF\\uFFF9-\\uFFFB]|\\uD804[\\uDCBD\\uDCCD]|\\uD80D[\\uDC30-\\uDC38]|\\uD82F[\\uDCA0-\\uDCA3]|\\uD834[\\uDD73-\\uDD7A]|\\uDB40[\\uDC01\\uDC20-\\uDC7F]/g;\n\n\n\n\n/**\n * Generated by:\n *\n * var regenerate = require( \"regenerate\" );\n * var dashSymbols = require( \"https://github.com/node-unicode/unicode-13.0.0/General_Category/Dash_Punctuation/symbols\" );\n * regenerate().add( dashSymbols ).toString();\n *\n * https://github.com/mathiasbynens/regenerate\n * https://github.com/node-unicode/unicode-13.0.0\n *\n * NOTE: In addition to [:dash:], the below includes MINUS SIGN U+2212.\n */\nvar regexpDashG = /[\\x2D\\u058A\\u05BE\\u1400\\u1806\\u2010-\\u2015\\u2E17\\u2E1A\\u2E3A\\u2E3B\\u2E40\\u301C\\u3030\\u30A0\\uFE31\\uFE32\\uFE58\\uFE63\\uFF0D\\u2212]|\\uD803\\uDEAD/g;\n\n\n\n\n/**\n * Generated by:\n *\n * var regenerate = require( \"regenerate\" );\n * var spaceSeparatorSymbols = require( \"@unicode/unicode-13.0.0/General_Category/Space_Separator/symbols\" );\n * regenerate().add( spaceSeparatorSymbols ).toString();\n *\n * https://github.com/mathiasbynens/regenerate\n * https://github.com/node-unicode/unicode-13.0.0\n */\nvar regexpZsG = /[ \\xA0\\u1680\\u2000-\\u200A\\u202F\\u205F\\u3000]/g;\n\n\n\n\n/**\n * Loose Matching:\n * - Ignore all format characters, which includes RLM, LRM or ALM used to control BIDI\n * formatting.\n * - Map all characters in [:Zs:] to U+0020 SPACE;\n * - Map all characters in [:Dash:] to U+002D HYPHEN-MINUS;\n */\nvar looseMatching = function( value ) {\n\treturn value\n\t\t.replace( regexpCfG, \"\" )\n\t\t.replace( regexpDashG, \"-\" )\n\t\t.replace( regexpZsG, \" \" );\n};\n\n\n\n\n/**\n * parse( value, properties )\n *\n * @value [String].\n *\n * @properties [Object] Parser properties is a reduced pre-processed cldr\n * data set returned by numberParserProperties().\n *\n * Return the parsed Number (including Infinity) or NaN when value is invalid.\n * ref: http://www.unicode.org/reports/tr35/tr35-numbers.html\n */\nvar numberParse = function( value, properties ) {\n\tvar grammar, invertedNuDigitsMap, invertedSymbolMap, negative, number, prefix, prefixNSuffix,\n\t\tsuffix, tokenizer, valid;\n\n\t// Grammar:\n\t// - Value <= NaN | PositiveNumber | NegativeNumber\n\t// - PositiveNumber <= PositivePrefix NumberOrInf PositiveSufix\n\t// - NegativeNumber <= NegativePrefix NumberOrInf\n\t// - NumberOrInf <= Number | Inf\n\tgrammar = [\n\t\t[ \"nan\" ],\n\t\t[ \"prefix\", \"infinity\", \"suffix\" ],\n\t\t[ \"prefix\", \"number\", \"suffix\" ],\n\t\t[ \"negativePrefix\", \"infinity\", \"negativeSuffix\" ],\n\t\t[ \"negativePrefix\", \"number\", \"negativeSuffix\" ]\n\t];\n\n\tinvertedSymbolMap = properties[ 0 ];\n\tinvertedNuDigitsMap = properties[ 1 ] || {};\n\ttokenizer = properties[ 2 ];\n\n\tvalue = looseMatching( value );\n\n\tfunction parse( type ) {\n\t\treturn function( lexeme ) {\n\n\t\t\t// Reverse localized symbols and numbering system.\n\t\t\tlexeme = lexeme.split( \"\" ).map(function( character ) {\n\t\t\t\treturn invertedSymbolMap[ character ] ||\n\t\t\t\t\tinvertedNuDigitsMap[ character ] ||\n\t\t\t\t\tcharacter;\n\t\t\t}).join( \"\" );\n\n\t\t\tswitch ( type ) {\n\t\t\t\tcase \"infinity\":\n\t\t\t\t\tnumber = Infinity;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"nan\":\n\t\t\t\t\tnumber = NaN;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"number\":\n\n\t\t\t\t\t// Remove grouping separators.\n\t\t\t\t\tlexeme = lexeme.replace( /,/g, \"\" );\n\n\t\t\t\t\tnumber = +lexeme;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"prefix\":\n\t\t\t\tcase \"negativePrefix\":\n\t\t\t\t\tprefix = lexeme;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"suffix\":\n\t\t\t\t\tsuffix = lexeme;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase \"negativeSuffix\":\n\t\t\t\t\tsuffix = lexeme;\n\t\t\t\t\tnegative = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t// This should never be reached.\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( \"Internal error\" );\n\t\t\t}\n\t\t\treturn \"\";\n\t\t};\n\t}\n\n\tfunction tokenizeNParse( _value, grammar ) {\n\t\treturn grammar.some(function( statement ) {\n\t\t\tvar value = _value;\n\n\t\t\t// The whole grammar statement should be used (i.e., .every() return true) and value be\n\t\t\t// entirely consumed (i.e., !value.length).\n\t\t\treturn statement.every(function( type ) {\n\t\t\t\tif ( value.match( tokenizer[ type ] ) === null ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\t// Consume and parse it.\n\t\t\t\tvalue = value.replace( tokenizer[ type ], parse( type ) );\n\t\t\t\treturn true;\n\t\t\t}) && !value.length;\n\t\t});\n\t}\n\n\tvalid = tokenizeNParse( value, grammar );\n\n\t// NaN\n\tif ( !valid || isNaN( number ) ) {\n\t\treturn NaN;\n\t}\n\n\tprefixNSuffix = \"\" + prefix + suffix;\n\n\t// Percent\n\tif ( prefixNSuffix.indexOf( \"%\" ) !== -1 ) {\n\t\tnumber /= 100;\n\n\t// Per mille\n\t} else if ( prefixNSuffix.indexOf( \"\\u2030\" ) !== -1 ) {\n\t\tnumber /= 1000;\n\t}\n\n\t// Negative number\n\tif ( negative ) {\n\t\tnumber *= -1;\n\t}\n\n\treturn number;\n};\n\n\n\n\nvar numberParserFn = function( properties ) {\n\treturn function numberParser( value ) {\n\t\tvalidateParameterPresence( value, \"value\" );\n\t\tvalidateParameterTypeString( value, \"value\" );\n\n\t\treturn numberParse( value, properties );\n\t};\n\n};\n\n\n\n\n/**\n * symbolMap( cldr )\n *\n * @cldr [Cldr instance].\n *\n * Return the (localized symbol, pattern symbol) key value pair, eg. {\n * \"٫\": \".\",\n * \"٬\": \",\",\n * \"٪\": \"%\",\n * ...\n * };\n */\nvar numberSymbolInvertedMap = function( cldr ) {\n\tvar symbol,\n\t\tsymbolMap = {};\n\n\tfor ( symbol in numberSymbolName ) {\n\t\tsymbolMap[ numberSymbol( numberSymbolName[ symbol ], cldr ) ] = symbol;\n\t}\n\n\treturn symbolMap;\n};\n\n\n\n\n/**\n * objectMap( object, fn)\n *\n * - object\n *\n * - fn( pair ) => pair\n */\nvar objectMap = function( object, fn ) {\n\treturn Object.keys( object ).map(function( key ) {\n\t\treturn fn([ key, object[ key ] ]);\n\t}).reduce(function( object, pair ) {\n\t\tobject[ pair[ 0 ] ] = pair[ 1 ];\n\t\treturn object;\n\t}, {});\n};\n\n\n\n\n/**\n * removeLiteralQuotes( string )\n *\n * Return:\n * - `'` if input string is `''`.\n * - `o'clock` if input string is `'o''clock'`.\n * - `foo` if input string is `foo`, i.e., return the same value in case it isn't a single-quoted\n * string.\n */\nvar removeLiteralQuotes = function( string ) {\n\tif ( string[ 0 ] + string[ string.length - 1 ] !== \"''\" ) {\n\t\treturn string;\n\t}\n\tif ( string === \"''\" ) {\n\t\treturn \"'\";\n\t}\n\treturn string.replace( /''/g, \"'\" ).slice( 1, -1 );\n};\n\n\n\n\n/**\n * parseProperties( pattern, cldr )\n *\n * @pattern [String] raw pattern for numbers.\n *\n * @cldr [Cldr instance].\n *\n * Return parser properties, used to feed parser function.\n *\n * TODO:\n * - Scientific_notation;\n * - Padding;\n */\nvar numberParseProperties = function( pattern, cldr, options ) {\n\tvar aux, decimalSymbolRe, digitsRe, groupingSeparatorRe, infinitySymbol, invertedNuDigitsMap,\n\t\tinvertedSymbolMap, maximumFractionDigits, maximumSignificantDigits,\n\t\tminimumSignificantDigits, nanSymbol, negativePrefix, negativeSuffix, nuDigitsMap,\n\t\tnumberTokenizer, prefix, primaryGroupingSize, secondaryGroupingSize, suffix, symbolMap,\n\t\tformatProperties = numberFormatProperties( pattern, cldr, options );\n\n\tprefix = looseMatching( formatProperties[ 0 ] );\n\tmaximumFractionDigits = formatProperties[ 4 ];\n\tminimumSignificantDigits = formatProperties[ 5 ];\n\tmaximumSignificantDigits = formatProperties[ 6 ];\n\tprimaryGroupingSize = formatProperties[ 8 ];\n\tsecondaryGroupingSize = formatProperties[ 9 ];\n\tsuffix = looseMatching( formatProperties[ 10 ] );\n\tnegativePrefix = looseMatching( formatProperties[ 13 ] );\n\tnegativeSuffix = looseMatching( formatProperties[ 14 ] );\n\tinfinitySymbol = looseMatching( formatProperties[ 16 ] );\n\tnanSymbol = looseMatching( formatProperties[ 17 ] );\n\tsymbolMap = objectMap( formatProperties[ 18 ], function( pair ) {\n\t\treturn [ pair[ 0 ], looseMatching( pair[ 1 ] ) ];\n\t});\n\tnuDigitsMap = formatProperties[ 19 ];\n\n\tinvertedSymbolMap = objectMap( numberSymbolInvertedMap( cldr ), function( pair ) {\n\t\treturn [ looseMatching( pair[ 0 ] ), pair[ 1 ] ];\n\t});\n\n\tdigitsRe = nuDigitsMap ? \"[\" + nuDigitsMap + \"]\" : \"\\\\d\";\n\tgroupingSeparatorRe = regexpEscape( symbolMap[ \",\" ] );\n\tdecimalSymbolRe = regexpEscape( symbolMap[ \".\" ] );\n\n\tif ( nuDigitsMap ) {\n\t\tinvertedNuDigitsMap = nuDigitsMap.split( \"\" ).reduce(function( object, localizedDigit, i ) {\n\t\t\tobject[ localizedDigit ] = String( i );\n\t\t\treturn object;\n\t\t}, {} );\n\t}\n\n\taux = [ prefix, suffix, negativePrefix, negativeSuffix ].map(function( value ) {\n\t\treturn value.replace( /('([^']|'')+'|'')|./g, function( character, literal ) {\n\n\t\t\t// Literals\n\t\t\tif ( literal ) {\n\t\t\t\treturn removeLiteralQuotes( literal );\n\t\t\t}\n\n\t\t\t// Symbols\n\t\t\tcharacter = character.replace( /[\\-+E%\\u2030]/, function( symbol ) {\n\t\t\t\treturn symbolMap[ symbol ];\n\t\t\t});\n\n\t\t\treturn character;\n\t\t});\n\t});\n\n\tprefix = aux[ 0 ];\n\tsuffix = aux[ 1 ];\n\tnegativePrefix = aux[ 2 ];\n\tnegativeSuffix = aux[ 3 ];\n\n\t// Number\n\t//\n\t// number_re = integer fraction?\n\t//\n\t// integer = digits | digits_using_grouping_separators\n\t//\n\t// fraction = regexp((.\\d+)?)\n\t//\n\t// digits = regexp(\\d+)\n\t//\n\t// digits_w_grouping_separators = digits_w_1_grouping_separators |\n\t// digits_w_2_grouping_separators\n\t//\n\t// digits_w_1_grouping_separators = regexp(\\d{1,3}(,\\d{3})+)\n\t//\n\t// digits_w_2_grouping_separators = regexp(\\d{1,2}((,\\d{2})*(,\\d{3})))\n\n\t// Integer part\n\tnumberTokenizer = digitsRe + \"+\";\n\n\t// Grouping separators\n\tif ( primaryGroupingSize ) {\n\t\tif ( secondaryGroupingSize ) {\n\t\t\taux = digitsRe + \"{1,\" + secondaryGroupingSize + \"}((\" + groupingSeparatorRe +\n\t\t\t\tdigitsRe + \"{\" + secondaryGroupingSize + \"})*(\" + groupingSeparatorRe +\n\t\t\t\tdigitsRe + \"{\" + primaryGroupingSize + \"}))\";\n\t\t} else {\n\t\t\taux = digitsRe + \"{1,\" + primaryGroupingSize + \"}(\" + groupingSeparatorRe +\n\t\t\t\tdigitsRe + \"{\" + primaryGroupingSize + \"})+\";\n\t\t}\n\t\tnumberTokenizer = \"(\" + aux + \"|\" + numberTokenizer + \")\";\n\t}\n\n\t// Fraction part? Only included if 1 or 2.\n\t// 1: Using significant digit format.\n\t// 2: Using integer and fractional format && it has a maximumFractionDigits.\n\tif ( !isNaN( minimumSignificantDigits * maximumSignificantDigits ) || /* 1 */\n\t\t\t\tmaximumFractionDigits /* 2 */ ) {\n\n\t\t// 1: Handle trailing decimal separator, e.g., `\"1.\" => `1``.\n\t\taux = decimalSymbolRe + digitsRe + \"+\";\n\t\tnumberTokenizer = numberTokenizer + \"(\" + aux + \"|\" + decimalSymbolRe /* 1 */ + \")?\" +\n\n\t\t\t// Handle non-padded decimals, e.g., `\".12\"` => `0.12` by making the integer part\n\t\t\t// optional.\n\t\t\t\"|(\" + numberTokenizer + \")?\" + aux;\n\n\t\tnumberTokenizer = \"(\" + numberTokenizer + \")\";\n\t}\n\n\t// 0: @invertedSymbolMap [Object] Inverted symbol map.\n\t// 1: @invertedNuDigitsMap [Object] Inverted digits map if numbering system is different than\n\t// `latn`.\n\t// 2: @tokenizer [Object] Tokenizer map, used by parser to consume input.\n\treturn [\n\t\tinvertedSymbolMap,\n\t\tinvertedNuDigitsMap,\n\t\t{\n\t\t\tinfinity: new RegExp( \"^\" + regexpEscape( infinitySymbol ) ),\n\t\t\tnan: new RegExp( \"^\" + regexpEscape( nanSymbol ) ),\n\t\t\tnegativePrefix: new RegExp( \"^\" + regexpEscape( negativePrefix ) ),\n\t\t\tnegativeSuffix: new RegExp( \"^\" + regexpEscape( negativeSuffix ) ),\n\t\t\tnumber: new RegExp( \"^\" + numberTokenizer ),\n\t\t\tprefix: new RegExp( \"^\" + regexpEscape( prefix ) ),\n\t\t\tsuffix: new RegExp( \"^\" + regexpEscape( suffix ) )\n\t\t}\n\t];\n\n};\n\n\n\n\n/**\n * Pattern( style )\n *\n * @style [String] \"decimal\" (default) or \"percent\".\n *\n * @cldr [Cldr instance].\n */\nvar numberPattern = function( style, cldr ) {\n\tif ( style !== \"decimal\" && style !== \"percent\" ) {\n\t\tthrow new Error( \"Invalid style\" );\n\t}\n\n\treturn cldr.main([\n\t\t\"numbers\",\n\t\tstyle + \"Formats-numberSystem-\" + numberNumberingSystem( cldr ),\n\t\t\"standard\"\n\t]);\n};\n\n\n\n\n/**\n * EBNF representation:\n *\n * compact_pattern_re = prefix?\n * number_pattern_re\n * suffix?\n *\n * number_pattern_re = 0+\n *\n * Regexp groups:\n *\n * 0: compact_pattern_re\n * 1: prefix\n * 2: number_pattern_re (the number pattern to use in compact mode)\n * 3: suffix\n */\nvar numberCompactPatternRe = ( /^([^0]*)(0+)([^0]*)$/ );\n\n\n\n\n/**\n * goupingSeparator( number, primaryGroupingSize, secondaryGroupingSize )\n *\n * @number [Number].\n *\n * @primaryGroupingSize [Number]\n *\n * @secondaryGroupingSize [Number]\n *\n * Return the formatted number with group separator.\n */\nvar numberFormatGroupingSeparator = function( number, primaryGroupingSize, secondaryGroupingSize ) {\n\tvar index,\n\t\tcurrentGroupingSize = primaryGroupingSize,\n\t\tret = \"\",\n\t\tsep = \",\",\n\t\tswitchToSecondary = secondaryGroupingSize ? true : false;\n\n\tnumber = String( number ).split( \".\" );\n\tindex = number[ 0 ].length;\n\n\twhile ( index > currentGroupingSize ) {\n\t\tret = number[ 0 ].slice( index - currentGroupingSize, index ) +\n\t\t\t( ret.length ? sep : \"\" ) + ret;\n\t\tindex -= currentGroupingSize;\n\t\tif ( switchToSecondary ) {\n\t\t\tcurrentGroupingSize = secondaryGroupingSize;\n\t\t\tswitchToSecondary = false;\n\t\t}\n\t}\n\n\tnumber[ 0 ] = number[ 0 ].slice( 0, index ) + ( ret.length ? sep : \"\" ) + ret;\n\treturn number.join( \".\" );\n};\n\n\n\n\n/**\n * integerFractionDigits( number, minimumIntegerDigits, minimumFractionDigits,\n * maximumFractionDigits, round, roundIncrement )\n *\n * @number [Number]\n *\n * @minimumIntegerDigits [Number]\n *\n * @minimumFractionDigits [Number]\n *\n * @maximumFractionDigits [Number]\n *\n * @round [Function]\n *\n * @roundIncrement [Function]\n *\n * Return the formatted integer and fraction digits.\n */\nvar numberFormatIntegerFractionDigits = function( number, minimumIntegerDigits, minimumFractionDigits, maximumFractionDigits, round,\n\troundIncrement ) {\n\n\t// Fraction\n\tif ( maximumFractionDigits ) {\n\n\t\t// Rounding\n\t\tif ( roundIncrement ) {\n\t\t\tnumber = round( number, roundIncrement );\n\n\t\t// Maximum fraction digits\n\t\t} else {\n\t\t\tnumber = round( number, { exponent: -maximumFractionDigits } );\n\t\t}\n\n\t} else {\n\t\tnumber = round( number );\n\t}\n\n\tnumber = String( number );\n\n\t// Maximum integer digits (post string phase)\n\tif ( maximumFractionDigits && /e-/.test( number ) ) {\n\n\t\t// Use toFixed( maximumFractionDigits ) to make sure small numbers like 1e-7 are\n\t\t// displayed using plain digits instead of scientific notation.\n\t\t// 1: Remove leading decimal zeros.\n\t\t// 2: Remove leading decimal separator.\n\t\t// Note: String() is still preferred so it doesn't mess up with a number precision\n\t\t// unnecessarily, e.g., (123456789.123).toFixed(10) === \"123456789.1229999959\",\n\t\t// String(123456789.123) === \"123456789.123\".\n\t\tnumber = ( +number ).toFixed( maximumFractionDigits )\n\t\t\t.replace( /0+$/, \"\" ) /* 1 */\n\t\t\t.replace( /\\.$/, \"\" ); /* 2 */\n\t}\n\n\t// Minimum fraction digits (post string phase)\n\tif ( minimumFractionDigits ) {\n\t\tnumber = number.split( \".\" );\n\t\tnumber[ 1 ] = stringPad( number[ 1 ] || \"\", minimumFractionDigits, true );\n\t\tnumber = number.join( \".\" );\n\t}\n\n\t// Minimum integer digits\n\tif ( minimumIntegerDigits ) {\n\t\tnumber = number.split( \".\" );\n\t\tnumber[ 0 ] = stringPad( number[ 0 ], minimumIntegerDigits );\n\t\tnumber = number.join( \".\" );\n\t}\n\n\treturn number;\n};\n\n\n\n\n/**\n * toPrecision( number, precision, round )\n *\n * @number (Number)\n *\n * @precision (Number) significant figures precision (not decimal precision).\n *\n * @round (Function)\n *\n * Return number.toPrecision( precision ) using the given round function.\n */\nvar numberToPrecision = function( number, precision, round ) {\n\tvar roundOrder;\n\n\tif ( number === 0 ) { // Fix #706\n\t\treturn number;\n\t}\n\n\troundOrder = Math.ceil( Math.log( Math.abs( number ) ) / Math.log( 10 ) );\n\troundOrder -= precision;\n\n\treturn round( number, { exponent: roundOrder } );\n};\n\n\n\n\n/**\n * toPrecision( number, minimumSignificantDigits, maximumSignificantDigits, round )\n *\n * @number [Number]\n *\n * @minimumSignificantDigits [Number]\n *\n * @maximumSignificantDigits [Number]\n *\n * @round [Function]\n *\n * Return the formatted significant digits number.\n */\nvar numberFormatSignificantDigits = function( number, minimumSignificantDigits, maximumSignificantDigits, round ) {\n\tvar atMinimum, atMaximum;\n\n\t// Sanity check.\n\tif ( minimumSignificantDigits > maximumSignificantDigits ) {\n\t\tmaximumSignificantDigits = minimumSignificantDigits;\n\t}\n\n\tatMinimum = numberToPrecision( number, minimumSignificantDigits, round );\n\tatMaximum = numberToPrecision( number, maximumSignificantDigits, round );\n\n\t// Use atMaximum only if it has more significant digits than atMinimum.\n\tnumber = +atMinimum === +atMaximum ? atMinimum : atMaximum;\n\n\t// Expand integer numbers, eg. 123e5 to 12300.\n\tnumber = ( +number ).toString( 10 );\n\n\tif ( ( /e/ ).test( number ) ) {\n\t\tthrow createErrorUnsupportedFeature({\n\t\t\tfeature: \"integers out of (1e21, 1e-7)\"\n\t\t});\n\t}\n\n\t// Add trailing zeros if necessary.\n\tif ( minimumSignificantDigits - number.replace( /^0+|\\./g, \"\" ).length > 0 ) {\n\t\tnumber = number.split( \".\" );\n\t\tnumber[ 1 ] = stringPad( number[ 1 ] || \"\", minimumSignificantDigits - number[ 0 ].replace( /^0+/, \"\" ).length, true );\n\t\tnumber = number.join( \".\" );\n\t}\n\n\treturn number;\n};\n\n\n\n\n/**\n * format( number, properties )\n *\n * @number [Number].\n *\n * @properties [Object] Output of number/format-properties.\n *\n * Return the formatted number.\n * ref: http://www.unicode.org/reports/tr35/tr35-numbers.html\n */\nvar numberFormat = function( number, properties, pluralGenerator ) {\n\tvar aux, compactMap, infinitySymbol, maximumFractionDigits, maximumSignificantDigits,\n\t\tminimumFractionDigits, minimumIntegerDigits, minimumSignificantDigits, nanSymbol,\n\t\tnuDigitsMap, prefix, primaryGroupingSize, pattern, round, roundIncrement,\n\t\tsecondaryGroupingSize, stringToParts, suffix, symbolMap;\n\n\tminimumIntegerDigits = properties[ 2 ];\n\tminimumFractionDigits = properties[ 3 ];\n\tmaximumFractionDigits = properties[ 4 ];\n\tminimumSignificantDigits = properties[ 5 ];\n\tmaximumSignificantDigits = properties[ 6 ];\n\troundIncrement = properties[ 7 ];\n\tprimaryGroupingSize = properties[ 8 ];\n\tsecondaryGroupingSize = properties[ 9 ];\n\tround = properties[ 15 ];\n\tinfinitySymbol = properties[ 16 ];\n\tnanSymbol = properties[ 17 ];\n\tsymbolMap = properties[ 18 ];\n\tnuDigitsMap = properties[ 19 ];\n\tcompactMap = properties[ 20 ];\n\n\t// NaN\n\tif ( isNaN( number ) ) {\n\t\treturn [ { type: \"nan\", value: nanSymbol } ];\n\t}\n\n\tif ( number < 0 ) {\n\t\tpattern = properties[ 12 ];\n\t\tprefix = properties[ 13 ];\n\t\tsuffix = properties[ 14 ];\n\t} else {\n\t\tpattern = properties[ 11 ];\n\t\tprefix = properties[ 0 ];\n\t\tsuffix = properties[ 10 ];\n\t}\n\n\t// For prefix, suffix, and number parts.\n\tstringToParts = function( string ) {\n\t\tvar numberType = \"integer\",\n\t\t\tparts = [];\n\n\t\t// TODO Move the tokenization of all parts that don't depend on number into\n\t\t// format-properties.\n\t\tstring.replace( /('([^']|'')+'|'')|./g, function( character, literal ) {\n\n\t\t\t// Literals\n\t\t\tif ( literal ) {\n\t\t\t\tpartsPush( parts, \"literal\", removeLiteralQuotes( literal ) );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Currency symbol\n\t\t\tif ( character === \"\\u00A4\" ) {\n\t\t\t\tpartsPush( parts, \"currency\", character );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Symbols\n\t\t\tcharacter = character.replace( /[.,\\-+E%\\u2030]/, function( symbol ) {\n\t\t\t\tif ( symbol === \".\" ) {\n\t\t\t\t\tnumberType = \"fraction\";\n\t\t\t\t}\n\t\t\t\tpartsPush( parts, numberSymbolName[ symbol ], symbolMap[ symbol ] );\n\n\t\t\t\t// \"Erase\" handled character.\n\t\t\t\treturn \"\";\n\t\t\t});\n\n\t\t\t// Number\n\t\t\tcharacter = character.replace( /[0-9]/, function( digit ) {\n\n\t\t\t\t// Numbering system\n\t\t\t\tif ( nuDigitsMap ) {\n\t\t\t\t\tdigit = nuDigitsMap[ +digit ];\n\t\t\t\t}\n\t\t\t\tpartsPush( parts, numberType, digit );\n\n\t\t\t\t// \"Erase\" handled character.\n\t\t\t\treturn \"\";\n\t\t\t});\n\n\t\t\t// Etc\n\t\t\tcharacter.replace( /./, function( etc ) {\n\t\t\t\tpartsPush( parts, \"literal\", etc );\n\t\t\t});\n\t\t});\n\t\treturn parts;\n\t};\n\n\tprefix = stringToParts( prefix );\n\tsuffix = stringToParts( suffix );\n\n\t// Infinity\n\tif ( !isFinite( number ) ) {\n\t\treturn prefix.concat(\n\t\t\t{ type: \"infinity\", value: infinitySymbol },\n\t\t\tsuffix\n\t\t);\n\t}\n\n\t// Percent\n\tif ( pattern.indexOf( \"%\" ) !== -1 ) {\n\t\tnumber *= 100;\n\n\t// Per mille\n\t} else if ( pattern.indexOf( \"\\u2030\" ) !== -1 ) {\n\t\tnumber *= 1000;\n\t}\n\n\tvar compactPattern, compactDigits, compactProperties, divisor, numberExponent, pluralForm;\n\n\t// Compact mode: initial number digit processing\n\tif ( compactMap ) {\n\t\tnumberExponent = Math.abs( Math.floor( number ) ).toString().length - 1;\n\t\tnumberExponent = Math.min( numberExponent, compactMap.maxExponent );\n\n\t\t// Use default plural form to perform initial decimal shift\n\t\tif ( numberExponent >= 3 ) {\n\t\t\tcompactPattern = compactMap[ numberExponent ] && compactMap[ numberExponent ].other;\n\t\t}\n\n\t\tif ( compactPattern === \"0\" ) {\n\t\t\tcompactPattern = null;\n\t\t} else if ( compactPattern ) {\n\t\t\tcompactDigits = compactPattern.split( \"0\" ).length - 1;\n\t\t\tdivisor = numberExponent - ( compactDigits - 1 );\n\t\t\tnumber = number / Math.pow( 10, divisor );\n\t\t}\n\t}\n\n\t// Significant digit format\n\tif ( !isNaN( minimumSignificantDigits * maximumSignificantDigits ) ) {\n\t\tnumber = numberFormatSignificantDigits( number, minimumSignificantDigits,\n\t\t\tmaximumSignificantDigits, round );\n\n\t// Integer and fractional format\n\t} else {\n\t\tnumber = numberFormatIntegerFractionDigits( number, minimumIntegerDigits,\n\t\t\tminimumFractionDigits, maximumFractionDigits, round, roundIncrement );\n\t}\n\n\t// Compact mode: apply formatting\n\tif ( compactMap && compactPattern ) {\n\n\t\t// Get plural form after possible roundings\n\t\tpluralForm = pluralGenerator ? pluralGenerator( +number ) : \"other\";\n\n\t\tcompactPattern = compactMap[ numberExponent ][ pluralForm ] || compactPattern;\n\t\tcompactProperties = compactPattern.match( numberCompactPatternRe );\n\n\t\t// TODO Move the tokenization of all parts that don't depend on number into\n\t\t// format-properties.\n\t\taux = function( string ) {\n\t\t\tvar parts = [];\n\t\t\tstring.replace( /(\\s+)|([^\\s0]+)/g, function( _garbage, space, compact ) {\n\n\t\t\t\t// Literals\n\t\t\t\tif ( space ) {\n\t\t\t\t\tpartsPush( parts, \"literal\", space );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Compact value\n\t\t\t\tif ( compact ) {\n\t\t\t\t\tpartsPush( parts, \"compact\", compact );\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn parts;\n\t\t};\n\n\t\t// update prefix/suffix with compact prefix/suffix\n\t\tprefix = prefix.concat( aux( compactProperties[ 1 ] ) );\n\t\tsuffix = aux( compactProperties[ 3 ] ).concat( suffix );\n\t}\n\n\t// Remove the possible number minus sign\n\tnumber = number.replace( /^-/, \"\" );\n\n\t// Grouping separators\n\tif ( primaryGroupingSize ) {\n\t\tnumber = numberFormatGroupingSeparator( number, primaryGroupingSize,\n\t\t\tsecondaryGroupingSize );\n\t}\n\n\t// Scientific notation\n\t// TODO implement here\n\n\t// Padding/'([^']|'')+'|''|[.,\\-+E%\\u2030]/g\n\t// TODO implement here\n\n\treturn prefix.concat(\n\t\tstringToParts( number ),\n\t\tsuffix\n\t);\n};\n\n\n\n\nvar numberToPartsFormatterFn = function( properties, pluralGenerator ) {\n\treturn function numberToPartsFormatter( value ) {\n\t\tvalidateParameterPresence( value, \"value\" );\n\t\tvalidateParameterTypeNumber( value, \"value\" );\n\n\t\treturn numberFormat( value, properties, pluralGenerator );\n\t};\n};\n\n\n\n\nfunction validateDigits( properties ) {\n\tvar minimumIntegerDigits = properties[ 2 ],\n\t\tminimumFractionDigits = properties[ 3 ],\n\t\tmaximumFractionDigits = properties[ 4 ],\n\t\tminimumSignificantDigits = properties[ 5 ],\n\t\tmaximumSignificantDigits = properties[ 6 ];\n\n\t// Validate significant digit format properties\n\tif ( !isNaN( minimumSignificantDigits * maximumSignificantDigits ) ) {\n\t\tvalidateParameterRange( minimumSignificantDigits, \"minimumSignificantDigits\", 1, 21 );\n\t\tvalidateParameterRange( maximumSignificantDigits, \"maximumSignificantDigits\",\n\t\t\tminimumSignificantDigits, 21 );\n\n\t} else if ( !isNaN( minimumSignificantDigits ) || !isNaN( maximumSignificantDigits ) ) {\n\t\tthrow new Error( \"Neither or both the minimum and maximum significant digits must be \" +\n\t\t\t\"present\" );\n\n\t// Validate integer and fractional format\n\t} else {\n\t\tvalidateParameterRange( minimumIntegerDigits, \"minimumIntegerDigits\", 1, 21 );\n\t\tvalidateParameterRange( minimumFractionDigits, \"minimumFractionDigits\", 0, 20 );\n\t\tvalidateParameterRange( maximumFractionDigits, \"maximumFractionDigits\",\n\t\t\tminimumFractionDigits, 20 );\n\t}\n}\n\n/**\n * .numberFormatter( [options] )\n *\n * @options [Object]:\n * - style: [String] \"decimal\" (default) or \"percent\".\n * - see also number/format options.\n *\n * Return a function that formats a number according to the given options and default/instance\n * locale.\n */\nGlobalize.numberFormatter =\nGlobalize.prototype.numberFormatter = function( options ) {\n\tvar args, numberToPartsFormatter, returnFn;\n\n\tvalidateParameterTypePlainObject( options, \"options\" );\n\n\toptions = options || {};\n\targs = [ options ];\n\n\tnumberToPartsFormatter = this.numberToPartsFormatter( options );\n\treturnFn = numberFormatterFn( numberToPartsFormatter );\n\truntimeBind( args, this.cldr, returnFn, [ numberToPartsFormatter ] );\n\n\treturn returnFn;\n};\n\n/**\n * .numberToPartsFormatter( [options] )\n *\n * @options [Object]:\n * - style: [String] \"symbol\" (default), \"accounting\", \"code\" or \"name\".\n * - see also number/format options.\n *\n * Return a function that formats a number to parts according to the given options and\n * default/instance locale.\n */\nGlobalize.numberToPartsFormatter =\nGlobalize.prototype.numberToPartsFormatter = function( options ) {\n\tvar args, cldr, fnArgs, pattern, properties, returnFn;\n\n\tvalidateParameterTypePlainObject( options, \"options\" );\n\n\toptions = options || {};\n\tcldr = this.cldr;\n\n\targs = [ options ];\n\n\tvalidateDefaultLocale( cldr );\n\n\tcldr.on( \"get\", validateCldr );\n\ttry {\n\t\tif ( options.raw ) {\n\t\t\tpattern = options.raw;\n\t\t} else {\n\t\t\tpattern = numberPattern( options.style || \"decimal\", cldr );\n\t\t}\n\n\t\tproperties = numberFormatProperties( pattern, cldr, options );\n\t\tfnArgs = [ properties ];\n\t} finally {\n\t\tcldr.off( \"get\", validateCldr );\n\t}\n\n\tvalidateDigits( properties );\n\n\tif ( options.compact ) {\n\t\tfnArgs.push( this.pluralGenerator() );\n\t}\n\treturnFn = numberToPartsFormatterFn.apply( null, fnArgs );\n\truntimeBind( args, cldr, returnFn, fnArgs );\n\n\treturn returnFn;\n};\n\n/**\n * .numberParser( [options] )\n *\n * @options [Object]:\n * - style: [String] \"decimal\" (default) or \"percent\".\n *\n * Return the number parser according to the default/instance locale.\n */\nGlobalize.numberParser =\nGlobalize.prototype.numberParser = function( options ) {\n\tvar args, cldr, pattern, properties, returnFn;\n\n\tvalidateParameterTypePlainObject( options, \"options\" );\n\n\toptions = options || {};\n\tcldr = this.cldr;\n\n\targs = [ options ];\n\n\tvalidateDefaultLocale( cldr );\n\tif ( options.compact ) {\n\t\tthrow createErrorUnsupportedFeature({\n\t\t\tfeature: \"compact number parsing (not implemented)\"\n\t\t});\n\t}\n\n\tcldr.on( \"get\", validateCldr );\n\n\tif ( options.raw ) {\n\t\tpattern = options.raw;\n\t} else {\n\t\tpattern = numberPattern( options.style || \"decimal\", cldr );\n\t}\n\n\tproperties = numberParseProperties( pattern, cldr, options );\n\n\tcldr.off( \"get\", validateCldr );\n\n\treturnFn = numberParserFn( properties );\n\n\truntimeBind( args, cldr, returnFn, [ properties ] );\n\n\treturn returnFn;\n};\n\n/**\n * .formatNumber( value [, options] )\n *\n * @value [Number] number to be formatted.\n *\n * @options [Object]: see number/format-properties.\n *\n * Format a number according to the given options and default/instance locale.\n */\nGlobalize.formatNumber =\nGlobalize.prototype.formatNumber = function( value, options ) {\n\tvalidateParameterPresence( value, \"value\" );\n\tvalidateParameterTypeNumber( value, \"value\" );\n\n\treturn this.numberFormatter( options )( value );\n};\n\n/**\n * .formatNumberToParts( value [, options] )\n *\n * @value [Number] number to be formatted.\n *\n * @options [Object]: see number/format-properties.\n *\n * Format a number to pars according to the given options and default/instance locale.\n */\nGlobalize.formatNumberToParts =\nGlobalize.prototype.formatNumberToParts = function( value, options ) {\n\tvalidateParameterPresence( value, \"value\" );\n\tvalidateParameterTypeNumber( value, \"value\" );\n\n\treturn this.numberToPartsFormatter( options )( value );\n};\n\n/**\n * .parseNumber( value [, options] )\n *\n * @value [String]\n *\n * @options [Object]: See numberParser().\n *\n * Return the parsed Number (including Infinity) or NaN when value is invalid.\n */\nGlobalize.parseNumber =\nGlobalize.prototype.parseNumber = function( value, options ) {\n\tvalidateParameterPresence( value, \"value\" );\n\tvalidateParameterTypeString( value, \"value\" );\n\n\treturn this.numberParser( options )( value );\n};\n\n/**\n * Optimization to avoid duplicating some internal functions across modules.\n */\nGlobalize._createErrorUnsupportedFeature = createErrorUnsupportedFeature;\nGlobalize._numberNumberingSystem = numberNumberingSystem;\nGlobalize._numberNumberingSystemDigitsMap = numberNumberingSystemDigitsMap;\nGlobalize._numberPattern = numberPattern;\nGlobalize._numberSymbol = numberSymbol;\nGlobalize._looseMatching = looseMatching;\nGlobalize._removeLiteralQuotes = removeLiteralQuotes;\nGlobalize._stringPad = stringPad;\nGlobalize._validateParameterTypeNumber = validateParameterTypeNumber;\nGlobalize._validateParameterTypeString = validateParameterTypeString;\n\nreturn Globalize;\n\n\n\n\n}));\n\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","\"use strict\";\n\nvar core = require(\"./core\"),\n assertion = require(\"./utils/assertion\"),\n basic = require(\"./utils/basic\"),\n assertType = assertion.assertType,\n getValueOrDefault = basic.getValueOrDefault,\n assertRange = assertion.assertRange,\n objectAssign = require(\"object-assign\"),\n nameCommon = require(\"../nameCommon\"),\n NameHandler = function() {},\n nameFields = [\n \"namePrefix\",\n \"givenName\",\n \"middleName\",\n \"surname\",\n \"secondSurname\",\n \"nameSuffix\",\n \"altName\"\n ],\n businessNameFields = [\"businessName\"],\n messages = {\n errors: {\n // errors\n NAME_SCRIPT_VALIDATION_ERROR:\n \"The name provided contains invalid characters, the first invalid character has the code point: {codePoint}\",\n NAME_REQUIRED_FIELD_MISSING: \"A required name field is missing\",\n\n // exceptions\n NAME_FORMAT_NOT_FOUND:\n \"The format requested does not exist for this country\"\n },\n warnings: {}\n },\n styles = {\n NAME_FORMAT_INPUT: \"capturePersonName_legal\",\n NAME_FORMAT_INFORMAL: \"displayPersonName_informal\",\n NAME_FORMAT_FULL: \"displayPersonName_full\",\n NAME_FORMAT_BUSINESS_INFORMAL: \"displayPersonName_businessInformal\"\n },\n transformTypes = {\n ONE_SURNAME: \"surname\",\n TWO_SURNAMES: \"surname_secondSurname\"\n };\n\nObject.keys(styles).forEach(function(style) {\n Object.defineProperty(NameHandler.prototype, style, {\n get: function() {\n return styles[style];\n },\n enumerable: true\n });\n});\n\nObject.keys(transformTypes).forEach(function(transformType) {\n Object.defineProperty(NameHandler.prototype, transformType, {\n get: function() {\n return transformTypes[transformType];\n },\n enumerable: true\n });\n});\n\nvar styleValues = Object.keys(styles).map(function(style) {\n return styles[style];\n});\n\nfunction getStyleObject(style) {\n // Alternatively This can be in styles object and switch will be removed\n switch (style) {\n case styles.NAME_FORMAT_INPUT:\n return { type: \"capturePersonName\", scope: \"legal\" };\n case styles.NAME_FORMAT_INFORMAL:\n return { type: \"displayPersonName\", scope: \"informal\" };\n case styles.NAME_FORMAT_FULL:\n return { type: \"displayPersonName\", scope: \"full\" };\n case styles.NAME_FORMAT_BUSINESS_INFORMAL:\n return { type: \"displayPersonName\", scope: \"businessInformal\" };\n }\n}\n\nfunction getMetadata(handler) {\n return handler.metadata;\n}\n\nfunction definePrivateProperty(handler, propertyName, propertyValue) {\n Object.defineProperty(handler, propertyName, {\n value: propertyValue\n });\n}\n\nfunction useMetadata(handler, metadata) {\n assertType(metadata, \"metadata\", [\"plain object\"]); // This is actually not needed as useMetadata is always called by createHandler which does this assertion, but kept it for now for more validation checks.\n definePrivateProperty(handler, \"metadata\", metadata);\n\n // This gives the idea of a candidate future function like assertTypeBySchema\n assertType(metadata.territory, \"metadata\", [\"plain object\"], {\n errorMessage: core.generalMessages.errors.METADATA_INVALID\n });\n assertType(metadata.country, \"metadata\", [\"string\"], {\n errorMessage: core.generalMessages.errors.METADATA_INVALID\n });\n assertType(metadata.language, \"metadata\", [\"string\"], {\n errorMessage: core.generalMessages.errors.METADATA_INVALID\n });\n\n definePrivateProperty(handler, \"language\", metadata.language);\n definePrivateProperty(handler, \"country\", metadata.country);\n}\n\nfunction nameValidations(handler, countryCode) {\n var meta = getMetadata(handler),\n territorySection = meta.territory[core.getCountry(handler, countryCode)];\n return territorySection.validations;\n}\n\nObject.defineProperty(NameHandler.prototype, \"validateName\", {\n value: function validateName(name, options) {\n assertName(name, \"name\", nameFields);\n assertType(options, \"options\", [\"plain object\", \"undefined\"]);\n options = getValueOrDefault(options, {});\n assertType(options.country, \"options.country\", [\"string\", \"undefined\"]);\n assertType(options.field, \"options.field\", [\"string\", \"undefined\"]);\n assertType(options.nationality, \"options.nationality\", [\n \"string\",\n \"undefined\"\n ]);\n var field = options.field;\n if (field) {\n assertRange(\n field,\n nameFields,\n \"Invalid value for options.field: {field}\",\n { field: field }\n );\n }\n var validateOptions = objectAssign({}, options);\n var country = validateOptions.country,\n nameMeta = getNameMeta(this, name, {\n style: this.NAME_FORMAT_INPUT,\n country: country\n }),\n validationsMeta = nameValidations(this, country);\n if (field) {\n // only validate a specific field\n // return validateField(name, field, nameMeta, validationsMeta, errors);\n return nameCommon.validateName(\n name,\n nameMeta,\n validationsMeta,\n field,\n options.nationality\n );\n }\n return nameCommon.validateName(\n name,\n nameMeta,\n validationsMeta,\n null,\n options.nationality\n );\n },\n enumerable: true\n});\n\nObject.defineProperty(NameHandler.prototype, \"validateBusinessName\", {\n value: function validateBusinessName(businessName, options) {\n assertName(businessName, \"businessName\", businessNameFields);\n\n assertType(options, \"options\", [\"plain object\", \"undefined\"]);\n options = getValueOrDefault(options, {});\n assertType(options.country, \"options.country\", [\"string\", \"undefined\"]);\n assertType(options.businessType, \"options.businessType\", [\n \"string\",\n \"undefined\"\n ]);\n var validateOptions = objectAssign({}, options);\n getNameMeta(this, businessName, {\n style: this.NAME_FORMAT_INPUT,\n country: validateOptions.country\n }); // For validation checks\n\n return nameCommon.validateBusinessName(\n businessName,\n nameValidations(this, validateOptions.country),\n options\n );\n },\n enumerable: true\n});\n\nObject.defineProperty(NameHandler.prototype, \"transformName\", {\n value: function transformName(name, options) {\n assertName(name, \"name\", nameFields);\n return nameCommon.transformName(name, options, transformTypes);\n },\n enumerable: true\n});\n\nObject.defineProperty(NameHandler.prototype, \"formatName\", {\n value: function formatName(name, options) {\n assertName(name, \"name\", nameFields);\n assertType(options, \"options\", [\"plain object\", \"undefined\"]);\n options = getValueOrDefault(options, {});\n assertType(options.country, \"options.country\", [\"string\", \"undefined\"]);\n var formatOptions = objectAssign({}, options);\n formatOptions.style = getValueOrDefault(\n formatOptions.style,\n styles.NAME_FORMAT_FULL\n );\n var style = formatOptions.style;\n assertStyle(style);\n if (style === styles.NAME_FORMAT_INPUT) {\n return formatToNameInput(this, name, formatOptions);\n }\n var nameMeta = getNameMeta(this, name, formatOptions),\n formattedName = getPartsOutput(nameMeta.layout, name);\n return toTextOutput(formattedName);\n },\n enumerable: true\n});\n\n// This function will return an object like\n// layout: [\n// 'givenName',\n// 'surname'\n// ],\n// properties: {\n// givenName: {\n// required: true,\n// value: 'John',\n// label: 'First name'\n// },\n// surname: {\n// required: true,\n// value: 'Smith',\n// label: 'Last name'\n// }\n// }\n//\n// Using a name parameter like:\n// {givenName: 'John', surname: 'Smith'}\n//\n// layout metadata like:\n// {\n// \"$\": \"givenName\",\n// \"required\": true\n// },\n// {\n// \"$\": \"surname\",\n// \"required\": true\n// }\n//\n// and strings metadata like\n// {\n// givenNameLabel: \"First name\",\n// surnameLabel: \"Last name\",\n// optionalLabel: \"(optional)\"\n// }\nfunction formatToNameInput(handler, name, options) {\n var meta = getNameMeta(handler, {}, options),\n layout = [],\n properties = {};\n meta.layout.forEach(function(layoutElement) {\n for (var property in layoutElement) {\n var key = layoutElement.$;\n if (property === \"$\") {\n // push '$' into layout array in the result\n layout.push(key);\n } else {\n if (!properties[key]) {\n properties[key] = {};\n }\n // populate name fields and put in the properties\n properties[key].value = getValueOrDefault(name[key], \"\");\n properties[key][property] = layoutElement[property]; // set other proeprties in the result\n }\n }\n });\n // Now set label proeprties based on strings metadata\n var labels = nameStrings(handler, options.country);\n for (var key in labels) {\n if (properties[key]) {\n properties[key].label = labels[key];\n // if the field is not required, put the optional label as extra property\n if (!properties[key].required && labels.optional) {\n properties[key].optionalLabel = labels.optional;\n }\n }\n }\n return { layout: layout, properties: properties };\n}\n\nfunction nameStrings(handler, countryCode) {\n var meta = getMetadata(handler),\n territorySection = meta.territory[core.getCountry(handler, countryCode)],\n strings = {};\n if (territorySection.strings && territorySection.strings[handler.language]) {\n strings = territorySection.strings[handler.language];\n }\n return strings;\n}\n\nfunction countryDefaultNameScript(handler, territory) {\n var meta = getMetadata(handler),\n territorySection = meta.territory[core.getCountry(handler, territory)];\n return territorySection.defaultScript;\n}\n\nfunction languageDefaultNameScript(handler, language) {\n return core.languageDefaultScript(language || handler.language);\n}\n\nfunction nameMeta(handler, style, script, territory) {\n var styleObject = getStyleObject(style);\n assertType(styleObject, \"\", [\"plain object\"], {\n errorMessage: messages.errors.NAME_FORMAT_NOT_FOUND\n });\n var layoutType = styleObject.type,\n scope = styleObject.scope,\n meta = getMetadata(handler),\n territorySection = meta.territory[core.getCountry(handler, territory)]; // use handler country if territory is omitted\n if (!territorySection) {\n return;\n }\n var layout =\n territorySection.script[script] &&\n territorySection.script[script].layoutType[layoutType] &&\n territorySection.script[script].layoutType[layoutType].scope[scope],\n strings = nameStrings(handler, territory);\n if (layout) {\n return { layout: layout, strings: strings };\n }\n}\n\nfunction detectScript(handler, name, style, country) {\n var script;\n if (style === styles.NAME_FORMAT_INPUT) {\n // The prefered script for name input format is language default script\n script = languageDefaultNameScript(handler);\n } else if (isLatinName(name)) {\n // For display formats, if name is all Latin, always use Latn script\n script = \"Latn\";\n } else {\n // Otherwise country default script is the preferred script\n script = countryDefaultNameScript(handler, country);\n }\n return script;\n}\n\nfunction assertStyle(style) {\n assertRange(style, styleValues, \"Invalid value for options.style: {style}\", {\n style: style\n });\n}\n\nfunction getNameMeta(handler, name, options) {\n var style = options.style,\n country = options.country;\n var script = detectScript(handler, name, style, country),\n metadata =\n // Use the preferred script if it is available, otherwise use Latn\n getValueOrDefault(\n nameMeta(handler, style, script, country),\n nameMeta(handler, style, \"Latn\", country)\n ); // This line does not happen for display format as the preferred script is available\n assertType(metadata, \"metadata\", [\"plain object\"], {\n errorMessage: messages.errors.NAME_FORMAT_NOT_FOUND\n });\n return metadata; // contains { layout, strings }\n}\n\nfunction isLatinName(name) {\n if (!name) {\n return true;\n }\n return nameFields.every(function(field) {\n return basic.isLatin(name[field]);\n });\n}\n\nfunction assertName(name, parameterName, fields) {\n assertType(name, parameterName, [\"plain object\"]);\n fields.forEach(function(field) {\n assertType(name[field], parameterName + \".\" + field, [\n \"string\",\n \"undefined\"\n ]);\n });\n}\n\nfunction toTextOutput(formattedName) {\n return formattedName\n .filter(function(field) {\n return field.value !== undefined; // skip fields with no values\n })\n .map(function(field) {\n return field.value; // map to values\n })\n .join(\"\"); // join with empty string\n}\n\nfunction getPartsOutput(layoutMeta, name) {\n var output = [],\n separatorWaiting,\n realFieldSeen = false;\n layoutMeta.forEach(function(field) {\n var newField = {};\n if (name[field.$] !== undefined) {\n // if input value exists\n // first push any waiting separator if we've already pushed a 'real' field\n // (don't want to produce a separator-initial name)\n if (realFieldSeen && separatorWaiting) {\n output.push(separatorWaiting);\n }\n // then push field\n Object.keys(field).forEach(function(attribute) {\n newField[mapAttribute(attribute)] = field[attribute]; // clone field object\n });\n newField.value = name[field.$];\n output.push(newField);\n realFieldSeen = true; // set flag that real field has been seen\n separatorWaiting = undefined; // clear the separator cache\n } else if (field.$ === \"separator\") {\n // if the field is a separator, save it and push later\n separatorWaiting = {};\n Object.keys(field).forEach(function(attribute) {\n separatorWaiting[mapAttribute(attribute)] = field[attribute]; // clone field object\n });\n separatorWaiting.value = field._ || \"\";\n }\n });\n\n return output;\n}\n\nfunction mapAttribute(attribute) {\n var attributeMap = { $: \"type\", _: \"value\" };\n return attributeMap[attribute] ? attributeMap[attribute] : attribute;\n}\n\nmodule.exports = {\n createHandler: function createHandler(metadata) {\n assertType(metadata, \"metadata\", [\"plain object\"]);\n assertType(metadata.griffin, \"\", [\"plain object\"], {\n errorMessage: core.generalMessages.errors.METADATA_INVALID\n });\n assertType(metadata.griffin.name, \"\", [\"plain object\"], {\n errorMessage: core.generalMessages.errors.METADATA_INVALID\n });\n\n var handler = new NameHandler();\n useMetadata(handler, metadata.griffin.name);\n return handler;\n }\n};\n","/**\n * Shared code between Griffin Node.js and Griffin client.\n *\n * Important: Do NOT include anything in here that isn't meant to be part of both libraries.\n */\n\n\"use strict\";\nvar basic = require(\"./client/utils/basic\"),\n assertion = require(\"./client/utils/assertion\"),\n assertType = assertion.assertType,\n assertRange = assertion.assertRange,\n findUniqueElementArray = require(\"./utils\").findUniqueElementArray,\n getSymbolArray = require(\"./utils\").getSymbolArray;\nvar nameFields = [\n \"namePrefix\",\n \"givenName\",\n \"middleName\",\n \"surname\",\n \"secondSurname\",\n \"nameSuffix\",\n \"altName\"\n];\nvar messages = {\n errors: {\n // errors\n NAME_SCRIPT_VALIDATION_ERROR:\n \"The name provided contains invalid characters, the first invalid character has the code point: {codePoint}\",\n NAME_REQUIRED_FIELD_MISSING: \"A required name field is missing\",\n NAME_ALL_PUNCTUATION_ERROR:\n \"Name cannot be all punctuation marks. The punctuation detected is: {pattern}\",\n NAME_CHARACTER_REPETITION_ERROR:\n \"Name contains repetitive characters. The first character repeated is: {pattern}\",\n NAME_ALL_HONORIFICS_ERROR:\n \"Name cannot be all honorifics. The honorifics detected is: {pattern}\",\n NAME_KEYBOARD_BANGING_ERROR:\n \"Keyboard banging detected. The first invalid pattern is: {pattern}\",\n NAME_SINGLE_CHARACTER_ERROR:\n \"Name cannot contain only single character. Single character detected is: {pattern}\",\n NAME_NATIONALITY_SCRIPT_VALIDATION_ERROR:\n \"The name is provided in {pattern} script, which is not supported for the specified nationality.\",\n NAME_MIXED_SCRIPT_VALIDATION_ERROR:\n \"The name provided contains characters from multiple supported scripts\",\n NAME_INVALID_PATTERN_ERROR:\n \"Name invalid according to {negativePaternName} pattern.\",\n NAME_ALL_NUMBER_ERROR:\n \"Name cannot be all numbers or punctuation characters. The number/punctuation dectected is: {pattern}\",\n NAME_ALL_RESTRICTED_ERROR:\n \"Name contains restricted name. The restricted name detected is: {pattern}\",\n NAME_ALL_REGISTERED_ACCOUNT_ERROR:\n \"Name contains invalid registered business name. The invalid registered business name pattern is: {pattern}\",\n // only message of BUSINESS_NAME_ALL_PUNCTUATION_ERROR is used.\n BUSINESS_NAME_ALL_PUNCTUATION_ERROR:\n \"Name cannot be all numbers or punctuation characters. The number/punctuation dectected is: {pattern}\"\n },\n warnings: {}\n};\n\nfunction getBusinessNameSupportedScripts(\n businessType,\n supportedScriptsByCountry\n) {\n var supportedScripts = basic.objectGet(supportedScriptsByCountry, [\n \"business\",\n \"type\"\n ]);\n var businessTypeScripts = businessType\n ? supportedScripts[businessType] || supportedScripts.DEFAULT\n : supportedScripts.DEFAULT;\n return businessTypeScripts;\n}\n\nfunction getBusinessNameScripts(bName, nameValidations, businessType) {\n var scripts = getBusinessNameSupportedScripts(\n businessType,\n nameValidations.supportedScripts\n );\n var bScripts = [];\n for (var index = 0; index < scripts.length; index++) {\n var characterRangeRegex = basic.objectGet(nameValidations, [\n \"businessScriptValidations\",\n scripts[index],\n \"characterRange\"\n ]);\n if (characterRangeRegex) {\n characterRangeRegex = new RegExp(\"^(\" + characterRangeRegex + \")*?$\");\n if (characterRangeRegex.test(bName)) {\n bScripts.push(scripts[index]);\n }\n }\n }\n return bScripts;\n}\n\nfunction getBusinessKey(businessType) {\n if (businessType === \"LEGAL\") {\n return \"legal\";\n }\n if (businessType === \"DOING_BUSINESS_AS\") {\n return \"doingBusinessAs\";\n }\n return \"default\";\n}\n\nfunction getRegisteredBusinessTypeKey(registeredBusinessType) {\n if (registeredBusinessType === \"NON-REGISTERED-BUSINESS\") {\n return \"nonRegistered\";\n }\n return \"registered\";\n}\n\nfunction getBusinessNameCharacterRangeForScripts(nameValidations, scripts) {\n var consolidatedCharacterRange = null;\n for (var index = 0; index < scripts.length; index++) {\n var characterRange = basic.objectGet(nameValidations, [\n \"businessScriptValidations\",\n scripts[index],\n \"characterRange\"\n ]);\n consolidatedCharacterRange = consolidatedCharacterRange\n ? consolidatedCharacterRange + \"|\" + characterRange\n : characterRange;\n }\n return consolidatedCharacterRange;\n}\n\nfunction validateBusinessName(businessName, nameValidations, options) {\n var errors = [];\n if (!businessName || !businessName.businessName) {\n errors.push({\n name: \"NAME_REQUIRED_FIELD_MISSING\",\n message: messages.errors.NAME_REQUIRED_FIELD_MISSING,\n detail: \"businessName\"\n });\n return { errors: errors };\n }\n var businessNameValidations = nameValidations.businessScriptValidations;\n var businessType = options ? options.businessType : null;\n var registeredBusinessType = options ? options.registeredBusinessType : null;\n var bName = businessName.businessName;\n var businessNameKey = getBusinessKey(businessType);\n var registeredBusinessTypeKey = getRegisteredBusinessTypeKey(\n registeredBusinessType\n );\n var characterRangeRegex = getBusinessNameCharacterRangeForScripts(\n nameValidations,\n getBusinessNameSupportedScripts(\n businessType,\n nameValidations.supportedScripts\n )\n );\n if (characterRangeRegex) {\n characterRangeRegex = new RegExp(\"^(\" + characterRangeRegex + \")*?$\");\n if (!characterRangeRegex.test(bName)) {\n var codePoint = basic.invalidCodePointFromString(\n bName,\n characterRangeRegex\n );\n if (codePoint !== undefined) {\n errors.push({\n name: \"NAME_SCRIPT_VALIDATION_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_SCRIPT_VALIDATION_ERROR,\n {\n codePoint: codePoint\n }\n ),\n detail: \"businessName\"\n });\n }\n return errors.length ? { errors: errors } : {};\n }\n }\n var errorMap = {};\n var scripts = getBusinessNameScripts(bName, nameValidations, businessType);\n for (var index = 0; index < scripts.length; index++) {\n var scriptBasedRegexes = businessNameValidations[scripts[index]];\n errorMap = getPunctuationNameError(\n basic.objectGet(scriptBasedRegexes, [\n \"punctuation\",\n \"pattern\",\n businessNameKey\n ]),\n bName,\n \"businessName\",\n errorMap\n );\n errorMap = getOffensiveNameError(\n basic.objectGet(scriptBasedRegexes, [\n \"offensive\",\n \"pattern\",\n businessNameKey\n ]),\n bName,\n \"businessName\",\n errorMap\n );\n var numberRegex = basic.objectGet(scriptBasedRegexes, [\n \"numberRange\",\n \"pattern\",\n businessNameKey\n ]);\n if (numberRegex) {\n numberRegex = new RegExp(\"^(\" + numberRegex + \")*?$\", \"i\");\n if (numberRegex.test(bName)) {\n errorMap.NAME_ALL_NUMBER_ERROR = {\n name: \"NAME_ALL_NUMBER_ERROR\",\n message: basic.formatMessage(messages.errors.NAME_ALL_NUMBER_ERROR, {\n pattern: bName\n }),\n detail: \"businessName\"\n };\n errorMap.NAME_ALL_PUNCTUATION_ERROR = {\n name: \"NAME_ALL_PUNCTUATION_ERROR\",\n message: basic.formatMessage(\n messages.errors.BUSINESS_NAME_ALL_PUNCTUATION_ERROR,\n {\n pattern: bName\n }\n ),\n detail: \"businessName\"\n };\n }\n }\n var restrictedNameRegex = basic.objectGet(scriptBasedRegexes, [\n \"restrictedBusinessNameRange\",\n \"pattern\",\n businessNameKey\n ]);\n if (restrictedNameRegex) {\n restrictedNameRegex = new RegExp(\"^(\" + restrictedNameRegex + \")$\", \"i\");\n if (restrictedNameRegex.test(bName)) {\n errorMap.NAME_ALL_RESTRICTED_ERROR = {\n name: \"NAME_ALL_RESTRICTED_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_ALL_RESTRICTED_ERROR,\n {\n pattern: bName\n }\n ),\n detail: \"businessName\"\n };\n }\n }\n // INVALID_ALL_REGISTERED_ACCOUNT\n var registeredNameValidation = basic.objectGet(scriptBasedRegexes, [\n \"registeredBusinessNameRange\",\n \"pattern\",\n registeredBusinessTypeKey\n ]);\n if (registeredNameValidation) {\n registeredNameValidation = new RegExp(registeredNameValidation, \"i\");\n if (registeredNameValidation.test(bName)) {\n var registeredNameValidationResult = registeredNameValidation.exec(\n bName\n );\n errorMap.NAME_ALL_REGISTERED_ACCOUNT_ERROR = {\n name: \"NAME_ALL_REGISTERED_ACCOUNT_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_ALL_REGISTERED_ACCOUNT_ERROR,\n {\n pattern: registeredNameValidationResult[1]\n }\n ),\n detail: \"businessName\"\n };\n }\n }\n }\n Object.keys(errorMap).forEach(function(key) {\n errors.push(errorMap[key]);\n });\n return errors.length ? { errors: errors } : {};\n}\n\n/**\n * The core formatAddress function, i.e., the full implementation should be in this function\n * except for environment dependent variables, which are passed via *dependencies* parameter.\n * @param {Object} name See README for details.\n * @param {Object} nameField See README for details.\n * @param {Array} scripts name's script\n * @param {Object} nameValidations nameValidationsMetadata.\n * @returns See README for details.\n * @example See README for details.\n */\nfunction validateField(name, nameField, nameValidations, scripts) {\n var errorMap = {};\n if (name[nameField]) {\n // Currently, punctuation and keyboard banging are same in all the\n // scripts and that is why we can take any script to fetch regex.\n // Once we have script specific regex then we need to execute punctuation\n // and keyboard banging over all the scripts.\n for (var index = 0; index < scripts.length; index++) {\n var script = scripts[index];\n var scriptBasedRegexes = nameValidations.scriptValidations[script];\n if (isNameInValidList(name, nameField, scriptBasedRegexes)) {\n return [];\n }\n // Run all the validations on the name[nameField]\n validatePunctuation(name, nameField, scriptBasedRegexes, errorMap);\n validateRepetition(name, nameField, nameValidations, errorMap);\n validateHonorifics(name, nameField, nameValidations, errorMap);\n validateBoundaryValidation(name, nameField, nameValidations, errorMap);\n validateKeyboardBanging(name, nameField, scriptBasedRegexes, errorMap);\n validateSingleCharacter(name, nameField, nameValidations, errorMap);\n validateNonVowel(\n name,\n nameField,\n scriptBasedRegexes,\n nameValidations,\n errorMap\n );\n validateOffensiveName(name, nameField, scriptBasedRegexes, errorMap);\n }\n }\n var errors = [];\n Object.keys(errorMap).forEach(function(key) {\n errors.push(errorMap[key]);\n });\n return errors;\n}\n\nfunction getOffensiveNameError(offensiveNameRegex, value, detail, errorMap) {\n if (offensiveNameRegex) {\n offensiveNameRegex = new RegExp(\".*?\" + offensiveNameRegex + \".*?\", \"i\");\n if (offensiveNameRegex.test(value)) {\n errorMap.NAME_INVALID_PATTERN_ERROR_OFFENSIVE = {\n name: \"NAME_INVALID_PATTERN_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_INVALID_PATTERN_ERROR,\n {\n negativePaternName: \"offensive name\"\n }\n ),\n detail: detail\n };\n }\n }\n return errorMap;\n}\n\nfunction validateOffensiveName(name, nameField, scriptBasedRegexes, errorMap) {\n if (\n !Object.keys(scriptBasedRegexes.offensive.pattern).includes(nameField) ||\n !name[nameField]\n ) {\n return errorMap;\n }\n return getOffensiveNameError(\n scriptBasedRegexes.offensive.pattern[nameField],\n name[nameField],\n nameField,\n errorMap\n );\n}\n\nfunction isNameInValidList(name, nameField, scriptBasedRegexes) {\n if (\n !Object.keys(scriptBasedRegexes.validList.pattern).includes(nameField) ||\n !name[nameField]\n ) {\n return false;\n }\n var validListRegex = scriptBasedRegexes.validList.pattern[nameField];\n if (validListRegex) {\n validListRegex = new RegExp(\"^(\" + validListRegex + \")$\", \"i\");\n if (validListRegex.test(name[nameField])) {\n return true;\n }\n }\n return false;\n}\n\nfunction isInitialName(name, nameField, scriptBasedRegexes) {\n if (\n !Object.keys(scriptBasedRegexes.initialsRange.pattern).includes(\n nameField\n ) ||\n !name[nameField]\n ) {\n return false;\n }\n var initialsRangeRegex = scriptBasedRegexes.initialsRange.pattern[nameField];\n if (initialsRangeRegex) {\n initialsRangeRegex = new RegExp(\"^(\" + initialsRangeRegex + \")$\", \"i\");\n if (initialsRangeRegex.test(name[nameField])) {\n return true;\n }\n }\n return false;\n}\n\nfunction isCharacterRangeMatch(characterRange, name) {\n var isMatch = true;\n var uniqueCharArr = findUniqueElementArray(getSymbolArray(name));\n for (var index = 0; index < uniqueCharArr.length; index = index + 1) {\n if (!characterRange.test(uniqueCharArr[index])) {\n isMatch = false;\n break;\n }\n }\n return isMatch;\n}\n\n/**\n * Identifies most likely script used in name.\n * If all the name's field don't match to a single script\n * then default script would be returned.\n *\n * @param {Object} nameValidations\n * @param {Object} name\n */\nfunction getNameScript(nameValidations, name) {\n var characterRangeRegex;\n var nameConcat = nameFields.reduce(function(nameConcat, item) {\n return nameConcat + (name[item] || \"\");\n }, \"\");\n var scripts = [];\n Object.keys(nameValidations.scriptValidations).forEach(function(\n currentScript\n ) {\n var scriptValidations = nameValidations.scriptValidations[currentScript];\n characterRangeRegex = scriptValidations.characterRange;\n if (characterRangeRegex) {\n characterRangeRegex = new RegExp(\"^(\" + characterRangeRegex + \")$\");\n if (isCharacterRangeMatch(characterRangeRegex, nameConcat)) {\n scripts.push(currentScript);\n }\n }\n });\n return scripts;\n}\n\n/**\n * Gets scripts supported based on Nationality.\n *\n * @param {Object} nationality\n * @param {Object} supportedScriptsByCountry\n * Example:\n * For country = JP, supportedScriptsByCountry is fetched from supportedScriptsByCountry.json metadata\n * supportedScriptsByCountry = {\"DEFAULT\":[\"Latn\",\"Jpan\"],\"INTERNATIONAL\":[\"Latn\"],\"JP\":[\"Latn\",\"Jpan\"]}\n * 1. nationality = null/undefined\n * nationalityScripts = supportedScriptsByCountry.DEFAULT = [\"Latn\",\"Jpan\"]\n * 2. nationality = \"JP\" (i.e. a key in supportedScriptsByCountry)\n * nationalityScripts = supportedScriptsByCountry[\"JP\"] = [\"Latn\",\"Jpan\"]\n * 3. nationality = \"RU\"/\"\"/\"XX\" (i.e. not a key in supportedScriptsByCountry)\n * nationalityScripts = supportedScriptsByCountry.INTERNATIONAL = [\"Latn\"]\n * Note: If supportedScriptsByCountry.INTERNATIONAL is not present nationalityScripts will be null.\n * In this case, nationality validation won't happen later in the code.\n */\nfunction getNationalityScripts(nationality, supportedScriptsByCountry) {\n var supportedScripts = supportedScriptsByCountry.personal.nationality;\n var nationalityScripts =\n nationality != null\n ? supportedScripts[nationality] ||\n supportedScripts.INTERNATIONAL ||\n supportedScripts.DEFAULT\n : supportedScripts.DEFAULT;\n return nationalityScripts;\n}\n/**\n * The core formatAddress function, i.e., the full implementation should be in this function\n * except for environment dependent variables, which are passed via *dependencies* parameter.\n * @param {Object} name See README for details.\n * @param {Object} nameMeta See README for details.\n * @param {Object} nameValidations Environment dependencies variables (Node.js vs client).\n * @returns See README for details.\n * @example See README for details.\n */\nfunction validateName(name, nameMeta, nameValidations, nameField, nationality) {\n var filterFields = [];\n if (nameField) {\n // errors = validateField(name, nameField, nameMeta, nameValidations);\n // return errors.length ? { errors: errors } : {};\n filterFields.push(nameField);\n } else {\n filterFields = nameFields;\n }\n var requiredFieldErrors = validateRequiredField(name, nameMeta);\n var scriptErrors = validateScript(name, nationality, nameValidations);\n if (scriptErrors.length) {\n scriptErrors = scriptErrors.concat(requiredFieldErrors);\n scriptErrors = filterErrors(scriptErrors, filterFields);\n return scriptErrors.length ? { errors: scriptErrors } : {};\n }\n var scripts = getNameScript(nameValidations, name);\n var errors = filterFields\n // .filter(nameField => {\n // return name[nameField];\n // })\n .reduce(function(errors, field) {\n return errors.concat(\n validateField(name, field, nameValidations, scripts)\n );\n }, []);\n errors = errors.concat(requiredFieldErrors);\n errors = errors.length ? filterErrors(errors, filterFields) : errors;\n return errors.length ? { errors: errors } : {};\n}\n\nfunction filterErrors(errors, fields) {\n return errors.filter(function(error) {\n return fields.indexOf(error.detail) !== -1;\n });\n}\n\nfunction getErrorMessagesForFields(fields, errorCode, errorMessage) {\n var errors = [];\n fields.forEach(function(field) {\n errors.push({\n name: errorCode,\n message: errorMessage,\n detail: field\n });\n });\n return errors;\n}\n\nfunction validateRequiredField(name, nameMeta) {\n var errors = [];\n if (nameMeta && nameMeta.layout) {\n nameFields.forEach(function(nameField) {\n // for (var layoutEntry of nameMeta.layout) {\n var missingField = nameMeta.layout.filter(function(layoutEntry) {\n if (\n layoutEntry.$ === nameField &&\n layoutEntry.required &&\n !name[nameField]\n ) {\n return layoutEntry;\n }\n });\n if (missingField && missingField.length > 0) {\n errors.push({\n name: \"NAME_REQUIRED_FIELD_MISSING\",\n message: messages.errors.NAME_REQUIRED_FIELD_MISSING,\n detail: nameField\n });\n }\n });\n }\n return errors;\n}\n\nfunction validateScript(name, nationality, nameValidations) {\n var nameConcat = nameFields.reduce(function(nameConcat, item) {\n return nameConcat + (name[item] || \"\");\n }, \"\");\n var fields = [];\n nameFields.forEach(function(field) {\n if (name[field] && name[field] !== \"\") {\n fields.push(field);\n }\n });\n var validRangeForCountryRegex = nameValidations.validRegExString;\n if (validRangeForCountryRegex) {\n validRangeForCountryRegex = new RegExp(\n \"^(\" + validRangeForCountryRegex + \")$\"\n );\n // Checking NAME_SCRIPT_VALIDATION_ERROR\n if (!isCharacterRangeMatch(validRangeForCountryRegex, nameConcat)) {\n var errors = [];\n fields.forEach(function(field) {\n var codePoint = basic.invalidCodePointFromString(\n name[field],\n validRangeForCountryRegex\n );\n if (codePoint !== undefined) {\n errors.push({\n name: \"NAME_SCRIPT_VALIDATION_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_SCRIPT_VALIDATION_ERROR,\n {\n codePoint: codePoint\n }\n ),\n detail: field\n });\n }\n });\n return errors;\n }\n // Checking NAME_MIXED_SCRIPT_VALIDATION_ERROR\n var scripts = getNameScript(nameValidations, name);\n if (scripts.length === 0) {\n return getErrorMessagesForFields(\n fields,\n \"NAME_MIXED_SCRIPT_VALIDATION_ERROR\",\n messages.errors.NAME_MIXED_SCRIPT_VALIDATION_ERROR\n );\n }\n // Checking NAME_NATIONALITY_SCRIPT_VALIDATION_ERROR\n var nationalityScripts = getNationalityScripts(\n nationality,\n nameValidations.supportedScripts\n );\n var isNationalityValid = false;\n for (var index = 0; index < scripts.length; index++) {\n if (nationalityScripts.indexOf(scripts[index]) !== -1) {\n isNationalityValid = true;\n break;\n }\n }\n if (!isNationalityValid) {\n return getErrorMessagesForFields(\n fields,\n \"NAME_NATIONALITY_SCRIPT_VALIDATION_ERROR\",\n basic.formatMessage(\n messages.errors.NAME_NATIONALITY_SCRIPT_VALIDATION_ERROR,\n {\n pattern: scripts.toString()\n }\n )\n );\n }\n }\n return [];\n}\n\nfunction getPunctuationNameError(punctuationRegex, value, detail, errorMap) {\n if (punctuationRegex) {\n punctuationRegex = new RegExp(\"^(\" + punctuationRegex + \")*?$\", \"i\");\n if (punctuationRegex.test(value)) {\n errorMap.NAME_ALL_PUNCTUATION_ERROR = {\n name: \"NAME_ALL_PUNCTUATION_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_ALL_PUNCTUATION_ERROR,\n {\n pattern: value\n }\n ),\n detail: detail\n };\n }\n }\n return errorMap;\n}\n/**@private\n * Validate punctuation\n */\nfunction validatePunctuation(name, nameField, scriptBasedRegexes, errorMap) {\n if (\n !Object.keys(scriptBasedRegexes.punctuation.pattern).includes(nameField) ||\n !name[nameField]\n ) {\n return errorMap;\n }\n return getPunctuationNameError(\n scriptBasedRegexes.punctuation.pattern[nameField],\n name[nameField],\n nameField,\n errorMap\n );\n}\n/** @private\n * Validate Repetition\n */\nfunction validateRepetition(name, nameField, nameValidations, errorMap) {\n if (\n !Object.keys(nameValidations.repetition.pattern).includes(nameField) ||\n !name[nameField]\n ) {\n return errorMap;\n }\n var repetitionRegex = nameValidations.repetition.pattern[nameField];\n if (repetitionRegex) {\n var repetitionResult;\n repetitionRegex = new RegExp(\"^\" + repetitionRegex + \"*?$\", \"i\");\n if ((repetitionResult = repetitionRegex.exec(name[nameField])) !== null) {\n errorMap.NAME_CHARACTER_REPETITION_ERROR = {\n name: \"NAME_CHARACTER_REPETITION_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_CHARACTER_REPETITION_ERROR,\n {\n /*\n * if name = \"hllllow\" then repetitionResult[1] = undefined and repetitionResult[2] = \"l\"\n * if name = \"haaas\" then repetitionResult[1] = \"a\"\n */\n pattern:\n repetitionResult[1] === undefined\n ? repetitionResult[2]\n : repetitionResult[1]\n }\n ),\n detail: nameField\n };\n }\n }\n return errorMap;\n}\n/** @private\n * Validate Honorifics\n */\nfunction validateHonorifics(name, nameField, nameValidations, errorMap) {\n if (\n !Object.keys(nameValidations.honorificsVariation.pattern).includes(\n nameField\n ) ||\n !name[nameField]\n ) {\n return errorMap;\n }\n var honorificsRegex = nameValidations.honorificsVariation.pattern[\n nameField\n ].join(\"|\");\n if (honorificsRegex) {\n honorificsRegex = new RegExp(\"^(\" + honorificsRegex + \")$\", \"i\");\n if (honorificsRegex.test(name[nameField])) {\n errorMap.NAME_ALL_HONORIFICS_ERROR = {\n name: \"NAME_ALL_HONORIFICS_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_ALL_HONORIFICS_ERROR,\n {\n pattern: name[nameField]\n }\n ),\n detail: nameField\n };\n }\n }\n return errorMap;\n}\n\n/** @private\n * Validate Boundary\n */\nfunction validateBoundaryValidation(\n name,\n nameField,\n nameValidations,\n errorMap\n) {\n if (\n !Object.keys(nameValidations.boundaryValidation.pattern).includes(\n nameField\n ) ||\n !name[nameField]\n ) {\n return errorMap;\n }\n var boundaryValidationRegex =\n nameValidations.boundaryValidation.pattern[nameField];\n if (boundaryValidationRegex) {\n // We don't add ^( and )$ because the regex already has position based tokens\n boundaryValidationRegex = new RegExp(boundaryValidationRegex, \"i\");\n if (boundaryValidationRegex.test(name[nameField])) {\n var bvResult = boundaryValidationRegex.exec(name[nameField]);\n errorMap.NAME_INVALID_PATTERN_ERROR_BOUNDARY = {\n name: \"NAME_INVALID_PATTERN_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_INVALID_PATTERN_ERROR +\n \" The invalid pattern dectected is: {pattern}\",\n {\n negativePaternName: \"boundary validation\",\n pattern: bvResult[0]\n }\n ),\n detail: nameField\n };\n }\n }\n return errorMap;\n}\n\n/** @private\n * Validate Keyboard Banging\n */\nfunction validateKeyboardBanging(\n name,\n nameField,\n scriptBasedRegexes,\n errorMap\n) {\n if (\n !Object.keys(scriptBasedRegexes.keyboardBanging.pattern).includes(\n nameField\n ) ||\n !name[nameField]\n ) {\n return errorMap;\n }\n var keyboardBangingRegex =\n scriptBasedRegexes.keyboardBanging.pattern[nameField];\n var kbResult;\n if (keyboardBangingRegex) {\n keyboardBangingRegex = new RegExp(\n \".*?(\" + keyboardBangingRegex + \").*?\",\n \"i\"\n );\n if (keyboardBangingRegex.test(name[nameField])) {\n kbResult = keyboardBangingRegex.exec(name[nameField]);\n errorMap.NAME_KEYBOARD_BANGING_ERROR = {\n name: \"NAME_KEYBOARD_BANGING_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_KEYBOARD_BANGING_ERROR,\n {\n pattern: kbResult[1]\n }\n ),\n detail: nameField\n };\n }\n }\n return errorMap;\n}\n/** @private\n * Validate SingleCharacter\n */\nfunction validateSingleCharacter(name, nameField, nameValidations, errorMap) {\n if (\n !nameValidations.singleCharacterValidation.pattern ||\n !Object.keys(nameValidations.singleCharacterValidation.pattern).includes(\n nameField\n ) ||\n !name[nameField]\n ) {\n return errorMap;\n }\n var singleCharacterRegexPat = nameValidations.singleCharacterValidation.pattern[\n nameField\n ].join(\"|\");\n if (singleCharacterRegexPat) {\n var singleCharacterRegex = new RegExp(singleCharacterRegexPat, \"i\");\n if (singleCharacterRegex.test(name[nameField])) {\n errorMap.NAME_SINGLE_CHARACTER_ERROR = {\n name: \"NAME_SINGLE_CHARACTER_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_SINGLE_CHARACTER_ERROR,\n {\n pattern: name[nameField]\n }\n ),\n detail: nameField\n };\n }\n }\n return errorMap;\n}\nfunction validateNonVowel(\n name,\n nameField,\n scriptBasedRegexes,\n nameValidations,\n errorMap\n) {\n if (\n !Object.keys(scriptBasedRegexes.nonVowel.pattern).includes(nameField) ||\n !name[nameField]\n ) {\n return errorMap;\n }\n var nonVowelRegex = scriptBasedRegexes.nonVowel.pattern[nameField];\n var singleCharacterRegex = nameValidations.singleCharacterRegex.join(\"|\");\n var honorificsRegex = nameValidations.honorificsRegex.join(\"|\");\n var boundaryRegex = nameValidations.boundaryRegex;\n var punctuationRegex = scriptBasedRegexes.punctuationRegex;\n if (\n singleCharacterRegex &&\n nonVowelRegex &&\n honorificsRegex &&\n punctuationRegex &&\n boundaryRegex\n ) {\n singleCharacterRegex = new RegExp(singleCharacterRegex, \"i\");\n nonVowelRegex = new RegExp(\"^(\" + nonVowelRegex + \")$\", \"i\");\n honorificsRegex = new RegExp(\"^(\" + honorificsRegex + \")$\", \"i\");\n punctuationRegex = new RegExp(\"^(\" + punctuationRegex + \")*$\", \"i\");\n boundaryRegex = new RegExp(boundaryRegex, \"i\"); // We don't add ^( and )$ because the regex already has position based tokens\n if (\n !singleCharacterRegex.test(name[nameField]) &&\n !honorificsRegex.test(name[nameField]) &&\n !boundaryRegex.test(name[nameField]) &&\n !punctuationRegex.test(name[nameField]) &&\n !isInitialName(name, nameField, scriptBasedRegexes) &&\n nonVowelRegex.test(name[nameField])\n ) {\n errorMap.NAME_INVALID_PATTERN_ERROR_NON_VOWEL = {\n name: \"NAME_INVALID_PATTERN_ERROR\",\n message: basic.formatMessage(\n messages.errors.NAME_INVALID_PATTERN_ERROR,\n {\n negativePaternName: \"non-vowel\"\n }\n ),\n detail: nameField\n };\n }\n }\n return errorMap;\n}\n\nfunction transformName(name, options, transformTypes) {\n var transformedName = JSON.parse(JSON.stringify(name)); //clone object\n var delimiter = \"\\u0020\";\n var transformValues = Object.keys(transformTypes).map(function(\n transformType\n ) {\n return transformTypes[transformType];\n });\n assertType(options, \"options\", [\"plain object\"]);\n assertTransformType(options.fromType, \"options.fromType\", transformValues);\n assertTransformType(options.toType, \"options.toType\", transformValues);\n\n if (options.fromType === options.toType) {\n // No need to perform tranformation\n return transformedName;\n }\n if (options.fromType === transformTypes.ONE_SURNAME) {\n if (transformedName.surname) {\n var re = new RegExp(delimiter + \"{2}(.+)\", \"g\");\n var surnames = transformedName.surname.trim().split(re); //splitting by first occurrence of double space\n transformedName.surname = surnames[0] ? surnames[0].trim() : \"\";\n transformedName.secondSurname = surnames[1]\n ? replaceDoubleSpaces(delimiter, surnames[1])\n : \"\";\n } else if (transformedName.secondSurname) {\n //only secondSurname is present in one2two transform\n transformedName.surname = \"\";\n transformedName.secondSurname = replaceDoubleSpaces(\n delimiter,\n transformedName.secondSurname\n );\n }\n } else if (options.fromType === transformTypes.TWO_SURNAMES) {\n if (transformedName.surname) {\n transformedName.surname = replaceDoubleSpaces(\n delimiter,\n transformedName.surname\n );\n if (transformedName.secondSurname) {\n transformedName.secondSurname = replaceDoubleSpaces(\n delimiter,\n transformedName.secondSurname\n );\n transformedName.surname =\n transformedName.surname +\n delimiter +\n delimiter +\n transformedName.secondSurname.trim();\n delete transformedName.secondSurname;\n }\n } else if (transformedName.secondSurname) {\n //only secondSurname is present in two2one transform\n transformedName.surname = replaceDoubleSpaces(\n delimiter,\n transformedName.secondSurname\n ); //populate ouptput.surname with input.secondSurname\n delete transformedName.secondSurname;\n }\n }\n return transformedName;\n}\n\nfunction replaceDoubleSpaces(delimiter, namePart) {\n var replaceRe = new RegExp(delimiter + \"{2,}\", \"g\");\n return namePart.trim().replace(replaceRe, delimiter);\n}\n\nfunction assertTransformType(transformType, optionType, transformValues) {\n assertRange(\n transformType,\n transformValues,\n \"Invalid value for \" + optionType + \": {transformType}\",\n {\n transformType: transformType\n }\n );\n}\n\nmodule.exports = {\n validateName: validateName,\n transformName: transformName,\n validateBusinessName: validateBusinessName\n};\n","var baseIteratee = require('./_baseIteratee'),\n isArrayLike = require('./isArrayLike'),\n keys = require('./keys');\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nmodule.exports = createFind;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","\"use strict\";\n\nvar assertion = require(\"./utils/assertion\");\n\n// Load Globalize main module.\nvar Globalize = require(\"globalize/dist/globalize\");\n\n// Extend Globalize with number and currency modules.\nrequire(\"globalize/dist/globalize/number\");\n\nvar basic = require(\"./utils/basic\");\nvar objectAssign = require(\"object-assign\");\n\nvar assert = assertion.assert;\nvar assertMetadata = assertion.assertMetadata;\nvar assertRange = assertion.assertRange;\nvar assertType = assertion.assertType;\nvar getValueOrDefault = basic.getValueOrDefault;\n\n// Load functions shared with Node\nvar numberHelpers = require(\"./utils/numberHelpers\");\nvar assertCanonicalNumberType = numberHelpers.assertCanonicalNumberType;\nvar assertLocalizedNumberType = numberHelpers.assertLocalizedNumberType;\nvar setFractionDigits = numberHelpers.setFractionDigits;\n\nfunction assertRangeCurrencyCode(handler, parameter) {\n assertRange(\n parameter,\n handler.metadata.cldrCurrencies,\n 'The ISO currency code `\"{parameterValue}\"` is invalid',\n { parameterValue: parameter }\n );\n}\n\nvar NumberHandler = function() {};\n\nvar optionsPrototype = {\n parts: function() {\n this.outputType = \"parts\";\n return this;\n },\n currencyDisplay: function(currencyDisplay) {\n this.currencyDisplay = currencyDisplay;\n return this;\n }\n};\n\nObject.defineProperty(NumberHandler.prototype, \"NUMBER_FORMAT\", {\n get: function() {\n return {\n style: \"decimal\",\n maximumFractionDigits: 9,\n minimumFractionDigits: 0\n };\n },\n enumerable: true\n});\nvar NUMBER_FORMAT = NumberHandler.prototype.NUMBER_FORMAT;\n\nObject.defineProperty(NumberHandler.prototype, \"NUMBER_FORMAT_PERCENT\", {\n get: function() {\n return {\n style: \"percent\",\n maximumFractionDigits: 2,\n minimumFractionDigits: 0\n };\n },\n enumerable: true\n});\n\n// define currency presets on handler\nvar CURRENCY_PRESETS = {\n CURRENCY_FORMAT: \"symbol\",\n CURRENCY_FORMAT_ISOCURRENCY: \"code\",\n CURRENCY_FORMAT_SYMBOLISOCURRENCY: \"international\"\n};\nObject.keys(CURRENCY_PRESETS).forEach(function(presetName) {\n Object.defineProperty(NumberHandler.prototype, presetName, {\n get: function() {\n var presetValue = CURRENCY_PRESETS[presetName];\n return Object.create(optionsPrototype).currencyDisplay(presetValue);\n },\n enumerable: true\n });\n});\n// get array of values for assertRange\nvar CURRENCY_PRESET_VALUES = Object.keys(CURRENCY_PRESETS).map(function(\n presetName\n) {\n return CURRENCY_PRESETS[presetName];\n});\n\n/**\n * formatNumber\n */\nObject.defineProperty(NumberHandler.prototype, \"formatNumber\", {\n value: function formatNumber(number, options) {\n options = getValueOrDefault(options, NUMBER_FORMAT);\n number = assertCanonicalNumberType(number, \"number\");\n assertType(options, \"options\", [\"plain object\"]);\n assert(\n options.currencyDisplay === undefined,\n \"Invalid `options` property `currencyDisplay`. Use `.formatCurrency()` instead\"\n );\n options = objectAssign({}, options);\n setFractionDigits(options);\n return this.globalize.formatNumber(number, options);\n },\n enumerable: true\n});\n\n/**\n * normalizeNumber\n */\nObject.defineProperty(NumberHandler.prototype, \"normalizeNumber\", {\n value: function normalizeNumber(number, options) {\n options = getValueOrDefault(options, NUMBER_FORMAT);\n assertLocalizedNumberType(number, \"number\");\n assertType(options, \"options\", [\"plain object\"]);\n if (typeof number === \"number\") {\n return number;\n }\n return this.globalize.parseNumber(number, options);\n },\n enumerable: true\n});\n\nfunction numberStyles(handler) {\n return handler.metadata.cldrNumbers[\"symbols-numberSystem-latn\"];\n}\n\nfunction symbolForCurrency(handler, currencyCode) {\n var currencyMeta = handler.metadata.cldrCurrencies[currencyCode];\n return currencyMeta && currencyMeta.symbol;\n}\n\nfunction currencyStyles(handler, currency) {\n var newCurrencyStyles = {},\n supportedStyles = [\n \"international\",\n \"code\",\n \"plural\",\n \"separator\",\n \"symbol\"\n ];\n supportedStyles.forEach(function(style) {\n newCurrencyStyles[style] = currencyPatternByStyle(\n handler,\n { currencyDisplay: style },\n currency\n );\n });\n return newCurrencyStyles;\n}\n\nfunction currencyPatternByStyle(handler, options, currency) {\n var metadata = handler.metadata,\n currencyStyles = metadata.currencyStyles,\n didCurrencyLevelOverride = false; // set this to true if the style was overriden at the currency level\n\n if (!options) {\n options = { currencyDisplay: \"symbol\" };\n }\n\n var style = options.currencyDisplay;\n var pattern = currencyStyles[style];\n\n // Check if there's an override by currency (e.g. TRY) for this particular style and apply it\n if (\n currencyStyles.currency_override &&\n currencyStyles.currency_override[currency] &&\n currencyStyles.currency_override[currency][style]\n ) {\n pattern = currencyStyles.currency_override[currency][style];\n didCurrencyLevelOverride = true; // set this flag so fuzzyMatch will be skipped\n }\n\n // if there was no override at the currency level\n // and if this is the international style\n // then apply fuzzyMatch\n // basically: only apply fuzzyMatch to the vanilla international style\n if (!didCurrencyLevelOverride && style === \"international\" && currency) {\n var currencySymbol = symbolForCurrency(handler, currency);\n if (!currencySymbol) {\n return;\n }\n if (currencySymbol.length > 1) {\n // call fuzzyMatch passing the currency Code MXN and currency Symbol $MX\n var fuzzy = fuzzyMatch(currency, currencySymbol);\n if (fuzzy >= 66) {\n pattern = pattern.replace(/¤\\s*/g, \"\");\n }\n }\n }\n\n return pattern;\n}\n\n/***\n * @function\n * @name fuzzyMatch\n * @input it takes 2 strings valueA and valueB\n * @returns {number} the percentage of how similar are both\n */\nfunction fuzzyMatch(svalueA, svalueB) {\n if (svalueA === svalueB) {\n return 100;\n } else {\n var valueA = svalueA.split(\"\"),\n valueB = svalueB.split(\"\"),\n equivalency = 0;\n for (var i = 0; i < valueA.length; i++) {\n if (valueB.indexOf(valueA[i]) !== -1) {\n var position = valueB.indexOf(valueA[i]);\n valueB.splice(position, 1);\n equivalency++;\n }\n }\n var weight = equivalency / valueA.length;\n return weight * 100;\n }\n}\n\nfunction digitsForCurrency(handler, currencyCode) {\n return (\n handler.metadata.currencyInfo[currencyCode] &&\n handler.metadata.currencyInfo[currencyCode].digits\n );\n}\n\nObject.defineProperty(NumberHandler.prototype, \"formatCurrency\", {\n value: function formatCurrency(currency, options) {\n var currencyCode, currencyValue;\n options = getValueOrDefault(options, this.CURRENCY_FORMAT);\n\n assertType(currency, \"currency\", [\"plain object\"]);\n assertType(currency.currency, \"currency.currency\", [\"string\"]);\n currencyValue = assertCanonicalNumberType(currency.value, \"currency.value\");\n assertRangeCurrencyCode(this, currency.currency);\n\n assertType(options, \"options\", [\"plain object\"]);\n assertType(options.currencyDisplay, \"options.currencyDisplay\", [\"string\"]);\n assertRange(\n options.currencyDisplay,\n CURRENCY_PRESET_VALUES,\n 'Invalid `options.currencyDisplay`: `\"{parameterValue}\"`',\n { parameterValue: options.currencyDisplay }\n );\n\n currencyCode = currency.currency;\n options = objectAssign({}, options);\n var currencyDigits = digitsForCurrency(this, currencyCode);\n setFractionDigits(options, currencyDigits);\n\n var localeNumberStyles = numberStyles(this),\n localeCurrencyStyles = currencyStyles(this, currencyCode),\n symbol = symbolForCurrency(this, currencyCode),\n formattedCurrency = \"\",\n pattern = localeCurrencyStyles[options.currencyDisplay].split(\";\")[0];\n if (options.outputType === \"parts\") {\n formattedCurrency = [];\n }\n\n var formatBinder = function(key, value) {\n if (options.outputType === \"parts\") {\n var parts = { type: key, value: value };\n formattedCurrency.push(parts);\n } else {\n formattedCurrency += value;\n }\n };\n\n if (currencyValue < 0) {\n pattern = localeCurrencyStyles[options.currencyDisplay].split(\";\")[1];\n currencyValue = currencyValue * -1;\n }\n var numberOptions = NumberHandler.prototype.NUMBER_FORMAT;\n numberOptions.maximumFractionDigits = options.maximumFractionDigits;\n numberOptions.minimumFractionDigits = options.minimumFractionDigits;\n var patternElements = {\n \"-\": { key: \"sign\", value: localeNumberStyles.minusSign },\n \"¤\": { key: \"symbol\", value: symbol },\n \"#\": {\n key: \"value\",\n value: this.formatNumber(currencyValue, numberOptions)\n },\n C: { key: \"code\", value: currencyCode },\n \"\\u00A0\": { key: \"separator\", value: localeCurrencyStyles.separator }\n };\n\n for (var i = 0; i < pattern.length; i++) {\n var part = patternElements[pattern.charAt(i)] || {\n key: \"literal\",\n value: pattern.charAt(i)\n };\n formatBinder(part.key, part.value);\n }\n\n return formattedCurrency;\n },\n enumerable: true\n});\n\nfunction assertNumberMeta(metadata) {\n assertType(metadata, \"metadata\", [\"plain object\"]);\n assertMetadata(metadata.cldr);\n assertMetadata(metadata.cldr.main);\n assertMetadata(metadata.cldr.supplemental);\n assertMetadata(metadata.griffin);\n assertMetadata(metadata.griffin.number);\n\n var griffinNumberMeta = metadata.griffin.number;\n assertMetadata(griffinNumberMeta.country, [\"string\"]);\n assertMetadata(griffinNumberMeta.currencyInfo);\n assertMetadata(griffinNumberMeta.currencyStyles);\n\n // We assume the only key in 'main' is the locale.\n var cldrLocale = Object.keys(metadata.cldr.main)[0];\n assertMetadata(cldrLocale, [\"string\"]);\n var cldrMain = metadata.cldr.main[cldrLocale];\n assertMetadata(cldrMain);\n var cldrNumbers = cldrMain.numbers;\n assertMetadata(cldrNumbers);\n assertMetadata(cldrNumbers[\"symbols-numberSystem-latn\"]);\n var cldrCurrencies = cldrNumbers.currencies;\n assertMetadata(cldrCurrencies);\n // assertMetadata(cldrCurrencies.styles); // now in griffin section\n}\n\nmodule.exports = {\n // common createHandler code can be factored out and put in core\n createHandler: function createHandler(metadata) {\n // TODO validate metadata based on schema.\n assertNumberMeta(metadata);\n\n var handler = new NumberHandler();\n\n // We assume the only key in 'main' is the locale.\n var cldrLocale = Object.keys(metadata.cldr.main)[0];\n var cldrMain = metadata.cldr.main[cldrLocale];\n var cldrNumbers = cldrMain.numbers;\n var cldrCurrencies = cldrNumbers.currencies;\n\n var griffinNumberMeta = metadata.griffin.number;\n\n // store particular parts of client metadata for use in the module\n handler.metadata = {\n country: griffinNumberMeta.country,\n currencyStyles: griffinNumberMeta.currencyStyles,\n currencyInfo: griffinNumberMeta.currencyInfo, // includes digits information\n cldrNumbers: cldrNumbers,\n cldrCurrencies: cldrCurrencies\n };\n\n // pass the cldr portion to Globalize\n Globalize.load(metadata.cldr);\n handler.globalize = Globalize(cldrLocale);\n\n return handler;\n }\n};\n","/**\n * CLDR JavaScript Library v0.5.4\n * http://jquery.com/\n *\n * Copyright 2013 Rafael Xavier de Souza\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2020-10-22T15:56Z\n */\n/*!\n * CLDR JavaScript Library v0.5.4 2020-10-22T15:56Z MIT license © Rafael Xavier\n * http://git.io/h4lmVg\n */\n(function( factory ) {\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD.\n\t\tdefine( [ \"../cldr\" ], factory );\n\t} else if ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// Node. CommonJS.\n\t\tmodule.exports = factory( require( \"../cldr\" ) );\n\t} else {\n\t\t// Global\n\t\tfactory( Cldr );\n\t}\n\n}(function( Cldr ) {\n\n\t// Build optimization hack to avoid duplicating functions across modules.\n\tvar pathNormalize = Cldr._pathNormalize,\n\t\tvalidatePresence = Cldr._validatePresence,\n\t\tvalidateType = Cldr._validateType;\n\n/*!\n * EventEmitter v4.2.7 - git.io/ee\n * Oliver Caldwell\n * MIT license\n * @preserve\n */\n\nvar EventEmitter;\n/* jshint ignore:start */\nEventEmitter = (function () {\n\n\n\t/**\n\t * Class for managing events.\n\t * Can be extended to provide event functionality in other classes.\n\t *\n\t * @class EventEmitter Manages event registering and emitting.\n\t */\n\tfunction EventEmitter() {}\n\n\t// Shortcuts to improve speed and size\n\tvar proto = EventEmitter.prototype;\n\tvar exports = {};\n\t\n\n\t/**\n\t * Finds the index of the listener for the event in it's storage array.\n\t *\n\t * @param {Function[]} listeners Array of listeners to search through.\n\t * @param {Function} listener Method to look for.\n\t * @return {Number} Index of the specified listener, -1 if not found\n\t * @api private\n\t */\n\tfunction indexOfListener(listeners, listener) {\n\t\tvar i = listeners.length;\n\t\twhile (i--) {\n\t\t\tif (listeners[i].listener === listener) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Alias a method while keeping the context correct, to allow for overwriting of target method.\n\t *\n\t * @param {String} name The name of the target method.\n\t * @return {Function} The aliased method\n\t * @api private\n\t */\n\tfunction alias(name) {\n\t\treturn function aliasClosure() {\n\t\t\treturn this[name].apply(this, arguments);\n\t\t};\n\t}\n\n\t/**\n\t * Returns the listener array for the specified event.\n\t * Will initialise the event object and listener arrays if required.\n\t * Will return an object if you use a regex search. The object contains keys for each matched event. So /ba[rz]/ might return an object containing bar and baz. But only if you have either defined them with defineEvent or added some listeners to them.\n\t * Each property in the object response is an array of listener functions.\n\t *\n\t * @param {String|RegExp} evt Name of the event to return the listeners from.\n\t * @return {Function[]|Object} All listener functions for the event.\n\t */\n\tproto.getListeners = function getListeners(evt) {\n\t\tvar events = this._getEvents();\n\t\tvar response;\n\t\tvar key;\n\n\t\t// Return a concatenated array of all matching events if\n\t\t// the selector is a regular expression.\n\t\tif (evt instanceof RegExp) {\n\t\t\tresponse = {};\n\t\t\tfor (key in events) {\n\t\t\t\tif (events.hasOwnProperty(key) && evt.test(key)) {\n\t\t\t\t\tresponse[key] = events[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tresponse = events[evt] || (events[evt] = []);\n\t\t}\n\n\t\treturn response;\n\t};\n\n\t/**\n\t * Takes a list of listener objects and flattens it into a list of listener functions.\n\t *\n\t * @param {Object[]} listeners Raw listener objects.\n\t * @return {Function[]} Just the listener functions.\n\t */\n\tproto.flattenListeners = function flattenListeners(listeners) {\n\t\tvar flatListeners = [];\n\t\tvar i;\n\n\t\tfor (i = 0; i < listeners.length; i += 1) {\n\t\t\tflatListeners.push(listeners[i].listener);\n\t\t}\n\n\t\treturn flatListeners;\n\t};\n\n\t/**\n\t * Fetches the requested listeners via getListeners but will always return the results inside an object. This is mainly for internal use but others may find it useful.\n\t *\n\t * @param {String|RegExp} evt Name of the event to return the listeners from.\n\t * @return {Object} All listener functions for an event in an object.\n\t */\n\tproto.getListenersAsObject = function getListenersAsObject(evt) {\n\t\tvar listeners = this.getListeners(evt);\n\t\tvar response;\n\n\t\tif (listeners instanceof Array) {\n\t\t\tresponse = {};\n\t\t\tresponse[evt] = listeners;\n\t\t}\n\n\t\treturn response || listeners;\n\t};\n\n\t/**\n\t * Adds a listener function to the specified event.\n\t * The listener will not be added if it is a duplicate.\n\t * If the listener returns true then it will be removed after it is called.\n\t * If you pass a regular expression as the event name then the listener will be added to all events that match it.\n\t *\n\t * @param {String|RegExp} evt Name of the event to attach the listener to.\n\t * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.addListener = function addListener(evt, listener) {\n\t\tvar listeners = this.getListenersAsObject(evt);\n\t\tvar listenerIsWrapped = typeof listener === 'object';\n\t\tvar key;\n\n\t\tfor (key in listeners) {\n\t\t\tif (listeners.hasOwnProperty(key) && indexOfListener(listeners[key], listener) === -1) {\n\t\t\t\tlisteners[key].push(listenerIsWrapped ? listener : {\n\t\t\t\t\tlistener: listener,\n\t\t\t\t\tonce: false\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n\t * Alias of addListener\n\t */\n\tproto.on = alias('addListener');\n\n\t/**\n\t * Semi-alias of addListener. It will add a listener that will be\n\t * automatically removed after it's first execution.\n\t *\n\t * @param {String|RegExp} evt Name of the event to attach the listener to.\n\t * @param {Function} listener Method to be called when the event is emitted. If the function returns true then it will be removed after calling.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.addOnceListener = function addOnceListener(evt, listener) {\n\t\treturn this.addListener(evt, {\n\t\t\tlistener: listener,\n\t\t\tonce: true\n\t\t});\n\t};\n\n\t/**\n\t * Alias of addOnceListener.\n\t */\n\tproto.once = alias('addOnceListener');\n\n\t/**\n\t * Defines an event name. This is required if you want to use a regex to add a listener to multiple events at once. If you don't do this then how do you expect it to know what event to add to? Should it just add to every possible match for a regex? No. That is scary and bad.\n\t * You need to tell it what event names should be matched by a regex.\n\t *\n\t * @param {String} evt Name of the event to create.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.defineEvent = function defineEvent(evt) {\n\t\tthis.getListeners(evt);\n\t\treturn this;\n\t};\n\n\t/**\n\t * Uses defineEvent to define multiple events.\n\t *\n\t * @param {String[]} evts An array of event names to define.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.defineEvents = function defineEvents(evts) {\n\t\tfor (var i = 0; i < evts.length; i += 1) {\n\t\t\tthis.defineEvent(evts[i]);\n\t\t}\n\t\treturn this;\n\t};\n\n\t/**\n\t * Removes a listener function from the specified event.\n\t * When passed a regular expression as the event name, it will remove the listener from all events that match it.\n\t *\n\t * @param {String|RegExp} evt Name of the event to remove the listener from.\n\t * @param {Function} listener Method to remove from the event.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.removeListener = function removeListener(evt, listener) {\n\t\tvar listeners = this.getListenersAsObject(evt);\n\t\tvar index;\n\t\tvar key;\n\n\t\tfor (key in listeners) {\n\t\t\tif (listeners.hasOwnProperty(key)) {\n\t\t\t\tindex = indexOfListener(listeners[key], listener);\n\n\t\t\t\tif (index !== -1) {\n\t\t\t\t\tlisteners[key].splice(index, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n\t * Alias of removeListener\n\t */\n\tproto.off = alias('removeListener');\n\n\t/**\n\t * Adds listeners in bulk using the manipulateListeners method.\n\t * If you pass an object as the second argument you can add to multiple events at once. The object should contain key value pairs of events and listeners or listener arrays. You can also pass it an event name and an array of listeners to be added.\n\t * You can also pass it a regular expression to add the array of listeners to all events that match it.\n\t * Yeah, this function does quite a bit. That's probably a bad thing.\n\t *\n\t * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add to multiple events at once.\n\t * @param {Function[]} [listeners] An optional array of listener functions to add.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.addListeners = function addListeners(evt, listeners) {\n\t\t// Pass through to manipulateListeners\n\t\treturn this.manipulateListeners(false, evt, listeners);\n\t};\n\n\t/**\n\t * Removes listeners in bulk using the manipulateListeners method.\n\t * If you pass an object as the second argument you can remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.\n\t * You can also pass it an event name and an array of listeners to be removed.\n\t * You can also pass it a regular expression to remove the listeners from all events that match it.\n\t *\n\t * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to remove from multiple events at once.\n\t * @param {Function[]} [listeners] An optional array of listener functions to remove.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.removeListeners = function removeListeners(evt, listeners) {\n\t\t// Pass through to manipulateListeners\n\t\treturn this.manipulateListeners(true, evt, listeners);\n\t};\n\n\t/**\n\t * Edits listeners in bulk. The addListeners and removeListeners methods both use this to do their job. You should really use those instead, this is a little lower level.\n\t * The first argument will determine if the listeners are removed (true) or added (false).\n\t * If you pass an object as the second argument you can add/remove from multiple events at once. The object should contain key value pairs of events and listeners or listener arrays.\n\t * You can also pass it an event name and an array of listeners to be added/removed.\n\t * You can also pass it a regular expression to manipulate the listeners of all events that match it.\n\t *\n\t * @param {Boolean} remove True if you want to remove listeners, false if you want to add.\n\t * @param {String|Object|RegExp} evt An event name if you will pass an array of listeners next. An object if you wish to add/remove from multiple events at once.\n\t * @param {Function[]} [listeners] An optional array of listener functions to add/remove.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.manipulateListeners = function manipulateListeners(remove, evt, listeners) {\n\t\tvar i;\n\t\tvar value;\n\t\tvar single = remove ? this.removeListener : this.addListener;\n\t\tvar multiple = remove ? this.removeListeners : this.addListeners;\n\n\t\t// If evt is an object then pass each of it's properties to this method\n\t\tif (typeof evt === 'object' && !(evt instanceof RegExp)) {\n\t\t\tfor (i in evt) {\n\t\t\t\tif (evt.hasOwnProperty(i) && (value = evt[i])) {\n\t\t\t\t\t// Pass the single listener straight through to the singular method\n\t\t\t\t\tif (typeof value === 'function') {\n\t\t\t\t\t\tsingle.call(this, i, value);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t// Otherwise pass back to the multiple function\n\t\t\t\t\t\tmultiple.call(this, i, value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// So evt must be a string\n\t\t\t// And listeners must be an array of listeners\n\t\t\t// Loop over it and pass each one to the multiple method\n\t\t\ti = listeners.length;\n\t\t\twhile (i--) {\n\t\t\t\tsingle.call(this, evt, listeners[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n\t * Removes all listeners from a specified event.\n\t * If you do not specify an event then all listeners will be removed.\n\t * That means every event will be emptied.\n\t * You can also pass a regex to remove all events that match it.\n\t *\n\t * @param {String|RegExp} [evt] Optional name of the event to remove all listeners for. Will remove from every event if not passed.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.removeEvent = function removeEvent(evt) {\n\t\tvar type = typeof evt;\n\t\tvar events = this._getEvents();\n\t\tvar key;\n\n\t\t// Remove different things depending on the state of evt\n\t\tif (type === 'string') {\n\t\t\t// Remove all listeners for the specified event\n\t\t\tdelete events[evt];\n\t\t}\n\t\telse if (evt instanceof RegExp) {\n\t\t\t// Remove all events matching the regex.\n\t\t\tfor (key in events) {\n\t\t\t\tif (events.hasOwnProperty(key) && evt.test(key)) {\n\t\t\t\t\tdelete events[key];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\t// Remove all listeners in all events\n\t\t\tdelete this._events;\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n\t * Alias of removeEvent.\n\t *\n\t * Added to mirror the node API.\n\t */\n\tproto.removeAllListeners = alias('removeEvent');\n\n\t/**\n\t * Emits an event of your choice.\n\t * When emitted, every listener attached to that event will be executed.\n\t * If you pass the optional argument array then those arguments will be passed to every listener upon execution.\n\t * Because it uses `apply`, your array of arguments will be passed as if you wrote them out separately.\n\t * So they will not arrive within the array on the other side, they will be separate.\n\t * You can also pass a regular expression to emit to all events that match it.\n\t *\n\t * @param {String|RegExp} evt Name of the event to emit and execute listeners for.\n\t * @param {Array} [args] Optional array of arguments to be passed to each listener.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.emitEvent = function emitEvent(evt, args) {\n\t\tvar listeners = this.getListenersAsObject(evt);\n\t\tvar listener;\n\t\tvar i;\n\t\tvar key;\n\t\tvar response;\n\n\t\tfor (key in listeners) {\n\t\t\tif (listeners.hasOwnProperty(key)) {\n\t\t\t\ti = listeners[key].length;\n\n\t\t\t\twhile (i--) {\n\t\t\t\t\t// If the listener returns true then it shall be removed from the event\n\t\t\t\t\t// The function is executed either with a basic call or an apply if there is an args array\n\t\t\t\t\tlistener = listeners[key][i];\n\n\t\t\t\t\tif (listener.once === true) {\n\t\t\t\t\t\tthis.removeListener(evt, listener.listener);\n\t\t\t\t\t}\n\n\t\t\t\t\tresponse = listener.listener.apply(this, args || []);\n\n\t\t\t\t\tif (response === this._getOnceReturnValue()) {\n\t\t\t\t\t\tthis.removeListener(evt, listener.listener);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t};\n\n\t/**\n\t * Alias of emitEvent\n\t */\n\tproto.trigger = alias('emitEvent');\n\n\t/**\n\t * Subtly different from emitEvent in that it will pass its arguments on to the listeners, as opposed to taking a single array of arguments to pass on.\n\t * As with emitEvent, you can pass a regex in place of the event name to emit to all events that match it.\n\t *\n\t * @param {String|RegExp} evt Name of the event to emit and execute listeners for.\n\t * @param {...*} Optional additional arguments to be passed to each listener.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.emit = function emit(evt) {\n\t\tvar args = Array.prototype.slice.call(arguments, 1);\n\t\treturn this.emitEvent(evt, args);\n\t};\n\n\t/**\n\t * Sets the current value to check against when executing listeners. If a\n\t * listeners return value matches the one set here then it will be removed\n\t * after execution. This value defaults to true.\n\t *\n\t * @param {*} value The new value to check for when executing listeners.\n\t * @return {Object} Current instance of EventEmitter for chaining.\n\t */\n\tproto.setOnceReturnValue = function setOnceReturnValue(value) {\n\t\tthis._onceReturnValue = value;\n\t\treturn this;\n\t};\n\n\t/**\n\t * Fetches the current value to check against when executing listeners. If\n\t * the listeners return value matches this one then it should be removed\n\t * automatically. It will return true by default.\n\t *\n\t * @return {*|Boolean} The current value to check for or the default, true.\n\t * @api private\n\t */\n\tproto._getOnceReturnValue = function _getOnceReturnValue() {\n\t\tif (this.hasOwnProperty('_onceReturnValue')) {\n\t\t\treturn this._onceReturnValue;\n\t\t}\n\t\telse {\n\t\t\treturn true;\n\t\t}\n\t};\n\n\t/**\n\t * Fetches the events object and creates one if required.\n\t *\n\t * @return {Object} The events storage object.\n\t * @api private\n\t */\n\tproto._getEvents = function _getEvents() {\n\t\treturn this._events || (this._events = {});\n\t};\n\n\t/**\n\t * Reverts the global {@link EventEmitter} to its previous value and returns a reference to this version.\n\t *\n\t * @return {Function} Non conflicting EventEmitter class.\n\t */\n\tEventEmitter.noConflict = function noConflict() {\n\t\texports.EventEmitter = originalGlobalValue;\n\t\treturn EventEmitter;\n\t};\n\n\treturn EventEmitter;\n}());\n/* jshint ignore:end */\n\n\n\n\tvar validateTypeFunction = function( value, name ) {\n\t\tvalidateType( value, name, typeof value === \"undefined\" || typeof value === \"function\", \"Function\" );\n\t};\n\n\n\n\n\tvar superGet, superInit,\n\t\tglobalEe = new EventEmitter();\n\n\tfunction validateTypeEvent( value, name ) {\n\t\tvalidateType( value, name, typeof value === \"string\" || value instanceof RegExp, \"String or RegExp\" );\n\t}\n\n\tfunction validateThenCall( method, self ) {\n\t\treturn function( event, listener ) {\n\t\t\tvalidatePresence( event, \"event\" );\n\t\t\tvalidateTypeEvent( event, \"event\" );\n\n\t\t\tvalidatePresence( listener, \"listener\" );\n\t\t\tvalidateTypeFunction( listener, \"listener\" );\n\n\t\t\treturn self[ method ].apply( self, arguments );\n\t\t};\n\t}\n\n\tfunction off( self ) {\n\t\treturn validateThenCall( \"off\", self );\n\t}\n\n\tfunction on( self ) {\n\t\treturn validateThenCall( \"on\", self );\n\t}\n\n\tfunction once( self ) {\n\t\treturn validateThenCall( \"once\", self );\n\t}\n\n\tCldr.off = off( globalEe );\n\tCldr.on = on( globalEe );\n\tCldr.once = once( globalEe );\n\n\t/**\n\t * Overload Cldr.prototype.init().\n\t */\n\tsuperInit = Cldr.prototype.init;\n\tCldr.prototype.init = function() {\n\t\tvar ee;\n\t\tthis.ee = ee = new EventEmitter();\n\t\tthis.off = off( ee );\n\t\tthis.on = on( ee );\n\t\tthis.once = once( ee );\n\t\tsuperInit.apply( this, arguments );\n\t};\n\n\t/**\n\t * getOverload is encapsulated, because of cldr/unresolved. If it's loaded\n\t * after cldr/event (and note it overwrites .get), it can trigger this\n\t * overload again.\n\t */\n\tfunction getOverload() {\n\n\t\t/**\n\t\t * Overload Cldr.prototype.get().\n\t\t */\n\t\tsuperGet = Cldr.prototype.get;\n\t\tCldr.prototype.get = function( path ) {\n\t\t\tvar value = superGet.apply( this, arguments );\n\t\t\tpath = pathNormalize( path, this.attributes ).join( \"/\" );\n\t\t\tglobalEe.trigger( \"get\", [ path, value ] );\n\t\t\tthis.ee.trigger( \"get\", [ path, value ] );\n\t\t\treturn value;\n\t\t};\n\t}\n\n\tCldr._eventInit = getOverload;\n\tgetOverload();\n\n\treturn Cldr;\n\n\n\n\n}));\n","/**\n * CLDR JavaScript Library v0.5.4\n * http://jquery.com/\n *\n * Copyright 2013 Rafael Xavier de Souza\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2020-10-22T15:56Z\n */\n/*!\n * CLDR JavaScript Library v0.5.4 2020-10-22T15:56Z MIT license © Rafael Xavier\n * http://git.io/h4lmVg\n */\n(function( factory ) {\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD.\n\t\tdefine( [ \"../cldr\" ], factory );\n\t} else if ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// Node. CommonJS.\n\t\tmodule.exports = factory( require( \"../cldr\" ) );\n\t} else {\n\t\t// Global\n\t\tfactory( Cldr );\n\t}\n\n}(function( Cldr ) {\n\n\t// Build optimization hack to avoid duplicating functions across modules.\n\tvar alwaysArray = Cldr._alwaysArray;\n\n\n\n\tvar supplementalMain = function( cldr ) {\n\n\t\tvar prepend, supplemental;\n\t\t\n\t\tprepend = function( prepend ) {\n\t\t\treturn function( path ) {\n\t\t\t\tpath = alwaysArray( path );\n\t\t\t\treturn cldr.get( [ prepend ].concat( path ) );\n\t\t\t};\n\t\t};\n\n\t\tsupplemental = prepend( \"supplemental\" );\n\n\t\t// Week Data\n\t\t// http://www.unicode.org/reports/tr35/tr35-dates.html#Week_Data\n\t\tsupplemental.weekData = prepend( \"supplemental/weekData\" );\n\n\t\tsupplemental.weekData.firstDay = function() {\n\t\t\treturn cldr.get( \"supplemental/weekData/firstDay/{territory}\" ) ||\n\t\t\t\tcldr.get( \"supplemental/weekData/firstDay/001\" );\n\t\t};\n\n\t\tsupplemental.weekData.minDays = function() {\n\t\t\tvar minDays = cldr.get( \"supplemental/weekData/minDays/{territory}\" ) ||\n\t\t\t\tcldr.get( \"supplemental/weekData/minDays/001\" );\n\t\t\treturn parseInt( minDays, 10 );\n\t\t};\n\n\t\t// Time Data\n\t\t// http://www.unicode.org/reports/tr35/tr35-dates.html#Time_Data\n\t\tsupplemental.timeData = prepend( \"supplemental/timeData\" );\n\n\t\tsupplemental.timeData.allowed = function() {\n\t\t\treturn cldr.get( \"supplemental/timeData/{territory}/_allowed\" ) ||\n\t\t\t\tcldr.get( \"supplemental/timeData/001/_allowed\" );\n\t\t};\n\n\t\tsupplemental.timeData.preferred = function() {\n\t\t\treturn cldr.get( \"supplemental/timeData/{territory}/_preferred\" ) ||\n\t\t\t\tcldr.get( \"supplemental/timeData/001/_preferred\" );\n\t\t};\n\n\t\treturn supplemental;\n\n\t};\n\n\n\n\n\tvar initSuper = Cldr.prototype.init;\n\n\t/**\n\t * .init() automatically ran on construction.\n\t *\n\t * Overload .init().\n\t */\n\tCldr.prototype.init = function() {\n\t\tinitSuper.apply( this, arguments );\n\t\tthis.supplemental = supplementalMain( this );\n\t};\n\n\treturn Cldr;\n\n\n\n\n}));\n","/**\n * CLDR JavaScript Library v0.5.4\n * http://jquery.com/\n *\n * Copyright 2013 Rafael Xavier de Souza\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2020-10-22T15:56Z\n */\n/*!\n * CLDR JavaScript Library v0.5.4 2020-10-22T15:56Z MIT license © Rafael Xavier\n * http://git.io/h4lmVg\n */\n(function( factory ) {\n\n\tif ( typeof define === \"function\" && define.amd ) {\n\t\t// AMD.\n\t\tdefine( [ \"../cldr\" ], factory );\n\t} else if ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\t\t// Node. CommonJS.\n\t\tmodule.exports = factory( require( \"../cldr\" ) );\n\t} else {\n\t\t// Global\n\t\tfactory( Cldr );\n\t}\n\n}(function( Cldr ) {\n\n\t// Build optimization hack to avoid duplicating functions across modules.\n\tvar coreLoad = Cldr._coreLoad;\n\tvar jsonMerge = Cldr._jsonMerge;\n\tvar pathNormalize = Cldr._pathNormalize;\n\tvar resourceGet = Cldr._resourceGet;\n\tvar validatePresence = Cldr._validatePresence;\n\tvar validateTypePath = Cldr._validateTypePath;\n\n\n\n\tvar bundleParentLookup = function( Cldr, locale ) {\n\t\tvar normalizedPath, parent;\n\n\t\tif ( locale === \"root\" ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// First, try to find parent on supplemental data.\n\t\tnormalizedPath = pathNormalize( [ \"supplemental/parentLocales/parentLocale\", locale ] );\n\t\tparent = resourceGet( Cldr._resolved, normalizedPath ) || resourceGet( Cldr._raw, normalizedPath );\n\t\tif ( parent ) {\n\t\t\treturn parent;\n\t\t}\n\n\t\t// Or truncate locale.\n\t\tparent = locale.substr( 0, locale.lastIndexOf( Cldr.localeSep ) );\n\t\tif ( !parent ) {\n\t\t\treturn \"root\";\n\t\t}\n\n\t\treturn parent;\n\t};\n\n\n\n\n\t// @path: normalized path\n\tvar resourceSet = function( data, path, value ) {\n\t\tvar i,\n\t\t\tnode = data,\n\t\t\tlength = path.length;\n\n\t\tfor ( i = 0; i < length - 1; i++ ) {\n\t\t\tif ( !node[ path[ i ] ] ) {\n\t\t\t\tnode[ path[ i ] ] = {};\n\t\t\t}\n\t\t\tnode = node[ path[ i ] ];\n\t\t}\n\t\tnode[ path[ i ] ] = value;\n\t};\n\n\n\tvar itemLookup = (function() {\n\n\tvar lookup;\n\n\tlookup = function( Cldr, locale, path, attributes, childLocale ) {\n\t\tvar normalizedPath, parent, value;\n\n\t\t// 1: Finish recursion\n\t\t// 2: Avoid infinite loop\n\t\tif ( typeof locale === \"undefined\" /* 1 */ || locale === childLocale /* 2 */ ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Resolve path\n\t\tnormalizedPath = pathNormalize( path, attributes );\n\n\t\t// Check resolved (cached) data first\n\t\t// 1: Due to #16, never use the cached resolved non-leaf nodes. It may not\n\t\t// represent its leafs in its entirety.\n\t\tvalue = resourceGet( Cldr._resolved, normalizedPath );\n\t\tif ( value !== undefined && typeof value !== \"object\" /* 1 */ ) {\n\t\t\treturn value;\n\t\t}\n\n\t\t// Check raw data\n\t\tvalue = resourceGet( Cldr._raw, normalizedPath );\n\n\t\tif ( value === undefined ) {\n\t\t\t// Or, lookup at parent locale\n\t\t\tparent = bundleParentLookup( Cldr, locale );\n\t\t\tvalue = lookup( Cldr, parent, path, jsonMerge( attributes, { bundle: parent }), locale );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\t// Set resolved (cached)\n\t\t\tresourceSet( Cldr._resolved, normalizedPath, value );\n\t\t}\n\n\t\treturn value;\n\t};\n\n\treturn lookup;\n\n}());\n\n\n\tCldr._raw = {};\n\n\t/**\n\t * Cldr.load( json [, json, ...] )\n\t *\n\t * @json [JSON] CLDR data or [Array] Array of @json's.\n\t *\n\t * Load resolved or unresolved cldr data.\n\t * Overwrite Cldr.load().\n\t */\n\tCldr.load = function() {\n\t\tCldr._raw = coreLoad( Cldr, Cldr._raw, arguments );\n\t};\n\n\t/**\n\t * Overwrite Cldr.prototype.get().\n\t */\n\tCldr.prototype.get = function( path ) {\n\t\tvalidatePresence( path, \"path\" );\n\t\tvalidateTypePath( path, \"path\" );\n\n\t\t// 1: use bundle as locale on item lookup for simplification purposes, because no other extended subtag is used anyway on bundle parent lookup.\n\t\t// 2: during init(), this method is called, but bundle is yet not defined. Use \"\" as a workaround in this very specific scenario.\n\t\treturn itemLookup( Cldr, this.attributes && this.attributes.bundle /* 1 */ || \"\" /* 2 */, path, this.attributes );\n\t};\n\n\t// In case cldr/unresolved is loaded after cldr/event, we trigger its overloads again. Because, .get is overwritten in here.\n\tif ( Cldr._eventInit ) {\n\t\tCldr._eventInit();\n\t}\n\n\treturn Cldr;\n\n\n\n\n}));\n","\"use strict\";\n\nvar assertion = require(\"./assertion\");\nvar assertType = assertion.assertType;\n\n/**\n * Asserts parameter type of a canonical number and type casts it into a Number\n * Disallows empty string and NaN\n * Used by Node\n */\nfunction assertCanonicalNumberTypeStrict(parameterValue, parameterName) {\n var number = parameterValue;\n assertType(parameterValue, parameterName, [], {\n // if number, should not be NaN\n // if string, cast to Number and should not be NaN\n condition:\n (typeof parameterValue === \"number\" && !isNaN(parameterValue)) ||\n (typeof parameterValue === \"string\" &&\n parameterValue !== \"\" &&\n !isNaN((number = Number(parameterValue)))),\n errorMessage:\n 'Parameter `{parameterName}` must be a number or a string representing a canonical number (e.g, `\"9999.99\"`), not {parameterType} `{{parameterValue}}`'\n });\n return number;\n}\n\n/**\n * Asserts parameter type of a canonical number and type casts it into a Number\n * Disallows empty string but allows NaN\n * Used by client\n */\nfunction assertCanonicalNumberType(parameterValue, parameterName) {\n var number = parameterValue;\n assertType(parameterValue, parameterName, [], {\n // if string, cast to Number and result should not be NaN\n condition:\n typeof parameterValue === \"number\" ||\n (typeof parameterValue === \"string\" &&\n parameterValue !== \"\" &&\n !isNaN((number = Number(parameterValue)))),\n errorMessage:\n 'Parameter `{parameterName}` must be a number or a string representing a canonical number (e.g, `\"9999.99\"`), not {parameterType} `{{parameterValue}}`'\n });\n return number;\n}\n\n/**\n * Asserts parameter type of a localized number.\n */\nfunction assertLocalizedNumberType(parameterValue, parameterName) {\n assertType(parameterValue, parameterName, [\"number\", \"string\"], {\n errorMessage:\n 'Parameter `{parameterName}` must be a number or a string representing a localized number (e.g., `\"9,999.99\"` in English or `\"9.999,99\"` in Spanish), not {parameterType} `{{parameterValue}}`'\n });\n}\n\n/**\n * Sets minimumFractionDigits/maximumFractionDigits in options:\n *\n * If either is undefined, currencyDigits is used (if provided)\n * Otherwise, minimumFractionDigits defaults to 0, and maximumFractionDigits defaults to 9\n * And if minimumFractionDigits is greater than maximumFractionDigits,\n * then minimumFractionDigits is reduced to the same level as maximumFractionDigits\n */\nfunction setFractionDigits(options, currencyDigits) {\n // TODO: Use Globalize formatCurrency, which handles currency defaultDigits itself\n if (options.minimumFractionDigits === undefined) {\n options.minimumFractionDigits =\n currencyDigits === undefined ? 0 : currencyDigits;\n }\n if (\n options.maximumFractionDigits === undefined ||\n options.maximumFractionDigits > 9\n ) {\n options.maximumFractionDigits =\n currencyDigits === undefined ? 9 : currencyDigits;\n }\n if (options.minimumFractionDigits > options.maximumFractionDigits) {\n options.minimumFractionDigits = options.maximumFractionDigits;\n }\n return options;\n}\n\nmodule.exports = {\n assertCanonicalNumberType: assertCanonicalNumberType,\n assertCanonicalNumberTypeStrict: assertCanonicalNumberTypeStrict,\n assertLocalizedNumberType: assertLocalizedNumberType,\n setFractionDigits: setFractionDigits\n};\n","import { hasMultiItemCartShops } from '../../experiments/shops'\n\nexport function getCartStorage(userId) {\n const key = 'pp-shops-cart-' + userId\n return localStorage.getItem(key) ? JSON.parse(localStorage.getItem(key)) : {}\n}\n/**\n * This product will return the correct way to format productId and productQuantity information\n * mainly for planning call.\n */\nexport function handleProductDetails(\n ppshopsGuestId = '',\n sellerId = '',\n productId = '',\n productQuantity = ''\n) {\n const cart = ppshopsGuestId ? getCartStorage(ppshopsGuestId) : undefined\n if (hasMultiItemCartShops() && cart) {\n try {\n return cart[sellerId].map(product => ({\n id: product.productId,\n quantity: product.quantity,\n }))\n } catch (ex) {\n return { id: '', quantity: '' }\n }\n }\n return {\n id: productId,\n quantity: productQuantity,\n }\n}\n","import * as Actions from './Actions'\nimport * as OverpanelActions from './overpanels'\nimport * as UnifiedActions from './unified-actions'\nimport { fetch, post, postJson } from '../../calculator/lib/xhr'\nimport {\n INSTRUMENTATION_TYPES,\n ActionTypes as types,\n CLIENT_MISSING_REQUIRED_NOTE_FIELD,\n FLOW_TYPES,\n OPEN_BANKING_FLOWS,\n} from '../constants'\nimport * as travelRuleUtils from '../utils/travelRuleUtils'\nimport { routeTo } from '../utils/routeHelper'\nimport { getRecentActions } from '../../transfer/middlewares/action-history'\nimport {\n getAutoSelectedFundingOption,\n removePreferredFromSourcesInOption,\n addPreferredToSourceInOption,\n shouldForceAutoSelectedOption,\n getSingleFundingOption,\n isFundingOptionAvailable,\n getOptionById,\n getRelevantFundingSource,\n buildFundingSourceAccountType,\n} from '../utils/funding-option-utils'\nimport { getFlowType } from '../utils/url-utils'\nimport FeaturesConfig from '../../../../config/features.json'\nimport { FundingOptionSelector, SendSuccess } from 'transfer/lazy-components'\nimport {\n generateFIFlowUrl,\n generateNegBalFlowUrl,\n} from '../../experiments/fiFlow'\nimport { isV2PhaseTwo } from '../../experiments/v2'\nimport { isIframe } from 'iframe-support'\nimport {\n cardinalDDCCallPromise,\n extract3DS2Contingency,\n track3ds2PostDDCAnalytics,\n collectBrowserContext,\n} from '../utils/3ds-utils'\nimport { isEmpty, get } from 'lodash'\nimport { trackAction } from '../../lib/analytics/fpti'\nimport {\n MONEY_PAGE,\n INSTRUMENT_TYPES,\n CONTINGENCY,\n PAYMENT_TYPE,\n SHIPPING_ADDRESS_OPTIONS,\n ENV_TYPE,\n} from '../../../../lib/constants'\nimport { rankingPreferencesHelper } from './sendHelpers'\nimport { batch } from 'react-redux' // eslint-disable-line no-restricted-imports\nimport { getTrafficSource } from '../utils/mgmUtils'\nimport { calculateAttributesToCollect } from '../utils/travelRuleUtils'\nimport { isHideShippingAddress } from '../../../../lib/address'\nimport { isEmail, isPhone } from '../../../../shared/validators'\nimport logger from 'loglevel'\nimport { handleProductDetails } from '../utils/local-storage'\nimport { getSessionDataPayload } from 'transfer/utils/session'\nimport { isInstrumentDebitFailedError } from '../utils/fiFailureUtils'\nimport { hasAddFiPostMigration } from '../../experiments/migrateRoutes'\nimport { tracking } from '../../lib/analytics/mParticle'\nimport Events from '../../lib/analytics/eventTags'\n\nfunction makeFundingOptionsCall(\n dispatch,\n state,\n {\n isExternal = false,\n conversionType = null,\n preselectedFundingOption = {},\n instrumentIds = [],\n handleFISelectorNext = null,\n fundingOptionsRefetched = false,\n } = {}\n) {\n const {\n server: {\n env,\n psd2: { token: psd2Token } = {},\n groupFeatures: { shouldShowSelectFundingOptionsPage = false },\n isMgm,\n flowIntent,\n },\n note: { note = '' },\n amount: { amount, currencyCode },\n recipient: {\n token,\n payerId = '',\n recipient,\n networkId = '',\n displayName = '',\n productId = '',\n productQuantity = '',\n accountId = '',\n thumbnailUrl = '',\n recipientId,\n recipientIdType,\n moneyPageOverPanel,\n pispRecipientType = '',\n pispRecipientId = '',\n },\n address: {\n selectedShippingAddress: { id: selectedShippingAddressId },\n },\n transaction: {\n isPurchase,\n selectedFundingOption: { funding_sources },\n successfullyAddedFundingInstrumentIds,\n serviceReturnedType,\n shippingAddressCollectionPreference,\n shippingType,\n },\n unilateral: {\n countryCode: unilateralCountry,\n name: recipientFullName,\n } = {},\n theme: { themeId },\n crossBorder: { toCountryCode, toCurrencyCode, fromCurrencyCode, fxQuoteId },\n external: {\n poolId,\n anonymousPayment,\n donationContext,\n recurring,\n donateToken,\n fromUL,\n sdkMeta,\n targetMeta,\n transaction_attribute,\n },\n donate: { donationAnonymousStatus },\n } = state\n\n const ignorePreferred = Boolean(successfullyAddedFundingInstrumentIds)\n // our server uses both of these, and also is checking for the string \"true\"\n const action = isPurchase ? 'buy' : 'send'\n const goods = isPurchase ? 'true' : 'false'\n\n let paymentCardId\n\n // grab paymentCardId if user is changing currency conversion type\n if (conversionType) {\n const paymentCard =\n funding_sources &&\n funding_sources.find(\n source => source.instrument_type === INSTRUMENT_TYPES.PAYMENT_CARD\n )\n paymentCardId = paymentCard && paymentCard.id\n }\n\n // For mandatory FI, generate additional params for funding_option call\n const preferences = rankingPreferencesHelper({\n conversionType,\n instrumentIds,\n preselectedFundingOption,\n })\n\n const browserData = collectBrowserContext()\n const browserContext = {\n screenHeight: browserData.browser_screen_height,\n screenWidth: browserData.browser_screen_width,\n colorDepth: browserData.browser_color_depth,\n timezoneOffsetMinutes: browserData.browser_timezone_offset_minutes,\n language: browserData.browser_language,\n javaEnabled: browserData.browser_java_enabled,\n }\n\n const shouldSendShippingAddress = !isHideShippingAddress(\n shippingAddressCollectionPreference\n )\n\n let shippingAddressId = selectedShippingAddressId\n\n if (\n env === ENV_TYPE.PPSHOPS &&\n shippingType === 'NOT_APPLICABLE' &&\n shippingAddressId === SHIPPING_ADDRESS_OPTIONS.NO_ADDRESS_NEEDED\n ) {\n shippingAddressId = undefined\n }\n\n // query params being sent to the server\n const payload = {\n env,\n payerId,\n networkId,\n recipient,\n displayName,\n thumbnailUrl,\n amount,\n ...(shouldSendShippingAddress && { shippingAddressId }),\n currencyCode,\n goods,\n action,\n serviceReturnedType,\n themeId,\n note,\n flowType: isPurchase ? 'buy' : 'send',\n paymentCardId,\n conversionType,\n moneyPageExperience: moneyPageOverPanel,\n recipientCountry: unilateralCountry,\n successfullyAddedFundingInstrumentIds,\n // mixin additional fields based on env\n ...(env === ENV_TYPE.CROSS_BORDER && { toCountryCode }),\n ...(env === ENV_TYPE.PP_ME && { recipientId, recipientIdType }),\n ...(env === ENV_TYPE.POOLS && {\n poolId,\n anonymousPayment,\n }), // pools\n ...(recipientFullName && { recipientFullName }), // kyc\n ...(env === ENV_TYPE.DONATE && {\n donationContext,\n recurring,\n donateToken,\n fromUL,\n sdkMeta,\n targetMeta,\n transaction_attribute,\n donationAnonymousStatus,\n }),\n ...(env === ENV_TYPE.PISP && psd2Token && { psd2Token }),\n ...(env === ENV_TYPE.PISP &&\n pispRecipientType &&\n pispRecipientId && { pispRecipientType, pispRecipientId }), // this is required for funding options calls\n isMgm,\n token,\n browserContext,\n flowIntent,\n fxQuoteId,\n ...(env === FLOW_TYPES.PPSHOPS && {\n items: handleProductDetails(\n accountId,\n networkId,\n productId,\n productQuantity\n ),\n }),\n ...getSessionDataPayload(),\n }\n\n if (preferences) {\n payload.preferences = preferences\n }\n\n const url = '/myaccount/transfer/fi'\n\n post(url, payload)\n .then(response => {\n const { data = {} } = response\n let responseData = data\n // Add \"conversionType\" to the funding option call response data. In the case of funding a cross currency transaction\n // using card, we need to know the conversion type to show the conversion message \"Converst currency with PAyPal | card\"\n responseData = { ...responseData, conversionType }\n\n // As we have debounced pricing call in cross currency scenario, sometimes\n // amount in store mismatch with the amount sent to planning, hence here\n // we use amount sent to planning to update amount in store so that we have\n // consistent amount on Review and Success screen.\n if (\n (toCurrencyCode !== fromCurrencyCode &&\n responseData.destinationAmount &&\n responseData.destinationAmount.value &&\n responseData.destinationAmount.currency) ||\n env === FLOW_TYPES.PPSHOPS\n ) {\n dispatch(Actions.changeAmount(responseData.destinationAmount.value))\n dispatch(\n Actions.changeCurrency(responseData.destinationAmount.currency)\n )\n }\n\n dispatch(\n receivedFundingOptions(\n responseData,\n shouldShowSelectFundingOptionsPage,\n ignorePreferred,\n fundingOptionsRefetched\n )\n )\n\n if (handleFISelectorNext) {\n handleFISelectorNext()\n }\n })\n .catch(err => {\n if (err.responseJSON && err.responseJSON.code === 'poolsCurrencyError') {\n dispatch(Actions.triggerExternalHook('noCurrencyBalanceError', err))\n }\n\n switch (err.code) {\n case 'negativeBalance':\n const mainWindow = isIframe() ? window.top : window\n mainWindow.location = generateNegBalFlowUrl({\n flowType: getFlowType(),\n amount: amount,\n currencyCode: currencyCode,\n payerId,\n networkId,\n recipient: recipient,\n displayName,\n thumbnailUrl,\n isMgm,\n mgmTrafficSource: getTrafficSource(),\n flowIntent,\n env,\n token,\n ...getSessionDataPayload(),\n })\n return\n case 'unilateral':\n return dispatch(showUnilateral(state.user.country))\n\n case 'noFundingSource':\n case 'errorExpiredCreditCard':\n const unavailableFI = Boolean(\n successfullyAddedFundingInstrumentIds.length\n )\n return dispatch(Actions.noFundingSource(unavailableFI))\n\n case 'authRequired':\n return // do nothing bc we are redirecting the user to auth flow in xhr.js\n\n case 'cipRequired':\n /**\n * For AU users who haven't completed CIP and want to Send Money F&F,\n * we show an overpanel that can redirect them to CIP flow.\n */\n return dispatch(\n OverpanelActions.toggleConfirmIdentityOverpanel({ show: true })\n )\n case CLIENT_MISSING_REQUIRED_NOTE_FIELD:\n return dispatch(Actions.mandatoryNoteMissing(true))\n\n default:\n return dispatch(Actions.showError(err))\n }\n })\n}\n\nexport function getAnalyticsMeta(type, payload) {\n return { analytics: { type, payload } }\n}\n\nexport function fetchFundingOptions({\n conversionType = null,\n preselectedFundingOption = {},\n instrumentIds = [],\n handleFISelectorNext = null,\n fundingOptionsRefetched = false,\n} = {}) {\n // preload the chunk file\n FundingOptionSelector.preload()\n\n return (dispatch, getState) => {\n const {\n user: { requireSenderInstrumentAddition = false },\n } = getState()\n\n if (requireSenderInstrumentAddition) {\n // no available FIs to use for the current transaction, send user to wallet\n dispatch(Actions.setIsLoading(true))\n return dispatch(redirectToAddFI())\n }\n\n makeFundingOptionsCall(dispatch, getState(), {\n conversionType,\n instrumentIds,\n preselectedFundingOption,\n handleFISelectorNext,\n fundingOptionsRefetched,\n })\n dispatch({\n type: types.TRANSACTION.FETCH_FUNDING_OPTIONS,\n })\n }\n}\n\nexport function receivedFundingOptions(\n fundingData,\n shouldShowSelectFundingOptionsPage,\n ignorePreferred,\n fundingOptionsRefetched\n) {\n const {\n fundingOptions = [],\n disallowedSources = [],\n complianceInfo = {},\n isPaypalAccount = false,\n additionalDisclosureActions = [],\n xbActualRecipientCountry = '',\n xbChosenCountry = '',\n xbCountryMismatch = false,\n isCrowdFundingCampaign = false,\n riskHoldOverpanelVariant = '',\n isPreferredSourceDisallowed,\n conversionType,\n showFISelector = true,\n selectedFundingOptionId: fundingOptionIdFromSession = '',\n showStateMandatedWarning = false,\n paymentReviewDisclosureMessage = '',\n paymentTypeReviewMessage = '',\n items = [],\n shippingDetails = {},\n shippingType = '',\n purchaseConsentPreChecked = false,\n purchaseConsentChecked = false,\n purchaseConsentLabel = '',\n purchaseConsentRequired = false,\n userAgreementConsentLabel = '',\n userAgreementConsentRequired = false,\n userAgreementConsentMinVersion = '',\n userAgreementConsentMaxVersion = '',\n } = fundingData\n\n const xbData = {\n xbActualRecipientCountry,\n xbChosenCountry,\n xbCountryMismatch,\n }\n\n // we are tracking this receipt of funding options below, but this also needs to be\n // tracked as per the analytics team\n const flowType = getFlowType()\n\n return (dispatch, getState) => {\n const {\n card: { addedCards },\n theme: { themeId = '' } = {},\n transaction: {\n isPurchase,\n fundingSourceIdsOfLastSelectedFundingOption: sourceIdsToMatch,\n successfullyAddedFundingInstrumentIds,\n },\n external: { isPortable } = {},\n } = getState()\n\n // try to get the preselected Funding Option\n let preselectedFundingOption = {}\n fundingOptions.forEach(option => {\n if (option && option.preselected_funding_option) {\n preselectedFundingOption = option\n }\n })\n\n // try to automatically select a funding option from payload data\n const [newestAddedCard] = addedCards\n let selectedFundingOption = getAutoSelectedFundingOption(\n fundingOptions,\n isPurchase,\n sourceIdsToMatch,\n newestAddedCard,\n ignorePreferred\n )\n\n // When showFISelector is False and there is a preselectedFundingOption,\n // we make the preselectedFundingOption and don't show the funding option selector\n if (!showFISelector && !isEmpty(preselectedFundingOption)) {\n selectedFundingOption = preselectedFundingOption\n }\n\n // portable always gets a funding options (until we can add choice)\n // TODO: add full support for choice in portable\n if (isPortable && !selectedFundingOption) {\n selectedFundingOption = getSingleFundingOption(fundingOptions)\n }\n\n if (fundingOptionIdFromSession) {\n selectedFundingOption = getOptionById(\n fundingOptions,\n fundingOptionIdFromSession\n )\n }\n\n if (\n !selectedFundingOption &&\n shouldForceAutoSelectedOption(\n isPurchase,\n shouldShowSelectFundingOptionsPage\n )\n ) {\n // if not in the choice experiment, we need to make sure a funding option is selected since we won't be\n // forced to see the interstitial initially\n selectedFundingOption = getSingleFundingOption(fundingOptions)\n }\n\n // Handle DDC calls by first collecting, storing all DDCs, and then firing\n // one by one sequentially in DeviceDataCollection.js\n const ddcCalls = collect3ds2DDCCalls(fundingOptions)\n if (ddcCalls.length > 0) {\n dispatch(storeAllDDC(ddcCalls))\n }\n\n // Toggle a warning when a new Funding Instrument is added in Wallet\n // And that FI is not available for the transaction\n const newFundingOptionIsAvailable = isFundingOptionAvailable(\n fundingOptions,\n successfullyAddedFundingInstrumentIds\n )\n if (successfullyAddedFundingInstrumentIds && !newFundingOptionIsAvailable) {\n dispatch(toggleFIUnavailableWarning(true))\n }\n\n // create meta data for analytics\n const pageGroup = `main:consumer:p2p:${flowType}::confirm`\n const isRTR =\n complianceInfo &&\n complianceInfo.action === 'DISPLAY_TRANSACTION_DISCLOSURES'\n const flavor = isRTR ? 'rtr' : ''\n const pageName = `main:consumer:p2p:${flowType}::confirm:${flavor}`\n\n /**\n * we pass pp_flow analytics data when the user is via send money flow and\n * decides to send a gift\n * we do this by checking if their exist a themeId and is via send money route\n *\n * we also pass `iscvvshown` to analytics when the user sends money using a funding\n * option that has a 'CVV' contingency\n **/\n let analyticsMeta\n\n const { contingencies = [] } = selectedFundingOption || {} // we cannot assume that selectedFundingOption exists here\n const hasCVVContingency = contingencies.some(\n contingency => contingency.action === 'CVV_REQUIRED'\n )\n\n if (hasCVVContingency || (themeId && flowType === 'send')) {\n const data = {\n ...(themeId && flowType && { pp_flow: 'p2p_gift' }),\n ...(hasCVVContingency && { iscvvshown: true }),\n }\n analyticsMeta = Actions.getAnalyticsMeta(\n INSTRUMENTATION_TYPES.ACTION_WITH_DATA,\n { linkName: 'continue', pageGroup, pageName, data }\n )\n }\n\n if (fundingOptionsRefetched) {\n dispatch({\n type: types.TRANSACTION.REFETCHED_FUNDING_OPTIONS,\n data: { shippingType },\n })\n }\n\n dispatch({\n type: types.TRANSACTION.RECEIVED_FUNDING_OPTIONS,\n meta: analyticsMeta,\n data: {\n ...xbData,\n items,\n shippingDetails,\n selectedFundingOption,\n preselectedFundingOption,\n additionalDisclosureActions,\n fundingOptions,\n riskHoldOverpanelVariant,\n disallowedSources,\n complianceInfo,\n isPaypalAccount,\n isPreferredSourceDisallowed,\n isCrowdFundingCampaign,\n conversionType,\n showFISelector,\n showStateMandatedWarning,\n paymentReviewDisclosureMessage,\n paymentTypeReviewMessage,\n shippingType,\n purchaseConsentPreChecked,\n purchaseConsentChecked,\n purchaseConsentLabel,\n purchaseConsentRequired,\n userAgreementConsentRequired,\n userAgreementConsentLabel,\n userAgreementConsentMinVersion,\n userAgreementConsentMaxVersion,\n },\n receivedAt: Date.now(),\n })\n }\n}\n\n/**\n * This function collects all the DDC contingencies for 3DS2 from wallet\n * @param fundingOptions\n * @param dispatch\n */\nexport function collect3ds2DDCCalls(fundingOptions) {\n const ddcCalls = []\n fundingOptions.forEach(({ id = '', contingencies = [] }) => {\n contingencies.forEach(contingency => {\n const {\n action = '',\n three_d_secure_protocol: threeDSecureProtocol = '',\n jwt = '',\n three_ds_reference_id: threeDS2ReferenceId = '',\n device_data_collection_url: deviceDataCollectionUrl = '',\n device_data_collection_mode: deviceDataCollectionMode = '',\n } = contingency\n if (\n action === '3D_SECURE_DATA_COLLECTION_REQUIRED' &&\n threeDSecureProtocol === '2.0'\n ) {\n ddcCalls.push({\n jwt,\n deviceDataCollectionMode,\n deviceDataCollectionUrl,\n threeDSecureProtocol,\n threeDS2ReferenceId,\n fundingOptionId: id,\n })\n }\n })\n })\n return ddcCalls\n}\n\nexport function endDDCCall() {\n return {\n type: types.TRANSACTION.END_DDC_CALL,\n }\n}\n\nexport function startDDCCall(ddcInfo) {\n return {\n type: types.TRANSACTION.START_DDC_CALL,\n data: ddcInfo,\n }\n}\n\nexport function storeAllDDC(ddcCalls) {\n return {\n type: types.TRANSACTION.STORE_ALL_DDC,\n data: { ddcCalls: ddcCalls },\n }\n}\n\nexport function clearFundingOptions() {\n return {\n type: types.TRANSACTION.CLEAR_FUNDING_OPTIONS,\n }\n}\n\nexport function setPurchaseConsentValue(purchaseConsentChecked) {\n return {\n type: types.TRANSACTION.PURCHASE_CONSENT_IS_CHECKED,\n data: { purchaseConsentChecked: purchaseConsentChecked },\n }\n}\n\n/**\n * Called when the user presses the \"back\" button on the browser for 3DS flow.\n */\nexport function refetchFundingOption3DS() {\n return {\n type: types.TRANSACTION.REFETCH_FUNDING_OPTIONS_3DS,\n }\n}\n\n/**\n * This function tries to resolve the DDC Contingency for a funding option\n * While the processing is happening the spinner screen is shown for atleast two seconds\n * and till we get a response from resolve-contingency API\n *\n * @param sendSubmit\n * @returns {Function}\n */\n\nexport function resolveDDC(\n sendSubmit,\n history = {},\n isGuest = false,\n browserContext = {}\n) {\n return async (dispatch, getState) => {\n const {\n transaction: { selectedFundingOption = {}, refetchedFundingOptionFor3DS },\n server: { env = '' },\n } = getState()\n\n const { id: fundingOptionId } = selectedFundingOption\n\n const data = {\n fundingOptionId,\n browserContext,\n isGuest,\n env,\n }\n const url = `/myaccount/transfer/${\n isGuest ? 'guestLogin' : 'send'\n }/ddc-contingency`\n\n // The change here is trying to stop resolve DDC call that is running in the background when browser back is pressed.\n // When browser back is initiated refetchedFundingOptionFor3DS is set to true. So that the resolveDDC already initiated\n // can be cancelled. refetchedFundingOptionFor3DS is reset when TRANSACTION.RECEIVED_FUNDING_OPTIONS is triggered.\n if (refetchedFundingOptionFor3DS) {\n return\n }\n // start the spinner\n dispatch(OverpanelActions.toggle3DS2SpinnerOverpanel({ show: true }))\n const startTime = performance.now()\n\n // change the pglk as this action is trigerred by click from Send Payment Now\n trackAction('Send Payment Now')\n\n // Only call DDC if deviceDataCollectionMode is SYNCHRONOUS\n const ddcInfo = collect3ds2DDCCalls([selectedFundingOption])[0]\n const isSynchronous =\n get(ddcInfo, 'deviceDataCollectionMode', '') === 'SYNCHRONOUS'\n if (isSynchronous) {\n // Wait for DDC call promise to resolve before continuing\n await cardinalDDCCallPromise(dispatch, ddcInfo)\n }\n\n fetch(url, data)\n .then(response => {\n let endTime = performance.now()\n let timeDiff = (endTime - startTime) / 1000\n // check if the time taken for resolve contingency is greater than 2 seconds, stop the spinner,\n // if less than 2 seconds, show the spinner\n // The purpose of this code is to add a delay of minimum of 2 seconds\n while (timeDiff <= 2) {\n endTime = performance.now()\n timeDiff = (endTime - startTime) / 1000\n }\n // stop the spinner\n dispatch(OverpanelActions.toggle3DS2SpinnerOverpanel({ show: false }))\n\n track3ds2PostDDCAnalytics(isGuest, startTime, endTime)\n\n if (response && response.isDDCSuccess) {\n // show the challenge overpanel as there is another contingency in response of resolving the DDC Contingency\n if (response.threeDS2contingency) {\n dispatch({\n type: types.TRANSACTION.THREE_DS2_SECURE_AUTH_REQUIRED,\n data: response.threeDS2contingency,\n })\n // Adding setTimeout as multiple action dispatch causes the screen to freeze\n setTimeout(() => {\n sendSubmit()\n Actions.resetScrollPosition()\n }, 500)\n } else {\n // show the success screen as there is no challenge\n dispatch({ type: types.TRANSACTION.DDC_RESOLVED })\n sendSubmit()\n Actions.resetScrollPosition()\n }\n }\n })\n .catch(err => {\n dispatch(OverpanelActions.toggle3DS2SpinnerOverpanel({ show: false }))\n const endTime = performance.now()\n track3ds2PostDDCAnalytics(isGuest, startTime, endTime)\n setTimeout(() => {\n dispatch(Actions.showError(err))\n }, 500)\n })\n }\n}\n\nexport function handleCVV(sendSubmit) {\n return (dispatch, getState) => {\n const {\n transaction: {\n selectedFundingOption: { id: fundingOptionId },\n cvv,\n },\n server: { env },\n } = getState()\n\n const sendData = {\n fundingOptionId,\n cvv,\n env,\n }\n\n dispatch({ type: types.TRANSACTION.REQUEST_CVV })\n\n const url = '/myaccount/transfer/send/cvv-contingency'\n post(url, sendData)\n .then(response => {\n dispatch({\n type: types.TRANSACTION.RESOLVE_CVV,\n data: response,\n })\n // Re-submit to proceed with transaction\n sendSubmit()\n Actions.resetScrollPosition()\n })\n .catch(err => {\n dispatch(Actions.showError(err))\n })\n }\n}\n\nexport function handlePurchaseConsent(sendSubmit, isGuest = false) {\n return (dispatch, getState) => {\n const {\n transaction: {\n selectedFundingOption: { id: fundingOptionId },\n purchaseConsentChecked,\n purchaseConsentRequired,\n },\n server: { env },\n } = getState()\n\n const sendData = {\n fundingOptionId,\n purchaseConsentChecked,\n purchaseConsentRequired,\n env,\n }\n\n dispatch({ type: types.TRANSACTION.REQUEST_PURCHASE_CONSENT })\n\n const userFlowType = isGuest ? 'guestLogin' : 'send'\n const url = `/myaccount/transfer/${userFlowType}/purchase-consent-contingency`\n post(url, sendData)\n .then(response => {\n dispatch({ type: types.TRANSACTION.RESOLVE_PURCHASE_CONSENT })\n // Re-submit to proceed with transaction\n sendSubmit()\n Actions.resetScrollPosition()\n })\n .catch(err => {\n dispatch(Actions.showError(err))\n })\n }\n}\n\nexport function handleThreeDS2Success(threeDS2Contingency) {\n return {\n type: types.TRANSACTION.RESOLVED_3DS2_AUTH_CONTINGENCY,\n data: threeDS2Contingency,\n }\n}\n\nexport function handleThreeDS2Failure() {\n return { type: types.TRANSACTION.FAILED_3DS2_AUTH_CONTINGENCY }\n}\n\nexport function handleThreeDS() {\n return { type: types.TRANSACTION.RESOLVE_3DS }\n}\n\nexport function errorThreeDS(err) {\n return dispatch => {\n dispatch(OverpanelActions.toggle3DSecureOverpanel({ show: false }))\n dispatch(Actions.showError(err))\n dispatch(clearFundingOptions())\n }\n}\n\nexport const setDualControlContext = ({ handleNext = null }) => {\n return dispatch => {\n dispatch({ type: types.TRANSACTION.SET_DUALCONTROL_CONTEXT })\n\n const url = '/myaccount/transfer/send/set/dc-context'\n post(url)\n .then(() => {\n logger.info('set Dualcontrol context')\n if (handleNext) {\n handleNext()\n }\n })\n .catch(err => {\n Actions.handleError(dispatch)(err)\n })\n }\n}\n\nexport const getDCSendMoneyReqPayload = state => {\n const {\n recipient: { payerId = '', recipient, displayName = '', fullName = '' },\n transaction: { isPurchase },\n unilateral: { countryCode, name: recipientFullName } = {},\n amount: { amount, currencyCode },\n note: { note: description },\n address: {\n selectedShippingAddress: { id: selectedShippingAddressId } = {},\n },\n } = state\n\n const recipientId = payerId || recipient\n let recipientType\n\n if (isEmail(recipientId)) {\n recipientType = 'EMAIL'\n } else if (isPhone(recipientId)) {\n recipientType = 'PHONE'\n } else {\n recipientType = 'ACCOUNT_NUMBER'\n }\n\n const payload = {\n payee: {\n id: recipientId,\n type: recipientType,\n name: displayName || fullName || recipientFullName,\n country_code: countryCode,\n is_paypal_account: !!payerId,\n },\n options: [\n {\n payment_amount: {\n currency: currencyCode,\n value: amount,\n },\n },\n ],\n payment_type: isPurchase ? PAYMENT_TYPE.PURCHASE : PAYMENT_TYPE.PERSONAL,\n }\n return { payload, description, selectedShippingAddressId }\n}\n\nexport function handleSendMoneyRequest() {\n return (dispatch, getState) => {\n dispatch({ type: types.TRANSACTION.SEND_MONEY })\n const data = getDCSendMoneyReqPayload(getState())\n\n const url = '/myaccount/transfer/send/approval-requests'\n post(url, data)\n .then(response => {\n dispatch(sentMoney(response))\n Actions.resetScrollPosition()\n })\n .catch(err => {\n Actions.handleError(dispatch)(err)\n })\n }\n}\n\nexport function handleSendSubmit() {\n return (dispatch, getState) => {\n const {\n server: { env, country },\n external: {\n donationContext,\n isRecurring,\n donationGiftAidCheckbox,\n recipientIdType,\n recipientId, // paypalme slug\n },\n amount: { amount, currencyCode },\n recipient: { recipient },\n transaction: {\n isPurchase,\n selectedFundingOption,\n selectedFundingOption: { id: fundingOptionId },\n selectedInstallmentPlan: { installmentTerm },\n },\n note: { note: description },\n user,\n } = getState()\n\n const dflFmxId = () => {\n const selectedFOExists = !!Object.keys(selectedFundingOption).length\n return (\n selectedFOExists &&\n selectedFundingOption.funding_sources.map(source => source.id)\n )\n }\n\n const usingPreferred = () => {\n const selectedFOExists = !!Object.keys(selectedFundingOption).length\n const answer =\n selectedFOExists &&\n selectedFundingOption.funding_sources.some(source => source.isPreferred)\n return answer ? 'Y' : 'N'\n }\n\n let fltp = ''\n switch (getFlowType()) {\n case 'buy':\n fltp = 'g&s'\n break\n case 'send':\n fltp = 'f&f'\n break\n default:\n break\n }\n\n const data = {\n fltp: fltp,\n dfl_fmxid: dflFmxId() || 'nodefault', // selected instruments\n is_pref: usingPreferred(),\n slug_name: recipientIdType === 'ppme' && recipientId,\n pp_flow: env,\n }\n\n const linkName = 'Send'\n\n const pageGroup = `main:p2p:unified:${getFlowType()}::review`\n const pageName = `main:p2p:unified:${getFlowType()}::review:node::`\n\n dispatch({\n type: '', // empty call to hit the analytics middleware\n meta: getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION_WITH_DATA, {\n linkName,\n pageGroup: pageGroup,\n pageName: pageName,\n data: data,\n trackType: 'link',\n }),\n })\n\n // For v1, installmentTerm is a Number, but should be string for ajax call to server\n // For v2, installmentTerm is in Iso8601 format as Service only accepts duration in that format\n const installment_term = installmentTerm && installmentTerm.toString()\n const action = isPurchase ? 'buy' : 'send'\n\n const sendData = {\n env,\n action,\n recipient,\n amount,\n currencyCode,\n fundingOptionId,\n description,\n installment_term,\n donationGiftAidCheckbox,\n flowType: getFlowType(),\n travelRuleRequirements: calculateAttributesToCollect(\n selectedFundingOption\n ),\n\n // external variables\n ...(env === ENV_TYPE.DONATE && { donationContext }),\n }\n\n if (env === ENV_TYPE.DONATE && isRecurring) {\n return\n }\n\n if (!travelRuleUtils.isTravelRule(selectedFundingOption)) {\n return dispatch(send(sendData))\n }\n\n if (\n travelRuleUtils.hasAllNeededTravelRuleInfo({\n ...user,\n selectedFundingOption,\n })\n ) {\n const travelRuleData = travelRuleUtils.massageTravelRuleDataForPost({\n ...user,\n selectedFundingOption,\n country,\n })\n\n return dispatch(postTravelRuleAndSend({ ...sendData, ...travelRuleData }))\n }\n\n // if travel rule but not all info is present, just return out\n return\n }\n}\n\nexport function send(data) {\n // prefetch chunk file\n SendSuccess.preload()\n\n return (dispatch, getState) => {\n const {\n transaction: { fundingOptions, selectedFundingOption },\n } = getState()\n\n // we see a few transactions per day where we POST to /send with an empty string\n // for fundingOptionId, so in this case, we are passing up extra client-side\n // data, and we're checking for empty fundingOptionId on server and logging\n // this stuff to CAL\n if (!data.fundingOptionId) {\n Object.assign(data, {\n actions: getRecentActions(), // already stringified\n fundingOptions: JSON.stringify(fundingOptions),\n selectedFundingOption: JSON.stringify(selectedFundingOption),\n })\n }\n\n dispatch({ type: types.TRANSACTION.SEND_MONEY })\n const url = '/myaccount/transfer/send'\n post(url, data)\n .then(response => {\n dispatch(sentMoney(response))\n Actions.resetScrollPosition()\n })\n .catch(err => {\n if (\n err.responseJSON &&\n err.responseJSON.code === 'poolsCurrencyError'\n ) {\n dispatch(Actions.triggerExternalHook('noCurrencyBalanceError', err))\n }\n\n if (err.code === CLIENT_MISSING_REQUIRED_NOTE_FIELD) {\n return dispatch(Actions.mandatoryNoteMissing(true))\n }\n\n if (isInstrumentDebitFailedError(err)) {\n return dispatch(\n UnifiedActions.fetchFundingOptionsAndShowFundingOptionsOverpanel()\n )\n }\n\n Actions.handleError(dispatch)(err)\n })\n }\n}\n\n/**\n * Post new travel rule data and send money\n * @param {}\n * @return {}\n */\nexport function postTravelRuleAndSend(data) {\n return dispatch => {\n dispatch({ type: types.TRANSACTION.POST_TRAVEL_RULE_DATA })\n dispatch({ type: types.TRANSACTION.SEND_MONEY })\n const url = '/myaccount/transfer/fi/travelRule'\n return post(url, data)\n .then(response => {\n dispatch({ type: types.TRANSACTION.POSTED_TRAVEL_RULE_DATA })\n dispatch(sentMoney(response))\n })\n .catch(err => {\n if (isInstrumentDebitFailedError(err)) {\n return dispatch(\n UnifiedActions.fetchFundingOptionsAndShowFundingOptionsOverpanel()\n )\n }\n\n Actions.handleError(dispatch)(err)\n Actions.resetScrollPosition()\n })\n }\n}\n\n// mostly used for analytics right?\n// TODO: any reason for using the thunk here?\nexport function sentMoney(response) {\n return (dispatch, getState) => {\n const {\n ppmeClaimUrl,\n showPPMeIframe,\n data: {\n transactions = {},\n compliance_info = {},\n amountFormatted,\n xsell = {},\n },\n } = response\n const {\n server: { env, paymentTypes },\n external: {\n showSuccessPage,\n recipientIdType,\n recipientId, // paypalme slug\n },\n theme: { themeId = '' },\n note: { note },\n recipient: { moneyPageOverPanel },\n transaction: {\n selectedFundingOption = {},\n is3DS2ChallengeRequired = false,\n },\n } = getState()\n\n let overpanelShownToUser = MONEY_PAGE.CONTROL_WEB\n\n // new variants only support gs/ff\n if (paymentTypes.includes('PERSONAL')) {\n overpanelShownToUser = moneyPageOverPanel\n }\n\n const {\n regulatory_information: {\n remittance_transfer_rule: { action } = {},\n status,\n } = {},\n payment_id,\n type = '',\n } = transactions\n const isRTR = action && action === 'DISPLAY_TRANSACTION_DISCLOSURES'\n const isOFAC = status === 'UNDER_REVIEW'\n let flavor = isRTR ? 'rtr' : ''\n flavor += isOFAC ? 'ofac' : ''\n const flowType = getFlowType()\n\n const pageGroup = `main:p2p:unified:${flowType}::done`\n const pageName = `main:p2p:unified:${flowType}::done:node::${flavor}`\n\n let pp_flow = themeId && flowType === 'send' ? 'p2p_gift' : undefined\n if (!pp_flow) {\n pp_flow = env\n }\n\n const has_note = note.length ? 1 : 0\n\n const threeDS2Contingency = extract3DS2Contingency(selectedFundingOption)\n const has3DS2Contingency = !isEmpty(threeDS2Contingency)\n const threeDS2ReferenceId = has3DS2Contingency\n ? threeDS2Contingency.three_ds_reference_id\n : ''\n\n const data = {\n trid: payment_id,\n txn_amt: amountFormatted,\n type,\n pp_flow,\n slug_name: recipientIdType === 'ppme' && recipientId,\n fltp: undefined,\n has_note,\n is_3ds_eligible: has3DS2Contingency,\n '3ds_ref_id': threeDS2ReferenceId,\n challenge_shown: is3DS2ChallengeRequired,\n page_variant: overpanelShownToUser,\n }\n\n dispatch({\n type: types.TRANSACTION.SENT_MONEY,\n meta: Actions.getAnalyticsMeta(INSTRUMENTATION_TYPES.ACTION_WITH_DATA, {\n linkName: flowType || 'sentMoneySuccessful',\n pageGroup,\n pageName,\n data,\n }),\n data: {\n paymentDetails: transactions,\n complianceInfo: compliance_info,\n amountFormatted,\n ppmeClaimUrl,\n showPPMeIframe,\n },\n receivedAt: Date.now(),\n })\n\n if (!isEmpty(xsell)) {\n dispatch({\n type: types.XSELL.DONE_XSELL_CONTENT,\n data: {\n xsell,\n },\n })\n }\n\n // we're also going to re-direct here after dispatching that message\n const targetUrl = `/homepage/${getFlowType()}/success`\n\n if (showSuccessPage) {\n routeTo(targetUrl, { replace: true })\n }\n\n dispatch({ type: 'externalHook:sendSuccess' })\n }\n}\n\nfunction showUnilateral(userCountryCode) {\n // default recipient's country to sender's country.\n // Limit this change to US for now.\n const countryFeatures = FeaturesConfig[userCountryCode] || {}\n if (countryFeatures.defaultUnilateralRecipientCountry) {\n return {\n type: types.TRANSACTION.SHOW_UNILATERAL,\n data: { userCountryCode },\n }\n }\n\n return {\n type: types.TRANSACTION.SHOW_UNILATERAL,\n data: { userCountryCode: '' },\n }\n}\n\nexport function setPreferredFundingSource(fundingSourceId) {\n return dispatch => {\n const matchBalanceSourceIds = /^HO/ // each balance has it's own id, so we've been given api to pass just BALANCE to cover everything\n fundingSourceId = matchBalanceSourceIds.test(fundingSourceId)\n ? 'BALANCE'\n : fundingSourceId\n dispatch({ type: types.TRANSACTION.POST_PREFERRED_FUNDING_SOURCE })\n return post('/myaccount/transfer/setPreferredFundingSource', {\n fundingSourceId,\n })\n .then(response => {\n dispatch({ type: types.TRANSACTION.POSTED_PREFERRED_FUNDING_SOURCE })\n dispatch(updatePreferredInClientData(fundingSourceId))\n })\n .catch(Actions.handleError(dispatch))\n }\n}\n\n/**\n * An action which will take a target source id which has just been set preferred at service layer, and will manually\n * add the preferred tag to the funding options in client side data. We must also remove preferred tag from anything else\n * that was preferred. This is so that we don't have to fetch again when the user saves a source as preferred.\n */\nfunction updatePreferredInClientData(targetSourceId) {\n return (dispatch, getState) => {\n const {\n transaction: { fundingOptions, selectedFundingOption },\n } = getState()\n const optionsWithPreferredRemoved = fundingOptions.map(\n removePreferredFromSourcesInOption\n )\n const optionsWithPreferredAdded = optionsWithPreferredRemoved.map(option =>\n addPreferredToSourceInOption(option, targetSourceId)\n )\n const selectedOptionWithPreferredRemoved = removePreferredFromSourcesInOption(\n selectedFundingOption\n )\n const selectedOptionWithPreferredAdded = addPreferredToSourceInOption(\n selectedOptionWithPreferredRemoved,\n targetSourceId\n )\n dispatch({\n type: types.TRANSACTION.UPDATE_PREFERRED_IN_CLIENT_DATA,\n data: {\n fundingOptions: optionsWithPreferredAdded,\n selectedFundingOption: selectedOptionWithPreferredAdded,\n },\n })\n }\n}\n\n/**\n * Resolves the Open Banking RTB (Real Time Balance) REFRESH and CONSENT contingencies\n * @param {string} action - Contingency to resolve\n * @param {Function} handleNext - Callback to execute after REFRESH contingency is resolved\n * @param {string} fundingId - This is only used when action is CONTINGENCY.CONSENT as it is not available in the store\n * @returns {Function}\n */\nexport function resolveRTBContingency(\n action,\n handleNext,\n fundingOptionId,\n base64EncodedJWTErrorFromWallet,\n trackFIContingency = () => {}\n) {\n const url = `/myaccount/transfer/send/rtb-contingency`\n const payload = {\n fundingOptionId,\n action,\n // CONTINGENCY.INVALID_CREDENTIALS is a wrapper around CONTINGENCY.REFRESH\n // used internally in p2pnodeweb to activate the CONSENT flow.\n ...(action === CONTINGENCY.INVALID_CREDENTIALS\n ? { action: CONTINGENCY.REFRESH }\n : {}),\n base64EncodedJWTErrorFromWallet,\n }\n\n return async (dispatch, getState) => {\n const {\n transaction: { fundingOptions },\n server: { env },\n } = getState()\n dispatch({ type: types.TRANSACTION.RESOLVE_RTB_CONTINGENCY })\n trackFIContingency()\n await fetch(url, payload)\n .then(response => {\n if (response && response.isRTBSuccess) {\n if (isV2PhaseTwo(env) && response.reviewRequired) {\n const bankWithEcheck =\n fundingOptions.find(({ id }) => id === fundingOptionId) || {}\n trackFIContingency(response.reviewRequired ? 'echeck' : 'success')\n batch(() => {\n dispatch(\n fetchFundingOptions({\n preselectedFundingOption: bankWithEcheck,\n handleFISelectorNext: handleNext,\n })\n )\n dispatch(Actions.changeSelectedFundingOption(fundingOptionId))\n })\n } else {\n trackFIContingency(response.eCheck ? 'echeck' : 'success')\n batch(() => {\n dispatch({\n type: types.TRANSACTION.RESOLVED_RTB_CONTINGENCY,\n data: {\n fundingOptionId,\n action,\n eCheck: response.eCheck,\n },\n })\n dispatch(Actions.changeSelectedFundingOption(fundingOptionId))\n })\n if (handleNext) {\n handleNext()\n }\n }\n }\n })\n .catch(err => {\n const response = err.responseJSON\n if (response && !response.isRTBSuccess && response.bankLoginRequired) {\n // Open Banking REFRESH_REAL_TIME_BALANCE contingency failed with invalid credentials\n // We change the contingency from REFRESH to CONSENT\n\n trackFIContingency('invalid_credentials')\n dispatch(Actions.changeSelectedFundingOption(fundingOptionId))\n dispatch({\n type: types.TRANSACTION.RTB_INVALID_CREDENTIALS,\n data: {\n ...payload,\n newContingency: CONTINGENCY.INVALID_CREDENTIALS,\n },\n })\n if (handleNext) {\n handleNext()\n }\n return\n }\n trackFIContingency('failure')\n if (err.code === 'errorPaymentDeniedForBank') {\n const fundingOption =\n fundingOptions.find(({ id }) => id === fundingOptionId) || {}\n const fundingSource = getRelevantFundingSource(fundingOption) || {}\n const accountType = buildFundingSourceAccountType(fundingSource)\n\n batch(() => {\n dispatch({\n type: types.TRANSACTION.RTB_ERROR,\n data: {\n fundingOptionId,\n },\n })\n\n dispatch(toggleFIUnavailableWarning(true, accountType))\n })\n } else {\n // 500s and unhandled exceptions\n dispatch(Actions.showError(err))\n }\n window.scrollTo({ top: 0, behavior: 'smooth' })\n })\n }\n}\n\nexport function saveSuccessfullyAddedFundingInstrumentIds(\n successfullyAddedFundingInstrumentIds\n) {\n return {\n type: types.TRANSACTION.SAVE_SUCCESS_ID,\n data: { successfullyAddedFundingInstrumentIds },\n }\n}\n\nexport function setOpenBankingError(openBankingError) {\n return {\n type: types.TRANSACTION.SET_OPEN_BANKING_ERROR,\n data: { openBankingError },\n }\n}\n\nexport function toggleFIUnavailableWarning(unavailableFI, accountType) {\n return {\n type: types.TRANSACTION.UNAVAILABLE_FI,\n data: { unavailableFI, accountType },\n }\n}\n\nexport function redirectToBankLogin(data) {\n const mainWindow = isIframe() ? window.top : window\n const url = '/myaccount/transfer/flow/fi/banklogin'\n return dispatch => {\n return postJson(url, data)\n .then(({ redirectUrl }) => {\n mainWindow.location = redirectUrl\n })\n .catch(err => {\n Actions.handleError(dispatch)(err)\n Actions.resetScrollPosition()\n })\n }\n}\n\nfunction getAddFIPayload(state, override = {}) {\n const isPPShops = state.server.env === FLOW_TYPES.PPSHOPS\n let flowType = getFlowType()\n if (!flowType && state.transaction.isPurchase !== undefined) {\n flowType = state.transaction.isPurchase ? 'buy' : 'send'\n }\n return {\n flowType,\n amount: state.amount.amount,\n currencyCode: state.amount.currencyCode,\n payerId: state.recipient.payerId,\n recipient: state.recipient.recipient,\n unilateralName: state.unilateral.name,\n unilateralCountryCode: state.unilateral.countryCode,\n mayCashAdvanceFeesApply: state.recipient.mayCashAdvanceFeesApply,\n isPurchase: state.transaction.isPurchase,\n personalContextID: state.transaction.personalContextID,\n purchaseContextID: state.transaction.purchaseContextID,\n displayName: state.recipient.displayName,\n thumbnailUrl: state.recipient.thumbnailUrl,\n networkId: state.recipient.networkId,\n flowIntent: state.server.flowIntent,\n note: state.note.note,\n token: state.recipient.token,\n obFlow: OPEN_BANKING_FLOWS.ADD_BANK,\n isMgm: state.server.isMgm,\n mgmTrafficSource: getTrafficSource(),\n isAShop: state.recipient.isAShop,\n ...(isPPShops && {\n productId: state.recipient.productId,\n productQuantity: state.recipient.productQuantity,\n }),\n ...override,\n ...getSessionDataPayload(),\n }\n}\n\nexport function redirectToAddFI(override = {}) {\n const mainWindow = isIframe() ? window.top : window\n const url = '/myaccount/transfer/flow/fi/new'\n return (dispatch, getState) => {\n const state = getState()\n const payload = getAddFIPayload(state, override)\n if (hasAddFiPostMigration()) {\n post(url, payload)\n .then(response => {\n const { redirectURL = {} } = response\n tracking(Events.p2p_add_fi_screen_shown())\n mainWindow.location.assign(redirectURL)\n })\n .catch(err => {\n return dispatch(Actions.showError(err))\n })\n } else {\n const fiFlowUrl = generateFIFlowUrl(payload)\n tracking(Events.p2p_add_fi_screen_shown())\n mainWindow.location.assign(fiFlowUrl)\n }\n }\n}\n\nexport function handleUserAgreementConsent(handleSubmit) {\n return (dispatch, getState) => {\n const {\n transaction: {\n selectedFundingOption: { id: fundingOptionId },\n userAgreementConsentRequired,\n userAgreementConsentMinVersion,\n userAgreementConsentMaxVersion,\n },\n server: { env },\n } = getState()\n\n const payload = {\n fundingOptionId,\n userAgreementConsentRequired,\n env,\n userAgreementConsentMinVersion,\n userAgreementConsentMaxVersion,\n }\n\n tracking(\n Events.active_consent_disclaimer_agree_pressed({\n flow: 'p2p_send_money',\n policy_major_version: userAgreementConsentMaxVersion,\n policy_minor_version: userAgreementConsentMinVersion,\n })\n )\n\n dispatch({ type: types.TRANSACTION.REQUEST_USER_AGREEMENT_CONSENT })\n\n const userFlowType = 'send'\n const url = `/myaccount/transfer/${userFlowType}/user-agreement-consent-contingency`\n post(url, payload)\n .then(response => {\n dispatch({ type: types.TRANSACTION.RESOLVE_USER_AGREEMENT_CONSENT })\n // Re-submit to proceed with transaction\n handleSubmit()\n Actions.resetScrollPosition()\n })\n .catch(err => {\n logger.error(err)\n })\n }\n}\n","/**\n * Router Abstraction so it's easier to swap out routing implementations. This\n * will navigate to a new route. This makes it easier to change from Backbone Router\n * to React Router etc...\n */\n\nimport log from 'loglevel'\nimport { push, replace, goBack, goForward } from 'connected-react-router'\nimport reduxStore from '../stores/configureStore'\nimport { getUrlFragment } from './url-utils'\n\n/**\n * Will navigate to a new route. This implementation uses the browserHistory module\n * that comes with react-router\n * @param targetRoute string - '/request'. New url to route to\n * @param options {obj} - Optional object with options\n * @param options.replace {bool} - If set, use react-router--redux replace()\n * @param options.refresh {bool} - say to use raw window.location methods (causes full page refresh)\n */\nexport function routeTo(targetRoute, options = {}) {\n log.info(`routeTo: '${targetRoute}'`, options)\n const fullPath = getFullURL(targetRoute)\n if (options.refresh) {\n if (options.replace) {\n window.location.replace(fullPath)\n } else {\n window.location.assign(fullPath)\n }\n } else if (options.replace) {\n reduxStore.dispatch(replace(fullPath))\n } else {\n reduxStore.dispatch(push(fullPath))\n }\n}\n\n/**\n * Get a full URL by checking the redux store for the\n * root and appending it if needed.\n */\nexport function getFullURL(path) {\n const state = reduxStore.getState()\n const { rootURL } = state.server\n if (path.includes(rootURL)) {\n path = getUrlFragment(path, rootURL)\n }\n const fullPath = rootURL + path\n return fullPath\n}\n\nexport const back = () => {\n reduxStore.dispatch(goBack())\n}\n\nexport const forward = () => {\n reduxStore.dispatch(goForward())\n}\n","export default {\n 'bank-of-america': true,\n clydesdale: true,\n elo: true,\n maestro: true,\n regions: true,\n virgin: true,\n banorte: true,\n cofifis: true,\n 'fifth-third': true,\n mastercard: true,\n santander: true,\n 'visa-electron': true,\n '4etoiles': true,\n barclays: true,\n cofinoga: true,\n hiper: true,\n nationwide: true,\n solo: true,\n visa: true,\n 'american-express': true,\n 'capital-one': true,\n 'cooperative-bank': true,\n hipercard: true,\n natwest: true,\n 'standard-chartered': true,\n 'wells-fargo': true,\n aura: true,\n cb: true,\n credit: true,\n holding: true,\n 'payment-card': true,\n star: true,\n yorkshire: true,\n aurire: true,\n cetelem: true,\n delta: true,\n hsbc: true,\n 'paypal-balance': true,\n suntrust: true,\n aurora: true,\n 'jp-morgan-chase-bank-na': true,\n chase: true,\n diners: true,\n huntington: true,\n 'paypal-credit': true,\n switch: true,\n banamex: true,\n 'china-union-pay': true,\n discover: true,\n jcb: true,\n pnc: true,\n td: true,\n bancomer: true,\n kiwi: true,\n postepay: true,\n us: true,\n 'bank-account': true,\n citi: true,\n ec: true,\n lloyds: true,\n rbs: true,\n usaa: true,\n 'paypal-mastercard': true,\n 'ebay-mastercard': true,\n 'smart-connect': true,\n 'japan-post-bank': true,\n 'sumitomo-mitsui-banking-corp': true,\n 'mizuho-bank': true,\n 'mufg-bank': true,\n 'resona-bank': true,\n 'saitama-resona-bank': true,\n}\n","import React from 'react'\nimport {\n PAYMENT_TOKEN_TYPES,\n PAYMENT_CARDS,\n CREDIT_PROVIDERS,\n} from '../../constants'\nimport {\n INSTRUMENT_TYPES,\n PP_CREDIT_PROMO_STATE,\n} from '../../../../../lib/constants'\nimport enRTRStrings from '../../../../../config/enRTRStrings'\nimport content from 'pp-react-l10n'\nimport _, { get } from 'lodash'\nimport { formatAmount } from '../currencyUtils'\nimport { getCfpbContentKey } from '../../../lib/contentUtils'\nimport sourceLogoMap from '../funding-source-logo-map'\nimport { StyleSheet, css } from 'lib/paypalphrodite'\nimport * as staticUtils from './staticUtils'\n\nimport serverProps from '../serverProps'\nimport { BodyText } from '@paypalcorp/pp-react'\nexport * from './staticUtils'\n\nconst i18n = content('transfer/inc/fundingOptionDisplayName')\n\nconst CDN_HOST_NAME = _.get(serverProps, 'cdnHostName')\nconst PAYPAL_BALANCE_KEY = 'fundingType.paypalBalance'\n\nconst styles = StyleSheet.create({\n externalProviderLogo: {\n width: '38px',\n height: '15px',\n },\n verticleLine: {\n width: '1px',\n display: 'inline-block',\n height: '11px',\n border: '1px solid lightGrey',\n marginLeft: '7px',\n marginRight: '7px',\n },\n marginFixProviderLogo: {\n marginTop: '-5px',\n },\n})\n\n// TODO test this\nexport function buildBalanceToggleDisplayName(\n balanceSource,\n isCFPBEnabledCountry,\n userAccountType\n) {\n const {\n total_funds_in: { amount, currency_code: currencyCode },\n } = balanceSource\n const strippedNumber = amount.replace(/[^0-9.,]/g, '')\n const formattedAmount = formatAmount(\n strippedNumber,\n currencyCode,\n 'CURRENCY_FORMAT_SYMBOLISOCURRENCY'\n )\n const contentKey = getCfpbContentKey(\n 'displayName.balanceToggle',\n isCFPBEnabledCountry,\n userAccountType\n )\n return i18n(contentKey, {\n formattedAmount: (\n \n {formattedAmount}\n \n ),\n })\n}\n\n/**\n * Used as a standardizer for the logo urls on paypal objects.\n */\nexport function generateSourceLogoUrls(\n source,\n isCFPBEnabledCountry,\n userAccountType,\n isCardArtEnabled\n) {\n // if the server returns a logo url, use it\n if (isCardArtEnabled && source.thumbnail_logo_url) {\n return source.thumbnail_logo_url\n }\n\n let sourceName = getFundingSourceName(\n source,\n isCFPBEnabledCountry,\n userAccountType\n ) // try for something like 'Bank Of America'\n\n if (typeof sourceName !== 'string') {\n sourceName = ''\n }\n\n let normalizedSourceName = sourceName\n .replace(/[.,]|\\s\\(.*\\)/g, '')\n .replace(/[\\s_]/g, '-')\n .replace(/&#(\\d+);/g, '') // To remove numeric html entities\n .toLowerCase()\n\n // For UK guest flow, visa type is visa/delta/electron\n if (normalizedSourceName === 'visa/delta/electron') {\n normalizedSourceName = 'visa'\n }\n\n const logoExists = sourceLogoMap[normalizedSourceName]\n if (logoExists) {\n return `${CDN_HOST_NAME}/digitalassets/c/consumer/p2p/funding-sources/${normalizedSourceName}.png`\n }\n\n // otherwise fallback to the default type logos (generic card, bank, etc. image)\n const instrumentType = source.instrument_type || ''\n const normalizedInstrumentType = instrumentType\n .replace(/[.,]/g, '')\n .replace(/[\\s_]/g, '-')\n .toLowerCase()\n\n return `${CDN_HOST_NAME}/digitalassets/c/consumer/p2p/funding-sources/${normalizedInstrumentType}.png`\n}\n\n/**\n * Makes display names for \"funding sources\" which are actually multiple balance sources bundled together as a single source.\n * The UI of the funding options selector treats this as a single source: \"PayPal Balance (USD, EUR)\", for example.\n */\nexport function buildMultiCurrencyBalanceDisplayName(\n fundingOption,\n isCFPBEnabledCountry,\n userAccountType\n) {\n const { funding_sources } = fundingOption\n const currencyCodes = funding_sources.map(\n source => source.total_funds_in.currency_code\n )\n const formattedCurrencyCodes = currencyCodes.join(', ')\n return `${i18n(\n getCfpbContentKey(PAYPAL_BALANCE_KEY, isCFPBEnabledCountry, userAccountType)\n )} (${formattedCurrencyCodes})`\n}\n\n/* A failed lookup on properties files does not return\n an empty string nor undefined, but rather a function\n whose inner script is the failed lookup path\n*/\nexport function safelyGetDynamicPropertiesValue(key) {\n const propertyValue = i18n(`fundingType.${key}`)\n if (typeof propertyValue === 'function' || !propertyValue) {\n return ''\n }\n\n return propertyValue\n}\n\nexport function safelyGetDynamicPropertiesValueENRTR(key) {\n const propertyValue = enRTRStrings[`fundingType.${key}`]\n if (!propertyValue) {\n return ''\n }\n\n return propertyValue\n}\n\n/**\n * Funding source titles should be displayed as name + type + lastFour. This will handle any normal funding source.\n * e.g. Bank of America Checking x-1337\n */\nexport function buildFundingSourceDisplayName(\n source,\n isCFPBEnabledCountry,\n userAccountType,\n isCardArtEnabled\n) {\n if (isCardArtEnabled) {\n return staticUtils.decodeEntities(\n `${source.choice_name ||\n getFundingSourceName(source, isCFPBEnabledCountry, userAccountType)}`\n )\n }\n const name = getFundingSourceName(\n source,\n isCFPBEnabledCountry,\n userAccountType\n )\n const shouldShowPaymentType =\n source.type && source.instrument_type !== INSTRUMENT_TYPES.CREDIT\n\n const type = get(source, 'type', '').toLowerCase()\n const paymentType = shouldShowPaymentType\n ? safelyGetDynamicPropertiesValue(type)\n : ''\n\n const lastFour = source.fi_last_4_content || ''\n return `${i18n('fundingType.displayName', {\n cardName: name,\n paymentType,\n })} ${lastFour}`\n}\n\nexport function buildFundingSourceDisplayNameENRTR(\n source,\n isCFPBEnabledCountry,\n userAccountType,\n isCardArtEnabled\n) {\n if (isCardArtEnabled) {\n return staticUtils.decodeEntities(\n `${source.choice_name ||\n getFundingSourceNameENRTR(\n source,\n isCFPBEnabledCountry,\n userAccountType\n )}`\n )\n }\n const name = getFundingSourceNameENRTR(\n source,\n isCFPBEnabledCountry,\n userAccountType\n )\n const shouldShowPaymentType =\n source.type && source.instrument_type !== INSTRUMENT_TYPES.CREDIT\n\n const type = get(source, 'type', '').toLowerCase()\n const paymentType = shouldShowPaymentType\n ? safelyGetDynamicPropertiesValueENRTR(type)\n : ''\n\n const lastFour = source.fi_last_4_content || ''\n return `${name} ${paymentType} ${lastFour}`\n}\n\n/**\n * Funding source account type should be displayed as\n * name\n * type + lastFour\n * Using names returned\n * e.g. Bank of America\n * Checking x-1337\n */\nexport function buildFundingSourceAccountType(\n source,\n showENSubTextRTR = false\n) {\n const shouldShowPaymentType =\n source.type && source.instrument_type !== INSTRUMENT_TYPES.CREDIT\n\n const type = get(source, 'type', '').toLowerCase()\n const propertyValue = showENSubTextRTR\n ? safelyGetDynamicPropertiesValueENRTR(type)\n : safelyGetDynamicPropertiesValue(type)\n const paymentType = shouldShowPaymentType ? propertyValue : ''\n\n const lastFour = source.fi_last_4_content || ''\n const providerLogoUrl = get(source, 'external_wallet.provider_logo_url')\n\n // If external wallet provider logo is passed, we will use that instead\n // ie: Chase Pay\n if (providerLogoUrl) {\n return (\n
\n \n \n {paymentType} {lastFour}\n
\n )\n } else if (!providerLogoUrl) {\n return staticUtils.decodeEntities(`${paymentType} ${lastFour}`)\n }\n}\n\n/**\n *\n * If the user is making purchase transaction above 99 USD, using PayPal Credit as funding source,\n * based on the tags, showing if special offer is not applicable\n */\nexport function getPPCreditSpecialOfferText(source = {}) {\n /**\n * SRE bot's throws an error for dangerously set innerHTML. This is a workaround for\n * legitimate use cases\n * It is not a user input, it is for English content for locale values from enRTRStrings.json\n */\n const workaroundScoreBot = ['dangerously', 'Set', 'Inner', 'HTML'].join('')\n const setInnerHTML = key => ({\n [workaroundScoreBot]: {\n __html: key,\n },\n })\n\n if (\n source.ppcreditPromoFinancingOffer === PP_CREDIT_PROMO_STATE.NOT_APPLICABLE\n ) {\n return setInnerHTML(enRTRStrings['fundingType.ppCreditOfferNotApplicable'])\n } else if (\n source.ppcreditPromoFinancingOffer === PP_CREDIT_PROMO_STATE.ELIGIBLE\n ) {\n return setInnerHTML(enRTRStrings['fundingType.ppCreditOfferEligible'])\n } else if (\n source.ppcreditPromoFinancingOffer === PP_CREDIT_PROMO_STATE.INELIGIBLE\n ) {\n return setInnerHTML(enRTRStrings['fundingType.ppCreditOfferNotEligible'])\n }\n return null\n}\n\nexport function getFundingSourceName(\n source = {},\n isCFPBEnabledCountry,\n userAccountType\n) {\n switch (source.instrument_type) {\n case INSTRUMENT_TYPES.HOLDING:\n return getSingleBalanceName(source, isCFPBEnabledCountry, userAccountType)\n case INSTRUMENT_TYPES.PAYMENT_CARD:\n return getPaymentCardNetwork(source)\n case INSTRUMENT_TYPES.PAYMENT_TOKEN:\n return getPaymentTokenSourceName(source)\n case INSTRUMENT_TYPES.CREDIT:\n return getCreditName(source)\n case INSTRUMENT_TYPES.BANK_ACCOUNT:\n return source.bank_name\n default:\n return ''\n }\n}\n\nexport function getFundingSourceNameENRTR(\n source = {},\n isCFPBEnabledCountry,\n userAccountType\n) {\n switch (source.instrument_type) {\n case INSTRUMENT_TYPES.HOLDING:\n return getSingleBalanceNameENRTR(\n source,\n isCFPBEnabledCountry,\n userAccountType\n )\n case INSTRUMENT_TYPES.PAYMENT_CARD:\n return getPaymentCardNetworkENRTR(source)\n case INSTRUMENT_TYPES.PAYMENT_TOKEN:\n return getPaymentTokenSourceName(source)\n case INSTRUMENT_TYPES.CREDIT:\n return getCreditNameENRTR(source)\n case INSTRUMENT_TYPES.BANK_ACCOUNT:\n return source.bank_name\n default:\n return ''\n }\n}\n\n// if the funding source has reason as CIP required for holding instrument type, it should show up as unclaimed balance\nexport function getUnclaimedBalanceDisplayName(source) {\n const {\n total_funds_in: { amount },\n } = source\n\n return `${i18n('fundingType.unclaimedBalance', {\n amount,\n })}`\n}\n\nexport function getUnclaimedBalanceDisplaySubText() {\n return i18n('fundingType.unclaimedBalanceSubText')\n}\n\nfunction getSingleBalanceName(source, isCFPBEnabledCountry, userAccountType) {\n const { total_funds_in: { currency_code } = {} } = source\n\n const key = getCfpbContentKey(\n PAYPAL_BALANCE_KEY,\n isCFPBEnabledCountry,\n userAccountType\n )\n const name = i18n(key)\n\n if (currency_code) {\n return `${name} (${currency_code})`\n }\n\n return name\n}\n\nfunction getSingleBalanceNameENRTR(\n source,\n isCFPBEnabledCountry,\n userAccountType\n) {\n const {\n total_funds_in: { currency_code },\n } = source\n return `${\n enRTRStrings[\n getCfpbContentKey(\n PAYPAL_BALANCE_KEY,\n isCFPBEnabledCountry,\n userAccountType\n )\n ]\n } (${currency_code})`\n}\n\nexport function getPaymentTokenSourceName(source) {\n switch (source.type) {\n case PAYMENT_TOKEN_TYPES.AMEX_P2P_PASS:\n return source.generic_issuer_name\n default:\n return source.type\n }\n}\n\nexport function getPaymentCardNetwork(source) {\n switch (source.network) {\n case PAYMENT_CARDS.VISA:\n return i18n('fundingType.visa')\n case PAYMENT_CARDS.MASTERCARD:\n case PAYMENT_CARDS.MASTER_CARD:\n return i18n('fundingType.mastercard')\n case PAYMENT_CARDS.MAESTRO:\n return i18n('fundingType.maestro')\n case PAYMENT_CARDS.AMEX:\n return i18n('fundingType.amex')\n case PAYMENT_CARDS.DISCOVER:\n return i18n('fundingType.discover')\n case PAYMENT_CARDS.CHINA_UNION_PAY:\n return i18n('fundingType.china_union_pay')\n default:\n return source.network\n }\n}\n\nexport function getPaymentCardNetworkENRTR(source) {\n switch (source.network) {\n case PAYMENT_CARDS.VISA:\n return enRTRStrings['fundingType.visa']\n case PAYMENT_CARDS.MASTERCARD:\n case PAYMENT_CARDS.MASTER_CARD:\n return enRTRStrings['fundingType.mastercard']\n case PAYMENT_CARDS.MAESTRO:\n return enRTRStrings['fundingType.maestro']\n case PAYMENT_CARDS.AMEX:\n return enRTRStrings['fundingType.amex']\n case PAYMENT_CARDS.DISCOVER:\n return enRTRStrings['fundingType.discover']\n case PAYMENT_CARDS.CHINA_UNION_PAY:\n return enRTRStrings['fundingType.china_union_pay']\n default:\n return source.network\n }\n}\n\nexport function getCreditName(source) {\n switch (source.provider) {\n case CREDIT_PROVIDERS.PLUS_CARD:\n return i18n('fundingType.dualcardplus')\n case CREDIT_PROVIDERS.VIRTUAL_LINE:\n return i18n('fundingType.smartConnect')\n case CREDIT_PROVIDERS.EBAY_CARD:\n return i18n('fundingType.dualcardebay')\n case CREDIT_PROVIDERS.PAYPAL_CREDIT:\n return i18n('fundingType.paypalCredit')\n default:\n return source.provider\n }\n}\n\nexport function getCreditNameENRTR(source) {\n switch (source.provider) {\n case CREDIT_PROVIDERS.PLUS_CARD:\n return enRTRStrings['fundingType.dualcardplus']\n case CREDIT_PROVIDERS.VIRTUAL_LINE:\n return enRTRStrings['fundingType.smartConnect']\n case CREDIT_PROVIDERS.EBAY_CARD:\n return enRTRStrings['fundingType.dualcardebay']\n case CREDIT_PROVIDERS.PAYPAL_CREDIT:\n return enRTRStrings['fundingType.paypalCredit']\n default:\n return source.provider\n }\n}\n\nexport function buildBankDetails(\n selectedFundingOption,\n isCFPBEnabledCountry,\n userAccountType,\n isCardArtEnabled\n) {\n const bankDetails = {}\n const fundingSource = staticUtils.getRelevantFundingSource(\n selectedFundingOption\n )\n const src = generateSourceLogoUrls(\n fundingSource,\n isCFPBEnabledCountry,\n userAccountType,\n isCardArtEnabled\n )\n const title = buildFundingSourceDisplayName(\n fundingSource,\n isCFPBEnabledCountry,\n userAccountType,\n isCardArtEnabled\n )\n const accountType = buildFundingSourceAccountType(fundingSource)\n\n bankDetails.src = src\n bankDetails.title = title\n bankDetails.accountType = accountType\n return bankDetails\n}\n\n/**\n * getFundingNameType is a helper function used currently to populate tracking data in some screens\n * @param {Object} selectedFundingOption - an object of selected funding option\n * @returns {{fi_name: string, fi_type: string}}\n */\nexport function getFundingNameType(selectedFundingOption = {}) {\n const { funding_sources = [] } = selectedFundingOption\n // only selected funding source is needed\n const funding_source = funding_sources[0] || {}\n\n const { instrument_type = 'noinstrument_type' } = funding_source\n\n // in case of PP balance generic_issuer_name/type are not populated\n if (instrument_type === 'HOLDING') {\n return {\n fi_name: 'PAYPAL',\n fi_type: 'BALANCE',\n }\n }\n\n const { type: fi_type = 'notype' } = funding_source\n const { generic_issuer_name: fi_name = 'noname' } = funding_source\n\n return {\n fi_name,\n fi_type,\n }\n}\n\nexport function hasFundingBalanceInfo(source) {\n const balance = get(source, 'balance.amount')\n return !!balance\n}\n\nexport function getFundingSourceBalanceInfo(source) {\n const balance = get(source, 'balance.amount')\n return formatAmount(balance.value, balance.currencyCode)\n}\n","import _ from 'lodash'\n\nimport serverProps from '../public/js/transfer/utils/serverProps'\n\nimport LINKS from './links.json'\n\nconst LIVE_HOST_NAME = _.get(serverProps, 'liveHostName')\n\nexport default {\n successHeader: [\"You've sent\", 'to'],\n successShopsHeader: ['You paid'],\n giftSuccessHeader: [\"You've sent a gift of\", 'to'],\n youSent: 'You sent:',\n youPaid: 'You paid:',\n fee: 'Fee:',\n recipientName: 'will get:',\n reactConversionRate: 'Conversion rate:',\n fundsAvailabilityDate: 'Funds Availability Date',\n thirdPartyFees: 'Recipient may receive less due to foreign taxes.',\n giftBlurb: [\n 'We’ll let',\n 'know you sent a gift. You can see the details in your Activity in case you need them later.',\n ],\n SPECIAL_LIMITS:\n 'The recipient has a lifetime limit to send, spend or withdraw. Upon reaching this limit, the recipient must take certain actions to lift the limit.',\n NO_SPECIAL_LIMITS_VERIFIED_PPZ:\n 'Note: The recipient will be able to withdraw the money on this date.',\n NO_SPECIAL_LIMITS_VERIFIED_NO_PPZ_SEND_ENABLED:\n 'Note: The recipient can send or spend the full amount on this date. If the recipient wishes to withdraw money, limits may apply.',\n NO_SPECIAL_LIMITS_UNVERIFIED_SEND_ENABLED:\n 'Note: Currently, there are limits to how much the recipient can send, spend or withdraw. To access the full amount on this date, the recipient can link a bank or card.',\n NO_SPECIAL_LIMITS_NO_SEND_ENABLED:\n 'Sorry, this information currently is unavailable.',\n UNAVAILABLE: 'Sorry, this information currently is unavailable.',\n UNILATERAL:\n 'Note: To access the funds, recipient must open a PayPal account and link and confirm a bank or a card.',\n RECIPIENT_HAS_RESERVES_OR_RESTRICTIONS:\n \"The payment will be credited to the recipient's PayPal account. The recipient will be able to access the funds according to the terms of their PayPal User agreement. This should Not impact the shipping date or any agreement you have with the seller.\",\n needToCancel: 'Need to cancel?',\n needToCancelContent:\n \"You have the right to cancel for a full refund unless your designated recipient has already received the payment. However, since most PayPal payments are received within seconds, you may not be able to cancel your payment for a full refund once the payment is made. To determine whether your payment is eligible for cancellation, log in to PayPal.com, select the transaction in your transaction details, and select Cancel, or call PayPal Customer Service at 1-888-221-1161.\",\n aboutDisputes: 'About disputes',\n aboutDisputesContent:\n \"

If this payment is for an item you purchased but haven’t received, or it’s not as described, your purchase may be covered under PayPal’s purchase protection. In those cases, you can file a dispute in the Resolution Center within 180 days of payment. Just log in to PayPal at PayPal.com and go to the Resolution Center or call Customer Service at 1-888-221-1161.

If you have a different problem with this payment sent to someone outside the United States – for example, the payment was never received, or it was processed for the wrong amount – you have up to 180 days to dispute it. To file a dispute for this payment or to request a written explanation of your rights, go to the Resolution Center or call Customer Service.

If you don't recognize this payment or want to report it as unauthorized, you should contact the Resolution Center at PayPal.com or call Customer Service.

\",\n 'rtr.aboutDisputesPara.one':\n \"

If this payment is for an item you purchased but haven’t received, or it’s not as described, your purchase may be covered under PayPal, Inc.’s purchase protection. In those cases, you can file a dispute in the Resolution Center within 180 days of payment. Just log in to your PayPal account at www.paypal.com and go to the Resolution Center or call Customer Service at 1-888-221-1161.

\",\n 'rtr.aboutDisputesPara.two':\n \"

You have a right to dispute errors in your transaction. If you think there is an error, such as a payment that was never received or that was processed for the wrong amount, contact Customer Service at 1-888-221-1161 within 180 days. You can also contact us for a written explanation of your rights.

\",\n 'rtr.aboutDisputesPara.three':\n \"

If you don’t recognize this payment or want to report it as unauthorized, you should contact the Resolution Center at PayPal.com or call Customer Service at the number above.

\",\n agencyInfo:\n 'For questions or complaints about PayPal, you can contact these agencies:',\n consumerFinance:\n \"

Consumer Financial Protection Bureau

(855)411-2372 or
(855)729-2372 (TTY/TDD)

www.consumerfinance.gov

\",\n optionsNewCreditCardExchangeRate:\n 'Your card issuer will determine the currency conversion rate and what fees they may charge. Check your statement for the final amount.',\n infoFee: 'This rate includes a currency conversion spread.',\n infoLookForFee:\n 'This rate includes a currency conversion spread. The amount you’ll pay may change as we lock in your rate, so check your final amount and fee details before you send.',\n infoBetterFee:\n 'Good news! We found a better rate and applied it here. This rate includes a currency conversion spread.',\n infoSimpleFeeDisclaimer: 'This rate includes a currency conversion spread.',\n instructionsNewForeignExchangeDisclaimer:\n 'PayPal makes money through this exchange rate when we convert your currency.',\n infoNewFeeDisclaimer:\n 'In addition to the fee listed above, PayPal makes money through this exchange rate when we convert your currency.',\n outlookCopyQuestion: 'What happens next?',\n outlookCopyAnswer:\n \"They'll get an email from PayPal letting them know that the money is waiting for them. If they don't already have a PayPal account, they can create one instantly for free.\",\n outlookCopyHelpCenter:\n \"If you have questions, check out the Help Center at PayPal.com\",\n 'label.youreDonatingRecurringWith': 'Donating monthly from',\n 'label.yourePayingWith': \"You're sending with\",\n 'label.youreDonatingWith': 'Donating from',\n 'label.sendText': \"You'll send\",\n 'label.subtotalText': 'Subtotal',\n 'copy.feeText': 'PayPal fee',\n 'copy.free': 'No Fee for you',\n 'rtr.youllDonate': \"You'll donate\",\n 'rtr.total': 'Total',\n 'label.inSeconds': 'In seconds',\n 'label.paymentDelivery': 'Payment delivery',\n 'rtr.youllPay': \"You'll pay\",\n 'rtr.shipping': 'Shipping',\n 'rtr.recipientGets': 'will get',\n 'content.currencyConversion': 'Conversion rate:',\n 'currencyConversion.paypalExchangeRate': 'Exchange rate:',\n 'currencyConversion.cardExchangeRate': 'Exchange rate: Unknown',\n 'rtr.thirdPartyFees': 'Recipient may receive less due to foreign taxes.',\n 'fundingType.paypalBalance': 'PayPal Balance',\n 'fundingType.paypalBalanceCfpb': 'Balance',\n 'fundingType.creditCard': 'Credit Card',\n 'fundingType.paypalCredit': 'PayPal Credit',\n 'fundingType.ppCreditOfferNotApplicable':\n 'Not eligible for special financing offer',\n 'fundingType.ppCreditOfferEligible': `No Interest if paid in full in 6 months. See terms`,\n 'fundingType.ppCreditOfferNotEligible': `Pay over time for this purchase. See terms`,\n 'fundingType.smartConnect': 'PayPal Smart Connect',\n 'fundingType.smartConnectWithBalance':\n 'PayPal Smart Connect (with PP balance)',\n 'fundingType.checking': 'Checking',\n 'fundingType.credit': 'Credit',\n 'fundingType.debit': 'Debit',\n 'fundingType.savings': 'Savings',\n 'fundingType.visa': 'Visa',\n 'fundingType.mastercard': 'Mastercard',\n 'fundingType.amex': 'American Express',\n 'fundingType.discover': 'Discover',\n 'fundingType.china_union_pay': 'UnionPay',\n 'fundingType.dualcardplus': 'PayPal MasterCard®',\n 'fundingType.dualcardpluswithbalance':\n 'PayPal MasterCard® (with PP balance)',\n 'fundingType.dualcardebay': 'eBay MasterCard®',\n 'fundingType.dualcardebaywithbalance':\n 'eBay MasterCard® (with PP balance)',\n 'fundingType.paypal': 'PayPal',\n 'fundingType.maestro': 'Maestro',\n 'label.cvvText': 'Please enter the 3-4 digits security code on your card.',\n 'label.cvvHelperText':\n 'The CVV is the 3-digit number on the back of your card.',\n 'copy.echek': 'Money should be there around.',\n 'copy.iach': 'The money will be sent right away.',\n 'copy.feeIsIncluded': 'Charge includes fee',\n 'currency.conversion.paypal': 'Convert currency with PayPal',\n 'currency.conversion.cardIssuer': 'Convert currency with card issuer',\n 'currency.conversion.card': 'Convert currency with card',\n 'copy.sellerFee': 'Seller Fee',\n 'copy.sellerWillGet': 'Seller will get',\n 'sendDetail.yourTotal': 'Your total',\n note: 'Add a note',\n 'unified.paymentTypeToggle.send': 'Sending to a friend',\n 'unified.paymentTypeToggle.buy': 'Paying for an item or service',\n 'shield.paymentTypeTogglePurchaseProtection': 'More on Purchase Protection',\n 'unified.paymentTypeToggleBuyHelperText':\n 'Get a full refund if an eligible item gets lost or damaged. Seller pays a small fee.',\n 'unified.paymentTypeToggleSendHelperText':\n 'Purchase Protection doesn’t apply for this payment.',\n 'unified.paymentTypeToggle.personal': 'Personal',\n 'unified.paymentTypeToggle.protection': 'Purchase',\n 'label.yourShippingAddress': 'Your shipping address',\n 'label.yourMailingAddress': 'Your mailing address',\n 'label.addNewShippingAddress': '+ Add a new shipping address',\n 'label.addNewMailingAddress': '+ Add a new mailing address',\n 'label.notifyUserText': \"We'll notify them with a text on your behalf\",\n 'recipientInfo.nameLabel': \"Recipient's name\",\n 'recipientInfo.defaultCountry': \"Recipient's country or region of residence\",\n 'shield.explanation': 'Eligible purchases are covered by ',\n 'shield.paypalPurchaseProtection': 'PayPal Purchase Protection',\n 'unified.purchaseProtectionLink': '/webapps/mpp/paypal-safety-and-security',\n 'description.userAgreement': [\n 'For more information please read our',\n 'user agreement',\n ],\n 'description.paymentMethods':\n \"View PayPal Policies and your payment method rights.\",\n 'description.poolsTermsAndConditions':\n \"This is a personal contribution with the same rights as a friends and family payment. For more details, please read our Money Pools terms and conditions.\",\n 'disclosure.stateMandatedWarning':\n 'Make sure you know who you’re sending to. If you’re scammed, you won’t be able to get your money back.',\n}\n","/**\n * These utils consist of helper methods for travel rule. Travel rule is triggered\n * when a user is sending more than $3000.00 using PayPal balance or credit card.\n * The travel rule info is contained within the funding option, and generally the\n * user will need to enter a form of government ID and date of birth. The user may\n * also have to enter a non-P.O. Box address. These utils help with checking if\n * travel rule is in effect, which inputs need to be filled out by the user, and\n * validating the date entered into the date of birth inputs.\n *\n * TODO: implement travel rule non-P.O. Box address utils, if needed\n */\n\nimport _ from 'lodash'\nimport { GOVT_ID_TYPES } from '../constants'\n\n/**\n * Method that checks whether or not a date is valid. Useful for validating a\n * user's inputted date of birth for travel rule\n *\n * @param day {String|Number}\n * @param month {String|Number}\n * @param year {String|Number}\n * @returns {Boolean} - true if date is valid\n */\nexport function isDOBValid(day, month, year) {\n if (!day || !month || !year) {\n return false\n }\n const month_in_date = month - 1\n\n const date = new Date(year, month_in_date, day)\n return date.getMonth() === month_in_date\n}\n\n/**\n * Method that pulls the contingency data off of the selected funding option\n * @param selectedFundingOption {Object} - the selected funding option\n * @returns Array of Strings - e.g. ['GOVT_ID']\n */\nexport function calculateAttributesToCollect(selectedFundingOption = {}) {\n const { contingencies = [] } = selectedFundingOption\n const contingencyNeedingDataCollection = _.find(contingencies, {\n action: 'PERFORM_DATA_COLLECTION',\n })\n const attributesToCollect = _.get(\n contingencyNeedingDataCollection,\n 'data_collection_details.attributes',\n []\n )\n return attributesToCollect\n}\n\n/**\n * Returns whether or not travel rule is in effect for selected funding option\n *\n * TODO: add non-P.O. box address travel rule to this check\n *\n * @param selectedFundingOption {Object} - the selected funding option\n * @returns {Boolean} - true if travel rule is in effect\n */\nexport function isTravelRule(selectedFundingOption) {\n return calculateAttributesToCollect(selectedFundingOption).length > 0\n}\n\n/**\n * Returns whether or not travel rule is in effect and the user needs to input\n * a government ID\n *\n * @param selectedFundingOption {Object} - the selected funding option\n * @returns {Boolean} - true if user needs to input government ID\n */\nexport function isTravelRuleGovernmentId(selectedFundingOption) {\n return calculateAttributesToCollect(selectedFundingOption).includes('GOVT_ID')\n}\n\n/**\n * Returns whether or not travel rule is in effect and the user needs to input\n * a new, non-P.O. box address\n *\n * @param selectedFundingOption {Object} - the selected funding option\n * @returns {Boolean} - true if user needs to input new, non-P.O. box address\n */\nexport function isTravelRuleAddress(selectedFundingOption) {\n return calculateAttributesToCollect(selectedFundingOption).includes(\n 'NON_PO_BOX_ADDRESS'\n )\n}\n\n/**\n * Returns whether or not the currently inputted government ID is valid, based\n * on regex rules for each type of government ID\n *\n * @param governmentId {String} - the currently inputted government ID\n * @param selectedGovernmentIdType {String} - the currently selected government ID type\n * @returns {Boolean} - true if government ID passes regex test\n */\nexport function isGovernmentIdValid(governmentId, selectedGovernmentIdType) {\n const patterns = {\n [GOVT_ID_TYPES.SSN]: /(^\\d{3}-?\\d{2}-?\\d{4}$|^XXX-XX-XXXX$)/i,\n [GOVT_ID_TYPES.ITIN]: /(^\\d{2}-?\\d{7}$|^XX-XXXXXXX$)/i,\n [GOVT_ID_TYPES.ALIEN]: /(^.*$)/,\n [GOVT_ID_TYPES.PASSPORT]: /(^.*$)/,\n }\n\n const pattern = patterns[selectedGovernmentIdType]\n\n if (governmentId.match(pattern)) {\n return true\n }\n\n return false\n}\n\n/**\n * Returns whether or not the currently inputted address is valid, based on\n * whether there is PO Box in either of the first two lines, or if any of the\n * required fields are blank\n *\n * @param newTravelRuleAddress {Object} - the current travel rule address being inputted\n * @param hasPostcodeError {Boolean} - whether or not there is an invalid postcode inputted\n * @returns {Boolean} - true if the address is valid\n */\nexport function isTravelRuleAddressValid(\n newTravelRuleAddress,\n hasPostcodeError\n) {\n if (hasPostcodeError) {\n return false\n }\n\n const {\n line1 = '',\n line2 = '',\n city = '',\n state = '',\n postcode = '',\n } = newTravelRuleAddress\n\n // if either of the address lines has PO box-like words, or the city is 'dpo',\n // it is invalid\n if (hasPOBox(line1) || hasPOBox(line2) || isCityPOBox(city)) {\n return false\n }\n\n return !!(line1 && city && state && postcode)\n}\n\n/**\n * Returns whether or not there is likely 'PO Box' or some variation of it\n * somehwere in a string\n *\n * @param str {String} - the string to test\n * @returns {Boolean} - true if the string has PO Box\n */\nexport function hasPOBox(str = '') {\n const poBoxContainMatches = ['pobox', 'pobx', 'pbox', 'pbx']\n const poBoxExactMatches = ['pob', 'pb', 'po']\n const testString = str.replace(/[^a-zA-Z]/g, '').toLowerCase()\n if (\n poBoxContainMatches.some(poBoxString => testString.includes(poBoxString))\n ) {\n return true\n }\n if (poBoxExactMatches.some(poBoxString => testString === poBoxString)) {\n return true\n }\n return false\n}\n\nexport function isCityPOBox(city = '') {\n const cityPOBoxes = ['dpo', 'fpo', 'apo']\n return cityPOBoxes.includes(city.toLowerCase())\n}\n\n/**\n * Returns whether or not we have all necessary info for travel rule\n *\n * @returns {Boolean} - true if all travel rule info is present and valid\n */\nexport function hasAllNeededTravelRuleInfo(props) {\n const {\n selectedFundingOption,\n governmentId,\n selectedGovernmentIdType,\n newTravelRuleAddress,\n } = props\n if (\n isTravelRuleGovernmentId(selectedFundingOption) &&\n !isGovernmentIdValid(governmentId, selectedGovernmentIdType)\n ) {\n return false\n }\n if (\n isTravelRuleAddress(selectedFundingOption) &&\n !isTravelRuleAddressValid(newTravelRuleAddress)\n ) {\n return false\n }\n return true\n}\n\n/**\n * Massages data from props (react/redux land) into the correct form we need to\n * post to the server\n *\n * @returns {Object} - object to be used to post to the server\n */\nexport function massageTravelRuleDataForPost(props) {\n const {\n selectedFundingOption,\n governmentId,\n selectedGovernmentIdType,\n newTravelRuleAddress,\n country,\n } = props\n const { line1, line2, city, state, postcode } = newTravelRuleAddress\n\n let trData = {}\n\n if (isTravelRuleGovernmentId(selectedFundingOption)) {\n trData = {\n ...trData,\n identifierIssuer: selectedGovernmentIdType,\n identifierValue: governmentId,\n }\n }\n if (isTravelRuleAddress(selectedFundingOption)) {\n trData = {\n ...trData,\n street1: line1,\n street2: line2,\n city,\n state,\n postalCode: postcode,\n countryCode: country,\n errorMessage: 'Please enter your street address (no P.O. boxes)',\n }\n }\n return trData\n}\n","import { isEmpty, get } from 'lodash'\nimport { trackImpression, trackLinkWithData } from '../../lib/analytics/fpti'\nimport {\n getPaymentCardNetwork,\n getRelevantFundingSource,\n} from 'transfer/utils/funding-option-utils'\nimport { trackClick3ds2 } from './unified-send-analytics'\nimport { startDDCCall, endDDCCall } from '../actions/send'\n\n/**\n * Collect Browser Context only for 3DS2.0 Resolve Contingency\n * */\nexport function collectBrowserContext() {\n const browserColorDepth = `_${window.screen.colorDepth}BITS`\n const browserContext = {\n browser_screen_height: window.screen.height,\n browser_screen_width: window.screen.width,\n browser_color_depth: browserColorDepth,\n browser_timezone_offset_minutes: new Date().getTimezoneOffset(),\n browser_language: window.navigator.language,\n browser_java_enabled: !!window.navigator.javaEnabled(),\n }\n return browserContext\n}\n\nexport function extract3DS2Contingency({ contingencies = [] }) {\n const foundContingency = contingencies.find(\n contingency => contingency.action === '3D_SECURE_DATA_COLLECTION_REQUIRED'\n )\n return foundContingency || {}\n}\n\nexport function track3DS2PageImpression(\n pageGroup,\n pageName,\n fundingOption = {}\n) {\n const { id: fundingOptionId } = fundingOption\n const threeDS2Contingency = extract3DS2Contingency(fundingOption)\n const has3DS2Contingency = !isEmpty(threeDS2Contingency)\n let threeDS2ReferenceId = ''\n\n if (has3DS2Contingency) {\n threeDS2ReferenceId = threeDS2Contingency.three_ds_reference_id\n }\n const fundingSource = getRelevantFundingSource(fundingOption)\n const network = getPaymentCardNetwork(fundingSource)\n\n const analyticsData = {\n fi_id: fundingOptionId,\n is_3ds_eligible: has3DS2Contingency,\n '3ds_ref_id': threeDS2ReferenceId,\n sel_fmx_tp: network,\n }\n trackImpression(pageGroup, pageName, analyticsData)\n}\n\n// Track impression for (3ds2.0) DDC start call after\n// retrieving fundingOptions when the user clicks continue\nexport function track3ds2PageStartDDC(ddcInfo = {}, isGuest = false) {\n const {\n fundingOptionId = '',\n threeDS2ReferenceId = '',\n threeDSecureProtocol = '',\n deviceDataCollectionMode = '',\n } = ddcInfo\n const startTime = performance.now()\n const sharedAnalytics = {\n is_3ds_eligible: true,\n version: `3DS${threeDSecureProtocol}`,\n resp_duration: {\n fi_id: fundingOptionId,\n '3ds_ref_id': threeDS2ReferenceId,\n ddc_wait_time: deviceDataCollectionMode,\n ddc_start_time: startTime,\n },\n }\n if (isGuest) {\n return trackClick3ds2('guestSend', {\n fi_type: 'card',\n ...sharedAnalytics,\n })\n }\n const pageName = `main:p2p:choice:fioption::node`\n const pageGroup = `main:p2p:choice:fioption`\n const trackingData = { ...sharedAnalytics }\n trackLinkWithData('Continue', pageGroup, pageName, trackingData, 'link', {})\n}\n\nexport function track3ds2PostDDCAnalytics(isGuest, startTime, endTime) {\n // Track the start and end times for various calls\n let analyticsPage = ''\n if (isGuest) {\n analyticsPage = 'guestReview'\n } else {\n analyticsPage = 'onClickSendPaymentNow'\n }\n trackClick3ds2(analyticsPage, {\n resp_duration: {\n lookup_start_time: startTime,\n Spinner_start_time: startTime,\n Spinner_end_time: performance.now(),\n lookup_end_time: endTime,\n },\n })\n}\n\n// Used for sync variant when the DDC call has completed\nexport function track3DS2EndDDC(ddcInfo = {}, wasSuccessful = true) {\n const pageGroup = 'main:p2p::cards:authenticate_with_card_network'\n const pageName = 'main:p2p::cards:authenticate_with_card_network::'\n const {\n fundingOptionId = '',\n threeDS2ReferenceId = '',\n threeDSecureProtocol = '',\n deviceDataCollectionMode = '',\n } = ddcInfo\n const endTime = performance.now()\n const trackingData = {\n is_3ds_eligible: true,\n version: `3DS${threeDSecureProtocol}`,\n resp_duration: {\n fi_id: fundingOptionId,\n '3ds_ref_id': threeDS2ReferenceId,\n ddc_wait_time: deviceDataCollectionMode,\n ddc_end_time: endTime,\n was_successful: wasSuccessful,\n },\n }\n trackLinkWithData(\n 'Send Payment Now',\n pageGroup,\n pageName,\n trackingData,\n 'link'\n )\n}\n\n/**\n * Resolves when DDC call event has completed\n * This function first dispatches the start DDC call and then returns a resolvable\n * promise that will wait until the cardinal collect event has fired.\n *\n * 1. Once fired: the listener is removed, end DDC is dispatched, and promise\n * is resolved.\n *\n * 2. If never fired (timeout) or errors: The promise will be resolved in order to\n * continue flow.\n *\n * @param {Function} dispatch - redux dispatch function\n * @param {Object} ddcInfo - contains DDC contigency info for funding option\n */\nexport function cardinalDDCCallPromise(dispatch, ddcInfo) {\n dispatch(startDDCCall(ddcInfo))\n const isGuest = window.location.href.includes('/guestLogin/payRequest/')\n track3ds2PageStartDDC(ddcInfo, isGuest)\n return new Promise(resolve => {\n let resolved = false\n // Listener function to handle success case\n const listener = function(event) {\n if (event.origin && event.origin.includes('cardinalcommerce.com')) {\n let data = null\n try {\n data = JSON.parse(event.data)\n } catch (exception) {\n // Error handler incase parsing goes wrong\n data = {}\n }\n if (get(data, 'MessageType', '') === 'profile.completed') {\n resolved = true\n window.removeEventListener('message', listener)\n track3DS2EndDDC(ddcInfo)\n dispatch(endDDCCall())\n resolve() // Resolve on success\n }\n }\n }\n\n // Start event listener to listen to successful response\n window.addEventListener('message', listener)\n\n // Resolve on timeout to get response after 15 seconds\n // Handles case where we get error or no response\n setTimeout(() => {\n if (!resolved) {\n window.removeEventListener('message', listener)\n track3DS2EndDDC(ddcInfo, false)\n dispatch(endDDCCall())\n resolve()\n }\n }, 15000)\n })\n}\n\n// Extracts deviceDataCollectionMode and check if it's the fire and forget variant\nexport function isFireAndForget(ddcCalls = []) {\n // We only need to check one call since if one is fire and forget, they shall all be.\n const ddcCall = ddcCalls[0]\n return get(ddcCall, 'deviceDataCollectionMode', '') === 'FIRE_AND_FORGET'\n}\n\n/**\n * This Function checks if Browser back button is pressed while the 3DS process is ongoing.\n * This is required to handle duplicate lookup calls and avoid OverPanel Loop\n * https://github.paypal.com/ConsumerWeb-R/p2pnodeweb/pull/9514 -PR\n * https://engineering.paypalcorp.com/confluence/display/NGW/Duplicate+Look+up+call+Test+Cases\n * payRequest is ignore for this for two reasons, first if the user initiates a browser back then\n * the user is redirected to summary and secondly history.action is set to POP on load for pay request.\n */\nexport function isBrowserBackPressedFor3DSFlow(\n hasResolvedDDCContingencies,\n selectedFundingOption,\n hasResolved3DS2Contingencies,\n is3DS2ChallengeRequired,\n history\n) {\n return (\n ((!hasResolvedDDCContingencies &&\n selectedFundingOption.hasDDCContingency) ||\n (!hasResolved3DS2Contingencies && is3DS2ChallengeRequired)) &&\n history &&\n history.action === 'POP' &&\n !history.location.pathname.includes('/payRequest')\n )\n}\n","import _ from 'lodash'\nimport awesomeDebouncePromise from 'awesome-debounce-promise'\nimport * as ViewActions from './Actions'\nimport * as SendActions from './send'\nimport * as PayRequestActions from './pay-request'\nimport { fetch, post } from '../../calculator/lib/xhr'\nimport {\n ActionTypes as types,\n ERROR_COMPLIANCE_DENIED,\n PAYMENT_TYPE_FLOW_MAP,\n TRANSFER_BASE_URL,\n ERROR_PAYMENT_FAILURE,\n} from '../constants'\nimport { routeTo } from '../utils/routeHelper'\nimport { prepareXBInitialState } from '../utils/xbFeeCalcUtils'\nimport {\n trackGuestClickPmtChoice,\n trackImpressionUnifiedSend,\n} from '../utils/unified-send-analytics'\nimport { changeUnilateralCountryCode } from './unilateral'\nimport { removeMailto } from '../utils/remove-mailto'\nimport { tracking } from '../../lib/analytics/mParticle'\nimport Events from '../../lib/analytics/eventTags'\nimport { Preview } from 'transfer/lazy-components'\nimport { hasContactConfidenceTreatment } from 'experiments/contact-confidence'\nimport { isBizSearchTreatment } from 'experiments/bizSearch'\nimport { isV2PricingReq } from 'experiments/v2'\nimport {\n getIsConfidentInRecipient,\n getHasSentToRecipient,\n} from '../../lib/recipient'\nimport {\n getRecipientFromContact,\n getHasSentToContact,\n} from '../../lib/contact-utils'\nimport { isPhoneNumberMaybe } from 'transfer/utils/phoneUtils'\nimport { preloadImage } from '../../lib/image-utils'\nimport { defaultUnilateralRecipientToSenderCountry } from 'lib/unilateral-utils'\nimport {\n toggleContactConfidenceOverpanel,\n toggleUnilateralRecipientChoiceOverpanel,\n} from './overpanels'\nimport { getContactConfidenceAnalyticsData } from 'transfer/utils/contact-confidence-analytics'\nimport {\n PAYMENT_TYPE,\n MONEY_PAGE,\n PRODUCT_FLOWS,\n ENV_TYPE,\n} from '../../../../lib/constants'\nimport { getFlowType, parseSearch } from '../utils/url-utils'\nimport { trackSearchResultImpression } from '../utils/directory-search-analytics'\nimport reduxStore from '../stores/configureStore'\nimport { trackActivity } from '../../lib/analytics/fpti'\nimport logger from 'loglevel'\nimport { isIframe } from 'iframe-support'\nimport { handleInterstitialCipFlow } from '../utils/homeInfoUtils'\nimport { getTrafficSource } from '../utils/mgmUtils'\nimport { showError } from './Actions'\nimport { getSessionDataPayload } from 'transfer/utils/session'\n\n/**\n * Fetch contact emails/phones so the user can select which one to send/request to/from. It may not be clear\n * which piece of information should be used if the contact has multiple pieces of contact information. If\n * there is only one contact method (i.e. a single email/phone) then skip the overpanel and continue the flow\n * {FormattedContact} contact - contact that was selected by user to send/request to/from\n * {Function} onSingleRecipient - callback function in the case that there is only a single recipient\n */\nexport function fetchUnilateralRecipientChoices({\n contact = {},\n onSingleRecipient = () => {},\n} = {}) {\n return (dispatch, getState) => {\n dispatch({ type: types.RECIPIENT.REQUEST_UNILATERAL_RECIPIENT_CHOICES })\n\n return fetch(`/myaccount/transfer/peers/${contact.id}`)\n .then(({ emails = [], phones = [] } = {}) => {\n dispatch({\n type: types.RECIPIENT.RECEIVED_UNILATERAL_RECIPIENT_CHOICES,\n })\n\n if (\n (emails.length === 1 && phones.length === 0) ||\n (emails.length === 0 && phones.length === 1)\n ) {\n const updatedContact = { ...contact }\n if (emails.length) {\n Object.assign(updatedContact, {\n email: emails[0],\n phones: [],\n })\n } else {\n Object.assign(updatedContact, {\n email: '',\n phones: [phones[0]],\n })\n }\n\n onSingleRecipient(updatedContact)\n } else {\n dispatch(\n ViewActions.selectUnilateralContact({ ...contact, emails, phones })\n )\n\n dispatch(toggleUnilateralRecipientChoiceOverpanel({ show: true }))\n }\n })\n .catch(ViewActions.handleError(dispatch))\n }\n}\n\nexport function fetchRecipientDetails({\n contact,\n linkName,\n isContact,\n enableAnalytics,\n flowType,\n enableContactConfidence = false,\n}) {\n // preload preview chunk\n Preview.preload()\n\n contact = removeMailto(contact) // remove 'mailto:' from email\n const recipient = getRecipientFromContact(contact)\n\n return (dispatch, getState) => {\n dispatch({ type: types.CROSS_BORDER.REQUEST_RECIPIENT_DETAILS }) // Show spinner\n return fetch('/myaccount/transfer/recipientDetails', {\n recipient,\n lastTransactionType: contact.transaction_type,\n flowType,\n payerId: contact.payerId,\n networkId: contact.networkId,\n })\n .then(\n ({\n data: { recipientDetails = {}, beaconClientMetaDataId = '' },\n } = {}) => {\n if (beaconClientMetaDataId) {\n dispatch({\n type: types.TRANSACTION.SET_FRAUDNET_CLIENT_METADATA,\n data: { beaconClientMetaDataId },\n })\n }\n\n if (recipientDetails.triggerSenderPhoneConfirmation) {\n dispatch({ type: types.USER.TRIGGER_SENDER_PHONE_CONFIRMATION })\n }\n const analytics = { linkName, enableAnalytics, isContact }\n\n checkSenderElgibilty(recipientDetails, dispatch)\n\n if (\n // We only block the sender at this point for 2 cases\n // 1.If both personal and purchase payments are disabled\n (recipientDetails.isSenderPersonalPaymentDisabled &&\n recipientDetails.isSenderPurchasePaymentDisabled) ||\n // 2.If the sender clicks on the recipient bubble\n ((recipientDetails.isSenderPersonalPaymentDisabled ||\n recipientDetails.isSenderPurchasePaymentDisabled) &&\n contact.transaction_type)\n ) {\n return checkandRedirectToHomeinfo(\n recipientDetails,\n analytics,\n contact\n )\n }\n\n handleRecipientDetails({\n recipientDetails,\n contact,\n analytics,\n store: getState(),\n dispatch,\n enableContactConfidence,\n })\n\n trackServiceAndClientDecision(recipientDetails)\n }\n )\n .catch(ViewActions.handleError(dispatch))\n }\n}\n\n/*\ne:\"ac\"\n[FPTI]\npage:\"main:p2p:tab-contacts:decision\"\npgrp:\"main:p2p:tab-contacts:decision\"\n[Amplitude]\nevent_name:\"client_server_display_decision_consensus_reached\"\n\ndefault_payment_type:\"{\"client\":,\"service\":}\"\nui_variant:\"{\"client\":,\"service\":}\"\npayment_type_selection_behavior:\"{\"client\":,\"service\":}\"\ncal_correlation_id:\nproduct_entry_point:\"\"\nusage_mode:\"\"\nsuggested_payment_type:\"{\"client\":,\"service\":}\"\nservice_client_match: \"y\" if client/services is matching else \"n\"\n */\nexport function trackServiceAndClientDecision(recipientDetails) {\n const { serviceContext = {}, suggestedPaymentType } = recipientDetails\n const pageGroup = 'main:p2p:tab-contacts:decision'\n const pageName = 'main:p2p:tab-contacts:decision'\n\n const default_payment_type = `{\"client\":${serviceContext.defaultPaymentType},\"service\":${serviceContext.defaultPaymentType}}`\n const ui_variant = `{\"client\":${serviceContext.moneyPageOverPanel},\"service\":${serviceContext.moneyPageOverPanel}}`\n const payment_type_selection_behavior = `{\"client\":${serviceContext.selectionBehavior},\"service\":${serviceContext.selectionBehavior}}`\n const suggested_payment_type = `{\"client\":${suggestedPaymentType},\"service\":${serviceContext.suggestedPaymentType}}`\n\n let service_client_match = 'n'\n if (suggestedPaymentType === serviceContext.suggestedPaymentType) {\n service_client_match = 'y'\n }\n\n const extraData = {\n e: 'ac',\n default_payment_type,\n ui_variant,\n payment_type_selection_behavior,\n cal_correlation_id: serviceContext.correlationId,\n product_entry_point: serviceContext.productEntryPoint,\n usage_mode: serviceContext.usageMode,\n suggested_payment_type,\n service_client_match,\n }\n\n if (\n serviceContext.usageMode === 'SHADOW' ||\n serviceContext.usageMode === 'LIVE'\n ) {\n trackActivity(pageGroup, pageName, extraData)\n tracking({\n event_name: 'client_server_display_decision_consensus_reached',\n ...extraData,\n })\n }\n}\n\nexport function updateTxn() {\n return function(dispatch, getState) {\n const {\n transaction: { preselectedFundingOption },\n amount: { amount, currencyCode },\n recipient: {\n recipient,\n payerId,\n displayName,\n token,\n networkId,\n thumbnailUrl,\n },\n crossBorder: { fxQuoteId },\n note: { note },\n server: { env, triggerSenderPhoneConfirmation },\n } = getState()\n\n const payload = {\n recipient,\n amount,\n currencyCode,\n payerId,\n networkId,\n note,\n token,\n fxQuoteId,\n env,\n }\n dispatch({ type: types.CROSS_BORDER.REQUEST_RECIPIENT_DETAILS }) // Show spinner\n\n post('/myaccount/transfer/fi/update-sender-receiver', payload)\n .then(response => {\n updateTxnSuccess(response, dispatch, {\n isV2: true,\n triggerSenderPhoneConfirmation,\n phoneConfirmData: {\n flowType: getFlowType(),\n amount,\n currencyCode,\n payerId,\n recipient,\n displayName,\n thumbnailUrl,\n },\n preselectedFundingOption,\n })\n })\n .catch(err => {\n logger.error(err)\n updateTxnFail(dispatch, preselectedFundingOption)\n })\n }\n}\n\nexport function sendMoreInfoToAssessCapabilities() {\n return function(dispatch, getState) {\n const {\n transaction: { preselectedFundingOption },\n amount: { amount, currencyCode },\n recipient: { recipient, payerId, displayName, networkId, thumbnailUrl },\n note: { note },\n server: { triggerSenderPhoneConfirmation },\n } = getState()\n\n const payload = {\n recipient,\n amount,\n currencyCode,\n payerId,\n networkId,\n note,\n }\n dispatch({ type: types.CROSS_BORDER.REQUEST_RECIPIENT_DETAILS }) // Show spinner\n post('/myaccount/transfer/fi/reassess-capabilities', payload)\n .then(response => {\n updateTxnSuccess(response, dispatch, {\n triggerSenderPhoneConfirmation,\n phoneConfirmData: {\n amount,\n currencyCode,\n payerId,\n recipient,\n displayName,\n thumbnailUrl,\n },\n preselectedFundingOption,\n })\n })\n .catch(ViewActions.handleError(dispatch))\n }\n}\n\nfunction updateTxnSuccess(response, dispatch, options = {}) {\n const {\n data: { serviceContext, suggestedPaymentType },\n } = response\n\n if (!options.isV2) {\n trackServiceAndClientDecision({ serviceContext, suggestedPaymentType })\n }\n\n if (response.data && response.data.paymentTypeSelectionMessage) {\n dispatch({\n type: types.TRANSACTION.UPDATE_PAYMENT_TYPE_SELECTION_MESSAGE,\n data: {\n message: response.data.paymentTypeSelectionMessage,\n },\n })\n }\n\n if (response.data && response.data.paymentTypeTogglePersonalMessage) {\n dispatch({\n type: types.TRANSACTION.UPDATE_PAYMENT_TYPE_TOGGLE_PERSONAL_MESSAGE,\n data: {\n message: response.data.paymentTypeTogglePersonalMessage,\n },\n })\n }\n\n if (response.data && response.data.paymentTypeTogglePurchaseMessage) {\n dispatch({\n type: types.TRANSACTION.UPDATE_PAYMENT_TYPE_TOGGLE_PURCHASE_MESSAGE,\n data: {\n message: response.data.paymentTypeTogglePurchaseMessage,\n },\n })\n }\n\n if (\n response.data &&\n response.data.paymentTypeTransitions &&\n !_.isEmpty(response.data.paymentTypeTransitions)\n ) {\n dispatch({\n type: types.TRANSACTION.UPDATE_PAYMENT_TYPE_TRANSITIONS,\n data: {\n paymentTypeTransitions: response.data.paymentTypeTransitions,\n },\n })\n }\n\n if (response.data && response.data.token) {\n dispatch({\n type: types.TRANSACTION.UPDATE_TOKEN,\n data: {\n token: response.data.token,\n moreInfoIsNeededForAssessCapabilities:\n response.data.paymentTypeSelectionDecision !== 'COMPLETED',\n },\n })\n }\n\n dispatch({\n type: types.TRANSACTION.UPDATE_SUGGESTED_DESIGN,\n data: { suggestedDesign: response.data.moneyPageOverPanel },\n })\n\n dispatch({\n type: types.TRANSACTION.UPDATE_MONEY_PAGE,\n data: { moneyPageOverPanel: response.data.moneyPageOverPanel },\n })\n\n dispatch({\n type: types.TRANSACTION.CHANGE_HIGHLIGHTED_PAYMENT_TYPE,\n data: {\n highlightPaymentType: response.data.highlightPaymentType,\n },\n })\n\n if (response.data) {\n dispatch(setContextID(response.data))\n }\n\n dispatch({\n type: types.TRANSACTION.CHANGE_IS_HARD_DEFAULT,\n data: { isHardDefault: response.data.isHardDefault },\n })\n\n if (response.data.receiverFee) {\n dispatch({\n type: types.AMOUNT.ADD_RECEIVER_FEE,\n data: { fee: response.data.receiverFee },\n })\n }\n\n dispatch({ type: types.OVERPANELS.STOP_LOADING }) // Hide spinner\n\n // if reassess call returned suggestedPaymentType, we should default to buy/send instead of showing overpanel\n if (\n [PAYMENT_TYPE.PERSONAL, PAYMENT_TYPE.PURCHASE].includes(\n response.data.suggestedPaymentType\n )\n ) {\n if (options.triggerSenderPhoneConfirmation) {\n options.phoneConfirmData.flowType =\n PAYMENT_TYPE_FLOW_MAP[response.data.suggestedPaymentType]\n return dispatch(redirectToDolphin(options.phoneConfirmData))\n }\n\n dispatch(\n SendActions.fetchFundingOptions({\n preselectedFundingOption: options.preselectedFundingOption,\n })\n )\n return routeTo(\n `/homepage/${\n PAYMENT_TYPE_FLOW_MAP[response.data.suggestedPaymentType]\n }/preview`\n )\n }\n\n if (\n options.isV2 &&\n options.phoneConfirmData &&\n (options.phoneConfirmData.flowType === 'buy' ||\n options.phoneConfirmData.flowType === 'send')\n ) {\n if (options.triggerSenderPhoneConfirmation) {\n return dispatch(redirectToDolphin(options.phoneConfirmData))\n }\n\n return dispatch(\n SendActions.fetchFundingOptions({\n preselectedFundingOption: options.preselectedFundingOption,\n })\n )\n }\n\n return dispatch(togglePaymentTypeChoiceOverpanel({ show: true }))\n}\n\nfunction updateTxnFail(dispatch, preselectedFundingOption) {\n dispatch({ type: types.OVERPANELS.STOP_LOADING }) // Hide spinner\n\n dispatch({\n type: types.TRANSACTION.UPDATE_MONEY_PAGE,\n data: { moneyPageOverPanel: MONEY_PAGE.CONTROL_WEB },\n })\n\n const flowType = getFlowType()\n if (flowType === 'buy' || flowType === 'send') {\n return dispatch(\n SendActions.fetchFundingOptions({\n preselectedFundingOption: preselectedFundingOption,\n })\n )\n }\n\n dispatch(togglePaymentTypeChoiceOverpanel({ show: true }))\n}\n\nfunction checkSenderElgibilty(recipientDetails, dispatch) {\n if (recipientDetails.isSenderPersonalPaymentDisabled) {\n dispatch({\n type: types.USER.DISABLE_PERSONAL_PAYMENT,\n data: {\n isSenderPersonalPaymentDisabled:\n recipientDetails.isSenderPersonalPaymentDisabled,\n personalCipUrl: recipientDetails.personalCipUrl,\n },\n })\n }\n\n if (recipientDetails.isSenderPurchasePaymentDisabled) {\n dispatch({\n type: types.USER.DISABLE_PURCHASE_PAYMENT,\n data: {\n isSenderPurchasePaymentDisabled:\n recipientDetails.isSenderPurchasePaymentDisabled,\n purchaseCipUrl: recipientDetails.purchaseCipUrl,\n },\n })\n }\n\n if (recipientDetails.requireSenderInstrumentAddition) {\n dispatch({\n type: types.USER.REQUIRE_INSTRUMENT_ADDITION,\n data: {\n requireSenderInstrumentAddition:\n recipientDetails.requireSenderInstrumentAddition,\n },\n })\n }\n}\n\nfunction checkandRedirectToHomeinfo(recipientDetails, analytics, contact) {\n const { payerId } = contact\n const {\n suggestedPaymentType,\n isSenderPersonalPaymentDisabled,\n isSenderPurchasePaymentDisabled,\n } = recipientDetails\n const { isContact } = analytics\n const params = {\n flowType: suggestedPaymentType === 'PURCHASE' ? 'buy' : 'send',\n payerId: payerId,\n }\n if (isSenderPersonalPaymentDisabled && isSenderPurchasePaymentDisabled) {\n return handleInterstitialCipFlow()\n }\n if (\n (isSenderPersonalPaymentDisabled || isSenderPurchasePaymentDisabled) &&\n isContact\n ) {\n return handleInterstitialCipFlow(params)\n }\n}\n\n/**\n * Redirect to Dolphin Flow for Phone Confirmation\n * @param data\n * @returns {Function}\n */\nexport function redirectToDolphin(data) {\n return (dispatch, getState) => {\n const {\n server: { env = '', isMgm = false, flowIntent },\n unilateral: { name, countryCode },\n recipient: { isUnilateral, token },\n } = getState()\n const {\n flowType,\n amount,\n currencyCode,\n payerId,\n recipient,\n displayName,\n thumbnailUrl,\n } = data\n\n const mgmTrafficSource = getTrafficSource()\n\n const phoneConfirmationPayload = {\n token,\n flowType,\n amount,\n currencyCode,\n payerId,\n recipient,\n displayName,\n thumbnailUrl,\n env,\n isMgm,\n mgmTrafficSource,\n ...(isUnilateral && {\n unilateralName: name,\n unilateralCountryCode: countryCode,\n }),\n flowIntent,\n ...getSessionDataPayload(),\n }\n\n const phoneConfirmationFlowUrl =\n '/myaccount/transfer/flow/fi/phoneconfirmation'\n const mainWindow = isIframe() ? window.top : window\n post(phoneConfirmationFlowUrl, phoneConfirmationPayload)\n .then(response => {\n const { redirectURL = {} } = response\n mainWindow.location.assign(redirectURL)\n })\n .catch(err => {\n logger.error(err)\n })\n }\n}\n\nexport function redirectToHomeinfo(data) {\n return (dispatch, getState) => {\n dispatch({\n type: types.EXTERNAL.REDIRECT_TO_HOMEINFO,\n })\n handleInterstitialCipFlow(data)\n }\n}\n\nexport function proceedWithClaim() {\n return dispatch => {\n dispatch({\n type: types.UNILATERAL.CLAIM_PROCESS_LINKING,\n })\n\n const currentUrl = window.location.pathname || ''\n const pathArray = currentUrl.split('/')\n const filteredPathArray = pathArray.filter(p => p !== '')\n const idx = filteredPathArray.length - 1\n const txnNum = filteredPathArray.length > 0 ? filteredPathArray[idx] : ''\n const { skipV2, contextData } = parseSearch()\n\n if (!txnNum && !contextData) {\n dispatch({\n type: types.UNILATERAL.CLAIM_ERROR,\n data: { isLinkingFailed: true },\n })\n }\n\n const linkingType =\n filteredPathArray[idx - 1] === 'reveal'\n ? 'reveal/revealLinking'\n : 'claimLinking'\n\n let url = `/myaccount/transfer/${linkingType}?contextData=${contextData}`\n\n // TODO: needs to be removed after first launch of claim money changes in URL, this is to support fallback\n if (!contextData && txnNum) {\n url = `/myaccount/transfer/${linkingType}/${txnNum}`\n }\n\n post(url, { skipV2: !!+skipV2 })\n .then(() => {\n dispatch({\n type: types.UNILATERAL.CLAIM_SUCCESS,\n data: { isLinkingSuccess: true },\n })\n })\n .catch(err => {\n if (err.code === ERROR_COMPLIANCE_DENIED) {\n dispatch(\n showError(err, {\n onClosed: function() {\n routeTo(TRANSFER_BASE_URL, { refresh: true, replace: true })\n },\n })\n )\n }\n\n dispatch({\n type: types.UNILATERAL.CLAIM_ERROR,\n data: {\n ...(ERROR_PAYMENT_FAILURE === err.code && {\n settingsError: err.message,\n settingsErrorCode: err.code,\n }),\n isLinkingFailed: true,\n },\n })\n })\n }\n}\n\nexport function togglePaymentTypeChoiceOverpanel({\n show,\n isGuest = false,\n analytics = {},\n}) {\n return (dispatch, getState) => {\n const { recipient, amount, note } = getState()\n if (show) {\n if (isGuest) {\n trackGuestClickPmtChoice()\n }\n tracking(\n Events.p2p_payment_type_screen_shown({\n suggested_protection_design: recipient.suggestedDesign,\n receiver_country: recipient.country,\n receiver_currency: amount.currencyCode,\n sender_currency: amount.fromCurrencyCode,\n protection_design: recipient.moneyPageOverPanel,\n receiver_account_type: recipient.recipientAccountType,\n note_character_length: note.note.length,\n payment_type_selection_message: recipient.paymentTypeSelectionMessage\n ? 'y'\n : 'n',\n })\n )\n trackImpressionUnifiedSend('paymentChoice', analytics)\n // remove flfr so that it does not confuse preview page\n window.flfr = null\n }\n dispatch({\n type: types.OVERPANELS.TOGGLE_PAYMENT_TYPE_CHOICE_OVERPANEL,\n data: { show },\n })\n }\n}\n\nexport function fetchCountryData(toCountryCode) {\n return function(dispatch) {\n if (toCountryCode) {\n dispatch({\n type: types.CROSS_BORDER.REQUEST_COUNTRY_DATA,\n data: { toCountryCode },\n })\n\n const url = `/myaccount/transfer/fx/countrydata/${toCountryCode}`\n\n return fetch(url, {})\n .then(response => {\n dispatch(receiveCountryData(toCountryCode, response))\n })\n .catch(ViewActions.handleErrorFromFailedRequest(dispatch))\n }\n return Promise.resolve()\n }\n}\n\nfunction receiveCountryData(data, json) {\n return {\n type: types.CROSS_BORDER.RECEIVED_COUNTRY_DATA,\n data: json.data,\n receivedAt: Date.now(),\n }\n}\n\n// updates transaction data on the preview page after changing flows\nexport function updateTransactionData({ isPurchase }) {\n return function(dispatch, getState) {\n dispatch(ViewActions.changeIsPurchase(isPurchase))\n const {\n transaction: { hasFetchedFundingOptions, preselectedFundingOption },\n crossBorder: {\n showXBCalculator,\n fromCurrencyCode,\n fromCountryCode,\n toCountryCode,\n toCurrencyCode,\n destinationAmount: amount,\n },\n recipient: { token },\n server: { env },\n } = getState()\n // if we've already fetched funding options, re-fetch to update fees\n if (hasFetchedFundingOptions) {\n if (getFlowType() === 'payRequest') {\n dispatch(PayRequestActions.fetchFundingOptions())\n } else {\n dispatch(SendActions.fetchFundingOptions({ preselectedFundingOption }))\n }\n\n // if we haven't fetched yet, we're on the first half with the 'continue' button\n // in this case, we need to fetch the exchange rate (for xb only)\n // because F&F and G&S rates can be different\n } else if (showXBCalculator && !isV2PricingReq(env)) {\n dispatch(\n ViewActions.fetchOriginAmount({\n fromCurrencyCode,\n fromCountryCode,\n toCountryCode,\n toCurrencyCode,\n isPurchase,\n amount,\n // not actually true but we need to force a loader for the exchange rate\n currencyChanged: true,\n token,\n })\n )\n }\n }\n}\n\nfunction updateRecipientCurrencies({\n recipientCurrencyCode,\n recipientCurrencies,\n recipientCurrencyMap,\n}) {\n return {\n type: types.AMOUNT.UPDATE_RECIPIENT_CURRENCIES,\n data: { recipientCurrencyCode, recipientCurrencies, recipientCurrencyMap },\n }\n}\n\nexport function setDefaultPurchaseProtection(value) {\n return {\n type: types.INSTRUMENTATION.PURCHASE_PROTECTION,\n data: { defaultPurchaseProtection: value },\n }\n}\n\nexport function clearPurchaseProtection() {\n return {\n type: types.INSTRUMENTATION.CLEAR_PURCHASE_PROTECTION,\n data: {},\n }\n}\n\nexport function changedPurchaseProtection(data) {\n return {\n type: types.INSTRUMENTATION.PURCHASE_PROTECTION,\n data,\n }\n}\n\nexport function setContextID(data = {}) {\n return (dispatch, getState) => {\n const { personalContextID, purchaseContextID } = data\n if (personalContextID || purchaseContextID) {\n dispatch({\n type: types.TRANSACTION.SET_SUGGESTED_INSTRUMENT_CONTEXT,\n data: {\n personalContextID,\n purchaseContextID,\n },\n })\n }\n }\n}\n\n/**\n * handle recipient details returned from server\n @ @param {Object} options\n * @param {RecipientDetail} options.recipientDetails - result returned from server\n * @param {FormattedContact} options.contact - the contact that is selected\n * @param {Object} options.analytics - analytics stuff\n * @param {Object} options.store - redux store state\n * @param {Function} options.dispatch - redux dispatch\n * @param {boolean} options.enableContactConfidence - whether to enable recipient confidence or not\n */\nexport function handleRecipientDetails({\n recipientDetails = {},\n contact = {},\n analytics = {},\n store = {},\n dispatch = () => {},\n enableContactConfidence = false,\n}) {\n dispatch({ type: types.CROSS_BORDER.RECEIVED_RECIPIENT_DETAILS }) // Hide spinner\n dispatch({\n type: types.TRANSACTION.CHANGE_HIGHLIGHTED_PAYMENT_TYPE,\n data: { highlightPaymentType: recipientDetails.highlightPaymentType },\n })\n\n if (recipientDetails.paymentTypeSelectionMessage) {\n dispatch({\n type: types.TRANSACTION.UPDATE_PAYMENT_TYPE_SELECTION_MESSAGE,\n data: {\n message: recipientDetails.paymentTypeSelectionMessage,\n },\n })\n }\n\n if (recipientDetails.paymentTypeTogglePersonalMessage) {\n dispatch({\n type: types.TRANSACTION.UPDATE_PAYMENT_TYPE_TOGGLE_PERSONAL_MESSAGE,\n data: {\n message: recipientDetails.paymentTypeTogglePersonalMessage,\n },\n })\n }\n\n if (recipientDetails.paymentTypeTogglePurchaseMessage) {\n dispatch({\n type: types.TRANSACTION.UPDATE_PAYMENT_TYPE_TOGGLE_PURCHASE_MESSAGE,\n data: {\n message: recipientDetails.paymentTypeTogglePurchaseMessage,\n },\n })\n }\n\n if (recipientDetails.isRecipientCurrencyRestricted) {\n dispatch({\n type: types.TRANSACTION.RECIPIENT_CURRENCY_RESTRICTED,\n data: {\n isRecipientCurrencyRestricted:\n recipientDetails.isRecipientCurrencyRestricted,\n },\n })\n }\n\n if (recipientDetails.isNoteRestricted) {\n dispatch({\n type: types.TRANSACTION.NOTE_FIELD_IS_RESTRICTED,\n data: {\n isNoteRestricted: recipientDetails.isNoteRestricted,\n },\n })\n }\n\n dispatch({\n type: types.TRANSACTION.CHANGE_RECOMMENDED_PAYMENT_TYPE,\n data: { recommendedPaymentType: recipientDetails.recommendedPaymentType },\n })\n\n if (\n recipientDetails.paymentTypeTransitions &&\n !_.isEmpty(recipientDetails.paymentTypeTransitions)\n ) {\n dispatch({\n type: types.TRANSACTION.UPDATE_PAYMENT_TYPE_TRANSITIONS,\n data: {\n paymentTypeTransitions: recipientDetails.paymentTypeTransitions,\n },\n })\n }\n\n dispatch(setContextID(recipientDetails))\n\n dispatch({\n type: types.TRANSACTION.CHANGE_IS_HARD_DEFAULT,\n data: { isHardDefault: recipientDetails.isHardDefault },\n })\n\n const { linkName, enableAnalytics, isContact } = analytics\n const {\n recipient,\n suggestedPaymentType,\n paymentTypes,\n recipientCountryIsInferred,\n isUnilateral,\n thumbnailUrl,\n hasNetworkId,\n isRestricted,\n recurringType,\n recipientAccountType,\n mayCashAdvanceFeesApply,\n } = recipientDetails\n const {\n user: { country: senderCountryCode = '' } = {},\n contacts: {\n contacts = [],\n searchedContacts = [],\n hasFetchedContacts = false,\n } = {},\n } = store\n const isGSOnlyRecipient = paymentTypes && !paymentTypes.includes('PERSONAL')\n const isPhone = isPhoneNumberMaybe(recipient)\n\n if (thumbnailUrl) {\n // force client preload recipient profile image\n preloadImage(thumbnailUrl)\n }\n\n // keep track of whether recipient's country supports F&F\n // so we can hide the button to change payment types\n dispatch(\n ViewActions.selectContact(\n { ...contact, isGSOnlyRecipient },\n linkName,\n isContact,\n recipientDetails,\n enableAnalytics\n )\n )\n\n // set sender and recipient currency list\n const data = prepareXBInitialState(recipientDetails, store)\n dispatch(ViewActions.setXBInitialState(data))\n dispatch(updateRecipientCurrencies(recipientDetails))\n\n if (defaultUnilateralRecipientToSenderCountry(senderCountryCode)) {\n dispatch(changeUnilateralCountryCode(senderCountryCode))\n } else if (recipientCountryIsInferred) {\n // autofill the country code for the user based on what we inferred.\n // they can change it if we got it wrong\n // this will also have the effect of always sending the country code\n // even if we're not in the RTR case (and therefore don't require\n // the user provide the country).\n dispatch(changeUnilateralCountryCode(recipientDetails.recipientCountryCode))\n }\n\n const hasSentToRecipient = isContact\n ? getHasSentToContact(contact)\n : getHasSentToRecipient(\n recipient,\n [...contacts, ...searchedContacts],\n hasFetchedContacts\n )\n\n const isConfidentInRecipient =\n !hasContactConfidenceTreatment() ||\n Boolean(\n !enableContactConfidence ||\n getIsConfidentInRecipient(isUnilateral, hasSentToRecipient)\n )\n\n return handleTransactionDetails(\n isConfidentInRecipient,\n getSkipPaymentType(suggestedPaymentType),\n suggestedPaymentType,\n dispatch,\n {\n isUnilateral,\n hasNetworkId,\n isRestricted,\n isPhone,\n isContact,\n recurringType,\n suggestedPaymentType,\n recipientAccountType,\n mayCashAdvanceFeesApply,\n }\n )\n}\n\n/**\n * Handle transaction details from server and surface appropriate overpanels\n * @param {boolean} isConfidentInRecipient - whether sender needs confidence in recipient or not\n * @param {boolean} skipPaymentType - whether to skip payment type choice overpanel or not\n * @param {PayType} suggestedPaymentType - suggested payment type for transaction\n * @param {Function} dispatch - redux dispatch function\n * @param {Object} analytics - object for analytic purpose\n */\nexport function handleTransactionDetails(\n isConfidentInRecipient,\n skipPaymentType,\n suggestedPaymentType,\n dispatch,\n analytics = {}\n) {\n if (isConfidentInRecipient && skipPaymentType) {\n return routeTo(\n `/homepage/${PAYMENT_TYPE_FLOW_MAP[suggestedPaymentType]}/preview`\n )\n }\n\n dispatch(ViewActions.setSuggestedTransactionType(suggestedPaymentType))\n\n if (!isConfidentInRecipient) {\n dispatch(\n toggleContactConfidenceOverpanel({\n show: true,\n analytics: getContactConfidenceAnalyticsData(analytics),\n })\n )\n } else {\n return routeTo(`/homepage/preview`)\n }\n}\n\n/**\n * Determine whether or not to skip payment type selection during send flow\n * @param {PaymentType} suggestedPaymentType - suggested payment type for transaction\n * @returns {boolean} whether or not to skip payment type selection\n */\n\nexport function getSkipPaymentType(suggestedPaymentType) {\n return (\n suggestedPaymentType === PAYMENT_TYPE.PERSONAL ||\n suggestedPaymentType === PAYMENT_TYPE.PURCHASE\n )\n}\n\n/**\n * Called when first entering a flow. Fetches peers from the server via AJAX\n * call and calls {@link receivedContacts} with the response data.\n */\nexport function fetchPeers() {\n return (dispatch, getState) => {\n const {\n contacts: { hasFetchedContacts, hasUpdatedContacts } = {},\n server: { env = '' },\n } = getState()\n // The pisp flow does not require fetching contacts\n // Fetching contacts can potentially cause user to be autologged out\n // if proper scopes are not in place due to being unauthorized\n if (env === ENV_TYPE.PISP) {\n return\n }\n\n if (!hasFetchedContacts || hasUpdatedContacts) {\n fetch('/myaccount/transfer/peers')\n .then(response => {\n dispatch(ViewActions.receivedContacts(response))\n })\n .catch(() => {})\n }\n }\n}\n\nexport function receivedBlockedPeers({ blockedContacts = [] }) {\n return {\n type: types.CONTACTS.RECEIVED_BLOCKED_CONTACTS,\n data: {\n blockedContacts,\n },\n }\n}\n\nexport function fetchBlockedPeers() {\n return (dispatch, getState) => {\n dispatch({ type: types.CONTACTS.LOADING_BLOCKED_CONTACTS })\n\n return fetch('/myaccount/transfer/peers/blocked').then(response => {\n dispatch(receivedBlockedPeers(response))\n })\n }\n}\n\n/**\n * Make post request for performing search or load more\n * @param {Object} data - data (body) of the request\n */\nconst retrievePeers = data => {\n return post('/myaccount/transfer/peers/search', data)\n}\n\n// Get the searchDebounceTime from redux store, use the default value if failed.\nconst getSearchDebounceTime = () => {\n let time = 500\n const { searchDebounceTime } = reduxStore.getState().server\n if (searchDebounceTime && typeof searchDebounceTime === 'number') {\n time = searchDebounceTime\n }\n return time\n}\n\n// use awesomeDebouncePromise to ensure we only handle the response\n// returned from the last request.\nexport const retrievePeersDebounced = awesomeDebouncePromise(\n retrievePeers,\n getSearchDebounceTime()\n)\n\nexport function searchPeers({\n query,\n includeDirect = true,\n includeNonDirect = false,\n isRequestFlow = false,\n isMgm = false,\n} = {}) {\n return dispatch => {\n dispatch({ type: types.PEERS.SEARCHING_PEERS })\n const data = {\n query,\n identifier: isRequestFlow ? PRODUCT_FLOWS.REQUEST : PRODUCT_FLOWS.SEND,\n direct: {\n include: includeDirect,\n },\n nonDirect: {\n include: includeNonDirect,\n },\n bizDirect: {\n include: isBizSearchTreatment() ? includeDirect : false,\n },\n bizNonDirect: {\n include: isBizSearchTreatment() ? includeNonDirect : false,\n },\n }\n const response = retrievePeersDebounced(data)\n response\n .then(res => {\n const yourContacts = res.directContacts ? res.directContacts : []\n const peopleOnPaypal = res.nonDirectContacts\n ? res.nonDirectContacts\n : []\n dispatch(receivedSearchedPeers(res, isMgm))\n dispatch({ type: types.PEERS.RETRIEVED_PEERS })\n trackSearchResultImpression(\n isRequestFlow,\n yourContacts.length,\n peopleOnPaypal.length\n )\n })\n .catch(() => {\n dispatch({ type: types.PEERS.SEARCH_ERROR })\n })\n }\n}\n\n/**\n * Handle returned result of directory search\n * @param {Array} directContacts - search results of direct contacts\n * @param {Array} nonDirectContacts - search results of nondirect contacts\n * @param {number} directTotalPages - Total pages of direct contacts (for pagination)\n * @param {number} nonDirectTotalPages - Total pages of nondirect contacts (for pagination)\n * @returns {Object} action data for contact reducer\n */\nexport function receivedSearchedPeers(\n {\n directContacts = [],\n nonDirectContacts = [],\n nonDirectTotalPages = 0,\n bizDirectContacts = [],\n bizNonDirectContacts = [],\n bizNonDirectTotalPages = 0,\n },\n isMgm\n) {\n // Filter the unilateral contacts for MGM flow (Member Gets Member)\n directContacts = isMgm\n ? directContacts.filter(data => data.isUnilateral)\n : directContacts\n nonDirectContacts = isMgm\n ? nonDirectContacts.filter(data => data.isUnilateral)\n : nonDirectContacts\n bizDirectContacts = isMgm\n ? bizDirectContacts.filter(data => data.isUnilateral)\n : bizDirectContacts\n bizNonDirectContacts = isMgm\n ? bizNonDirectContacts.filter(data => data.isUnilateral)\n : bizNonDirectContacts\n\n return {\n type: types.PEERS.RECEIVED_SEARCHED_PEERS,\n data: {\n directContacts,\n nonDirectContacts,\n nonDirectTotalPages,\n bizDirectContacts,\n bizNonDirectContacts,\n bizNonDirectTotalPages,\n showSearchError: false,\n },\n receivedAt: Date.now(),\n }\n}\n\n/**\n * Handle returned result of load more results (pagination)\n * @param {Array} nonDirectContacts - search results of nondirect contacts\n * @returns {Object} action data for contact reducer\n */\nexport function receivedLoadedPeers({ nonDirectContacts = [] }) {\n return {\n type: types.PEERS.RECEIVED_LOADED_PEERS,\n data: {\n nonDirectContacts,\n showSearchError: false,\n },\n receivedAt: Date.now(),\n }\n}\n\n/**\n * Handle returned result of load more results (pagination)\n * @param {Array} nonDirectContacts - search results of nondirect contacts\n * @returns {Object} action data for contact reducer\n */\nexport function receivedLoadedBusinesses({ bizNonDirectContacts = [] }) {\n return {\n type: types.PEERS.RECEIVED_LOADED_BUSINESSES,\n data: {\n bizNonDirectContacts,\n showSearchError: false,\n },\n receivedAt: Date.now(),\n }\n}\n\nexport function receivedContactActivities({ transactions }, contactId) {\n return {\n type: types.CONTACTS.RECEIVED_CONTACT_DATA,\n data: {\n [contactId]: transactions,\n },\n receivedAt: Date.now(),\n }\n}\n\nexport function fetchContactActivities(contactId) {\n const url = `/myaccount/transfer/peers/${contactId}/activity`\n return (dispatch, getState) => {\n if (getState().contacts.activityData[contactId] || !contactId) {\n return\n }\n fetch(url)\n .then(response => {\n dispatch(receivedContactActivities(response, contactId))\n })\n .catch(ViewActions.handleError(dispatch))\n }\n}\n\n/**\n * Initialize MGM Flow\n */\nexport function initializeMGMFlow(data) {\n return {\n type: types.TRANSACTION.MGM_INIT,\n data,\n }\n}\n\n/**\n * Initialize MGM Flow\n */\nexport function togglePhoneConfirmation(data) {\n return {\n type: types.EXTERNAL.TOGGLE_PHONE_CONFIRMATION,\n data,\n }\n}\n\n/**\n * Initializes MGM Amount to 0.01\n */\n\nexport function initializeMGMAmount() {\n return {\n type: types.TRANSACTION.MGM_CUSTOM_FIELDS,\n }\n}\n\n/**\n * Show MGM Recipient Error\n */\n\nexport function showMgmRecipientError() {\n return {\n type: types.RECIPIENT.MGM_RECIPIENT_ERROR,\n }\n}\n\nexport function toggleEncryptionFailed({ show = false }) {\n return {\n type: types.ERROR.ENCRYPTION_FAILED,\n data: { show },\n }\n}\n\nexport function funnelStarted({ funnel }) {\n return {\n type: types.TRANSACTION.FUNNEL_STARTED,\n data: { funnel },\n }\n}\n\n/**\n - fire contact engaged event 1x per attempt ID\n - fire on the first of either\n a) start typing on search input\n b) click on top contact bubble\n c) amount screen if dropping into the amount screen directly\n */\nexport function contactEngaged() {\n return {\n type: types.TRANSACTION.CONTACT_ENGAGED,\n }\n}\n\nexport function fetchFundingOptionsAndShowFundingOptionsOverpanel() {\n const flowType = getFlowType()\n const fetchFundingOptions =\n flowType === 'payRequest'\n ? PayRequestActions.fetchFundingOptions\n : SendActions.fetchFundingOptions\n\n return (dispatch, getState) => {\n const { preselectedFundingOption } = getState().transaction\n dispatch(\n fetchFundingOptions({\n ...(preselectedFundingOption && { preselectedFundingOption }),\n })\n )\n }\n}\n","import FeaturesConfig from '../../../config/features.json'\n\n/**\n * Determine whether or not should default unilateral recipient country to sender country\n * @param {string} senderCountryCode - sender country code\n * @returns {boolean} whether or not to default unilateral recipient country to sender country\n */\nexport function defaultUnilateralRecipientToSenderCountry(senderCountryCode) {\n const countryFeatures = FeaturesConfig[senderCountryCode] || {}\n\n return Boolean(countryFeatures.defaultUnilateralRecipientCountry)\n}\n","// @flow\n\nimport { findRecipientInContacts, getHasSentToContact } from './contact-utils'\n\n/**\n * Determines if the sender/requestor is confident that they entered the correct recipient\n * @param {boolean} isUnilateral - whether the recipient is unilateral or not\n * @param {boolean} hasSentToRecipient - whether the recipient has been sent to before or not\n * @returns {boolean} whether the sender/requestor is confident that they entered the correct recipient or not\n */\nexport function getIsConfidentInRecipient(\n isUnilateral: boolean,\n hasSentToRecipient: boolean\n) {\n return Boolean(!isUnilateral && hasSentToRecipient)\n}\n\n/**\n * Determine whether the recipient specified has been sent to before by checking contacts or\n * if contacts have not been hydrated yet asynchronously on the client then true. Consumers\n * should be aware that this could result in false-positives if called before client is hydrated\n * @param {string} recipient\n * @param {Array} contacts - formatted contact list\n * @param {boolean} hasFetchedContacts - whether contacts have been hydrated on client yet\n * @returns {boolean} whether or not recipient has been sent to previously\n */\nexport function getHasSentToRecipient(\n recipient: string,\n contacts: Array,\n hasFetchedContacts: boolean\n) {\n if (!hasFetchedContacts) {\n return true\n }\n\n return getHasSentToContact(findRecipientInContacts(recipient, contacts))\n}\n","import * as pxp from '../lib/pxp'\n\nexport function hasContactConfidenceTreatment() {\n return pxp.isTreatment('Trmt_contact_confidence_interstitial')\n}\n"],"sourceRoot":""}